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 | }
|