Probleme mit globalen Interrupts und TOSC2

Gast #1983430
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:
1
/*MAIN.H:*/
2
//LEDs - Ausgänge
3
      #define LED_READY(x)       {if(x > 0){(PORTC |= (1 << (PC7)));}else{(PORTC &= ~(1 << (PC7)));}} //PORTC.7
4
      #define LED_DIODENTEMP(x)     {if(x > 0){(PORTD |= (1 << (PD0)));}else{(PORTD &= ~(1 << (PD0)));}} //PORTD.0
5
      #define LED_WASSERTEMP(x)     {if(x > 0){(PORTD |= (1 << (PD1)));}else{(PORTD &= ~(1 << (PD1)));}} //PORTD.1
6
      #define LED_WASSERDURCHFLUSS(x) {if(x > 0){(PORTD |= (1 << (PD4)));}else{(PORTD &= ~(1 << (PD4)));}} //PORTD.4
7
      #define LED_WASSERDRUCK(x)     {if(x > 0){(PORTD |= (1 << (PD5)));}else{(PORTD &= ~(1 << (PD5)));}} //PORTD.5
8
      #define LED_FGK(x)         {if(x > 0){(PORTD |= (1 << (PD6)));}else{(PORTD &= ~(1 << (PD6)));}} //PORTD.6
9
      #define LED_DEBUG(x)       {if(x > 0){(PORTD |= (1 << (PD7)));}else{(PORTD &= ~(1 << (PD7)));}} //PORTD.7
10

11
    //LEDs - Status:
12
      #define LED_STATUS_READY      ((PORTC & (1 << PC7)) >> PC7)
13
      #define LED_STATUS_DIODENTEMP    ((PORTD & (1 << PD0)) >> PD0)
14
      #define LED_STATUS_WASSERTEMP    ((PORTD & (1 << PD1)) >> PD1)
15
      #define LED_STATUS_WASSERDURCHFLUSS  ((PORTD & (1 << PD4)) >> PD4)
16
      #define LED_STATUS_WASSERDRUCK    ((PORTD & (1 << PD5)) >> PD5)
17
      #define LED_STATUS_FGK        ((PORTD & (1 << PD6)) >> PD6)
18
      #define LED_STATUS_DEBUG      ((PORTD & (1 << PD7)) >> PD7)
19

20

21
/*MAIN.C*/
22
//...
23
Set_LEDStatus(0x01);
24
_delay_ms(1000);
25
Set_LEDStatus(0x00);
26
_delay_ms(1000);
27
Set_LEDStatus(0x01);
28
//...
29

30
void Set_LEDStatus(char status)
31
{
32
  LED_READY((status & 0x01));
33
  LED_DIODENTEMP((status & 0x02));
34
  LED_WASSERTEMP((status & 0x04));
35
  LED_WASSERDURCHFLUSS((status & 0x08));
36
  LED_WASSERDRUCK((status & 0x10));
37
  LED_FGK((status & 0x20));
38
  LED_DEBUG((status & 0x40));
39
}
Gast #1983449
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

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.