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


von Vince (Gast)


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
}

von Vince (Gast)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.