Forum: Mikrocontroller und Digitale Elektronik warum crasht das nur?


von jupp (Gast)


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
}

von Michael 9. (michael93) Benutzerseite


Lesenswert?

Hallo,

>       if(diff & (1 << b++)){

was soll denn das b++ in einer if Bedingung?

Michael

von Peter D. (peda)


Lesenswert?

jupp wrote:
> ich habe hier einen sehr seltsamen crash den ich mir nicht erklären
> kann...

Du meinst, warum Deine Endlosschleife endlos läuft?

Weil sich b nicht ändert, sobald die Bedingung wahr ist:

b + 1 - 1 bleibt immer b


Peter

von jupp (Gast)


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.

von jupp (Gast)


Lesenswert?

>Du meinst, warum Deine Endlosschleife endlos läuft?

böse falle =)

danke

von Michael 9. (michael93) Benutzerseite


Lesenswert?

hab mich nur gewundert, warum mann b++ in einem if schreibt. Ist ja wie 
b = b + 1. Ich würde sowas davrsetzen oder so. Weiß nicht ob das den 
Fehler verursachen kann ???

von gast (Gast)


Lesenswert?

> if(diff & (1 << b++))
> [...]
> ist doch das gleiche wie:
> [...]
> if(diff & (1 << b)) {
>    b++;
> [...]


NEIN, ist es nicht. Im letzteren Fall wird b nur erhöht, wenn die 
Bedingung wahr ist!

von Simon K. (simon) Benutzerseite


Lesenswert?

Und deswegen sollte man es auch vermeiden diese unären Operatoren so 
sehr verschachtelt zu verwenden. Das gibt nur Ärger.

von Gast (Gast)


Lesenswert?

Debugger starten und schauen was passiert.

von Karl H. (kbuchegg)


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

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.