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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.