Hallo zusammen,
mal wieder was zum Thema Flags setzten aus der Routine des externen
Interrupts. Es funktioniert einfach nicht!
- volatile ist dabei
- ISR wird ausgeführt
Trotzdem ändert die Variable "speed" ihren Wert nicht.
Wer weiß Rat?
Ich habe den Verdacht das die Compiler-Optimierung schuld ist. Aber wie
unterbinde ich das?
1 | #include <avr/io.h>
|
2 | #include <avr/interrupt.h>
|
3 |
|
4 | #define F_CPU 800000
|
5 | #include <util/delay.h>
|
6 |
|
7 | volatile unsigned char speed;
|
8 |
|
9 | ISR(EXT_INT0_vect)
|
10 | {
|
11 | PORTA |= (1<<PA1); //zum Überprüfen ob ISR ausgeführt wird
|
12 | speed = 1;
|
13 | PORTA &= ~(1<<PA1);
|
14 | reti();
|
15 | }
|
16 |
|
17 |
|
18 | int main(void)
|
19 | {
|
20 | DDRA = 0xff;
|
21 | MCUCR |= ((1<<ISC01)|(1<<ISC00)); //The rising edge of INT0 generates an interrupt request.
|
22 | GIMSK |= (1<<INT0); //Enable INT0 Interrupt
|
23 | sei(); //Enable Interrupts
|
24 |
|
25 | unsigned char i;
|
26 |
|
27 | while(1)
|
28 | {
|
29 |
|
30 | //Blink all day long ;)
|
31 | switch(speed)
|
32 | {
|
33 | case 0:
|
34 | PORTA |= (1<<PA0);
|
35 | _delay_ms(200);
|
36 | PORTA &= ~(1<<PA0);
|
37 | _delay_ms(200);
|
38 | break;
|
39 | case 1:
|
40 | for(i=0;i<10;i++)
|
41 | {
|
42 | PORTA |= (1<<PA0);
|
43 | _delay_ms(200);
|
44 | PORTA &= ~(1<<PA0);
|
45 | _delay_ms(200);
|
46 | }
|
47 | break;
|
48 | default:
|
49 | break;
|
50 | }
|
51 | }
|
52 | }
|