warum crasht das nur?

Gast #1206577
Lesenswert?

ich habe hier einen sehr seltsamen crash den ich mir nicht erklären 
kann...


jemand ne idee?
1
//dieser code funzt:
2
#define LED_ON(num_)       (PORTB &= ~(1 << (num_)))
3
volatile uint8_t key_state;
4
ISR(TIMER2_OVF_vect)                            
5
{
6
  uint8_t diff, b; b = 0;
7

8
  if(key_state != KEY_PIN){
9
    diff = key_state ^ KEY_PIN;
10
    while(b < 8){
11
      if(diff & (1 << b)){
12
        LED_ON(b);  //HIER!
13
      }
14
    b++;
15
    }    
16
    key_state = KEY_PIN;
17
  }
18
}
19

20
//dieser nicht:
21
#define LED_ON(num_)       (PORTB &= ~(1 << (num_)))
22
volatile uint8_t key_state;
23
ISR(TIMER2_OVF_vect)                            
24
{
25
  uint8_t diff, b; b = 0;
26

27
  if(key_state != KEY_PIN){
28
    diff = key_state ^ KEY_PIN;
29
    while(b < 8){
30
      if(diff & (1 << b++)){
31
        b = b - 1; //HIER!
32
        LED_ON(b); //HIER!
33
      }
34
    }    
35
    key_state = KEY_PIN;
36
  }
37
}
Gast #1206615
Lesenswert?

die schleife sieht eigentlich so aus und das funktioniert auch.
1
while(b < 8)
2
  if(diff & (1 << b++))
3
    was_anderes(b);

das b++ steht im if weil ich es irgendwo hochzählen muss und so is am 
einfachsten.

ist doch das gleiche wie:
1
while(b < 8)
2
  if(diff & (1 << b)){
3
    b++;
4
    was_anderes(b); 
5
  }

oder nicht?
ich bin da nur zufällig draufgestossen und wundere mich.
#1207169
Lesenswert?

jupp wrote:

> das b++ steht im if weil ich es irgendwo hochzählen muss und so is am
> einfachsten.

Am einfachsten ist es immer, wenn Schleifenabbruchbedingung und 
Verändern der Schleifenvariable nicht allzuweit voneinander entfernt 
sind.
1
  for( b = 0; b < 8; ++b )
2
  {
3
    if( diff & ( 1 << b ) )
4
      LED_ON( b );
5
  }

Moral von der Story: Wenn du eine Zählschleife willst, dann schreib auch 
eine Zählschleife. Dafür ist sie da

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