Forum: Mikrocontroller und Digitale Elektronik Wohin springt der break?


von Ingo (Gast)


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
    }

von Ingo (Gast)


Lesenswert?

Es fehlt noch ne
1
}

von (prx) A. K. (prx)


Lesenswert?

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

Welche if-Schleife? Ich sehe keine.

von Peter II (Gast)


Lesenswert?

Ingo schrieb:
> if-Schleife

das es keine if-schleife gibt, wird sie auch nicht abgebrochen

http://www.if-schleife.de/

von Technik_Freak (Gast)


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

von Rush (Gast)


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.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

break verlässt die enthaltende Schleife. Da es keine "if-Schleifen" 
gibt, wird hier logischerweise die while - Schleife verlassen.

von Georg G. (df2au)


Lesenswert?

Ein "break" verlässt die darüber liegende for, while, do oder switch 
Konstruktion. "If Schleifen" gibt es nicht.

von Ingo (Gast)


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.

von Ibei (Gast)


Lesenswert?

"Glitches, die sich dieser Kontakt aus mir noch unerklärlichen Gründen 
einfängt"
nennt man auch "prellen"!

von Ingo (Gast)


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 :)

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.