www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Probleme mit globalen Interrupts und TOSC2


Autor: Vince (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

ich programmiere gerade einen Atmel AVR ATmega 644P und habe folgendes 
Problem:

Ich habe einen Interrupt am PIND.3, welcher durch einen Taster ausgelöst 
wird. Die Interruptroutine soll nun einige Ausgänge, darunter der 
PORTD.7 auf High, nach 1s wieder auf Low und wieder nach 1s auf High 
setzen.

Ich habe für diese Aufgabe eine Funktion geschrieben, welche das für 
mich macht, so dass ich das gewünschte Verhalten auch ohne den Interrupt 
auslösen zu müssen z.B. in der main() aufrufen kann.

Das lustige an der ganzen Geschichte und gleichzeitig auch mein Problem 
ist:

Wenn ich die globalen Interruputs eingeschaltet habe, schaltet die 
Funktion den PORTD.0 auf High, anstatt den PORTD.7.
Bei ausgeschalteten Interrupts funktionierts tadellos.. Ich habe keine 
Ahnung womit das zusammenhängt.
Könnt Ihr mir da Helfen?
Hier noch die wichtigen auszüge meines Codes:
/*MAIN.H:*/
//LEDs - Ausgänge
      #define LED_READY(x)       {if(x > 0){(PORTC |= (1 << (PC7)));}else{(PORTC &= ~(1 << (PC7)));}} //PORTC.7
      #define LED_DIODENTEMP(x)     {if(x > 0){(PORTD |= (1 << (PD0)));}else{(PORTD &= ~(1 << (PD0)));}} //PORTD.0
      #define LED_WASSERTEMP(x)     {if(x > 0){(PORTD |= (1 << (PD1)));}else{(PORTD &= ~(1 << (PD1)));}} //PORTD.1
      #define LED_WASSERDURCHFLUSS(x) {if(x > 0){(PORTD |= (1 << (PD4)));}else{(PORTD &= ~(1 << (PD4)));}} //PORTD.4
      #define LED_WASSERDRUCK(x)     {if(x > 0){(PORTD |= (1 << (PD5)));}else{(PORTD &= ~(1 << (PD5)));}} //PORTD.5
      #define LED_FGK(x)         {if(x > 0){(PORTD |= (1 << (PD6)));}else{(PORTD &= ~(1 << (PD6)));}} //PORTD.6
      #define LED_DEBUG(x)       {if(x > 0){(PORTD |= (1 << (PD7)));}else{(PORTD &= ~(1 << (PD7)));}} //PORTD.7

    //LEDs - Status:
      #define LED_STATUS_READY      ((PORTC & (1 << PC7)) >> PC7)
      #define LED_STATUS_DIODENTEMP    ((PORTD & (1 << PD0)) >> PD0)
      #define LED_STATUS_WASSERTEMP    ((PORTD & (1 << PD1)) >> PD1)
      #define LED_STATUS_WASSERDURCHFLUSS  ((PORTD & (1 << PD4)) >> PD4)
      #define LED_STATUS_WASSERDRUCK    ((PORTD & (1 << PD5)) >> PD5)
      #define LED_STATUS_FGK        ((PORTD & (1 << PD6)) >> PD6)
      #define LED_STATUS_DEBUG      ((PORTD & (1 << PD7)) >> PD7)


/*MAIN.C*/
//...
Set_LEDStatus(0x01);
_delay_ms(1000);
Set_LEDStatus(0x00);
_delay_ms(1000);
Set_LEDStatus(0x01);
//...

void Set_LEDStatus(char status)
{
  LED_READY((status & 0x01));
  LED_DIODENTEMP((status & 0x02));
  LED_WASSERTEMP((status & 0x04));
  LED_WASSERDURCHFLUSS((status & 0x08));
  LED_WASSERDRUCK((status & 0x10));
  LED_FGK((status & 0x20));
  LED_DEBUG((status & 0x40));
}

Autor: Vince (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ach so, kleines Update..
Bei dem 644P liegt auf dem PORTD.7 der Anschluss TOSC2. Ich habe die 
Fusebits so gesetzt, das ich einen Ceramicresonator mit 16MHz betreiben 
kann.
--> HIGH = 0xD9
--> LOW  = 0xC6
Ich vermute, das mein Problem evtl. damit zusammen hängen könnte.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.