Wohin springt der break?

Gast #3238331
Lesenswert?

Verlässt dieser break nach den 50ms tatsächlich die while(1)?
Ich hätte erwartet das die if-Schleife abgebrochen wird!

Stattdessen bleibt das Programm stehen, Interrupts funktionieren nicht 
mehr und die Karre steht...

1
while(1)
2
    {
3
    //////////////////////////////////////////////////////////////////////////
4
    /* Abschlatung */
5
    if(
6
      (PINA & (1<<EIN_TASTER))
7
    ||  (!StartupTimer && (Batterie.ist < BATTERIE_LEER))
8
    ) {
9
      //////////////////////////////////////////////////////////////////////////
10
      // Versuch: Mögliche Kontaktprobleme mit dem Ausschalter zu unterdrücken
11
      _delay_ms(50);
12
      if ( !( PINA & (1<<EIN_TASTER) ) ) break;
13
      //////////////////////////////////////////////////////////////////////////
14
      
15
      LCDBeleuchtungsTimer = HINTERGRUNDBELEUCHTUNGSZEIT;
16
      lcd_command( LCD_CLEAR_DISPLAY );
17
      lcd_setcursor(0,2);
18
      if (Batterie.ist < BATTERIE_LEER){
19
        lcd_string (" Batterie Leer!");
20
      }else{      
21
        lcd_string ("   Bye Bye!!!");
22
      }      
23
      _delay_ms(3000);
24
      Selbsthaltung(AUS);
25
    }
Gast #3238343
Lesenswert?

Hallo,

Du hast bei Dir eine Klammer } vergessen. Dadurch ist dein Programm beim 
Break in den Untiefen des Controllers verschollen.
1
while(1)
2
    {
3
    //////////////////////////////////////////////////////////////////////////
4
    /* Abschlatung */
5
    if(
6
      (PINA & (1<<EIN_TASTER))
7
    ||  (!StartupTimer && (Batterie.ist < BATTERIE_LEER))
8
    ) {
9
      //////////////////////////////////////////////////////////////////////////
10
      // Versuch: Mögliche Kontaktprobleme mit dem Ausschalter zu unterdrücken
11
      _delay_ms(50);
12
      if ( !( PINA & (1<<EIN_TASTER) ) ) break;
13
      //////////////////////////////////////////////////////////////////////////
14
      
15
      LCDBeleuchtungsTimer = HINTERGRUNDBELEUCHTUNGSZEIT;
16
      lcd_command( LCD_CLEAR_DISPLAY );
17
      lcd_setcursor(0,2);
18
      if (Batterie.ist < BATTERIE_LEER){
19
        lcd_string (" Batterie Leer!");
20
      }else{      
21
        lcd_string ("   Bye Bye!!!");
22
      }      
23
      _delay_ms(3000);
24
      Selbsthaltung(AUS);
25
    }
26
  } //Wenn deine Befehle zusammengehören, dann ist hiermit die While-Schleife abgeschlossen und der Break sorgt nicht zum Verlassen der Schleife
Gast #3238349
Lesenswert?

Interessant wäre zu wissen, was ausserhalb der while-Schleife passiert.
Grundsätzlich find ich es nicht so gut was Du hier machst. Schreibe mal 
eine eigene Entprellungsroutine für den Taster. Beispiele gibt es hier 
zu Hauf.
Das ist kein guter Programmierstil. Du baust Dir mehr Fehler ein als Dir 
lieb ist.
Gast #3238465
Lesenswert?

Das ist ein ganz mieser Programmierstil. Das Delay soll nicht 
entprellen, sondern Glitches, die sich dieser Kontakt aus mir noch 
unerklärlichen Gründen einfängt unterdrücken. Was ich anstatt des breaks 
eigentlich suchte war das continue, was auch funktioniert.
Gast #3238483
Lesenswert?

Nein, der Kontakt löst selbständig aus, sobald ich das Gerät ans Netz 
hänge und es seinen Akku aufläd. Vermutlich sind die Stoßströme in den 
Ladeelko so groß, dass sich dieser Kontakt was einfängt, da dieses 
Phänomen nur bei relativ leerer Batterie auftritt. Leider habe ich kein 
Oszi zu hand. Ich werde vermutlich demnächst den Eingang etwas robuster 
machen, solange löse ich das Problem in Software :)

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