Setzen von Flag aus IRC klappt nicht

Gast #3416200
Lesenswert?

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
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren