Forum: Compiler & IDEs Setzen von Flag aus IRC klappt nicht


von Martin (Gast)


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
}

von Stefan E. (sternst)


Lesenswert?

Das reti() hat in der ISR nichts zu suchen und sorgt für einen Crash. 
Klar ändert sich speed dann nie, wenn am Ende der ISR immer das ganze 
Programm neu startet.

von Martin (Gast)


Lesenswert?

Super! Dankeschön :)

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.