Forum: Mikrocontroller und Digitale Elektronik Abbruch einer Warteschleife


von ich (Gast)


Lesenswert?

Hallo, ich wollte hier nur kurz eine Frage stellen.

Angenommen man hat einen Countdownzähler, der in C mit Hilfe einer 
While/For-Schleife realisiert ist. Also jede Sekunde wird eine Variable 
um 1 erniedrigt bis sie 0 ist. Dann wird die Schleife beendet. Wie macht 
man am Besten einen Abbruch-Taster da mit rein. Ich hab es jetzt so 
gelöst, dass in der Schleife eine Zweite ist, die von 20 runterzählt und 
in jedem Durchlauf 50ms wartet und den Eingang abfragt. 20*50ms sind 1 
Sekunde und dann wird die Hauptvariable um 1 erniedrigt.
Aber wie mein Ausbilder immer gesagt hat, mir kommt das so vor, wie von 
hinten durch die Brust ins Auge.

Also nochmal kurz. Wie implementiere ich am besten einen Abbruchtaster 
in eine Warteschleife von mehreren Minuten, der jedoch auch bei einem 
sehr kurzen Tasten abbricht.

Vielen Dank für jede Hilfe

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Da gibt es tausend Wege.

z.B. Taster in einem Interrupt (Timer, externer Interrupt...) abfragen 
und bei gedrücktem Taster ein globales, volatile Flag setzen. Dann in 
den Warteschleifen zusätzlich zur Schleifenvariable das Flag prüfen. 
Schleifenvariable >= Wartezeit oder Flag gesetzt beenden die Schleife.

von Düsendieb (Gast)


Lesenswert?

Als ausgesprochener Warteschleifenfeind sage ich: In der Timerroutine 
wird eine Variable runtergezählt und im Hauptprogramm abgefragt.


if(Variable==0 oder Abbruchtaster) mach was;

Axel

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Die nächste Firmwareversion ist dann den µC energiesparend schlafen zu 
legen (Sleep Modus), wenn der minutenlang nix machen muss, und per 
Taster aufzuwecken.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

ich schrieb:
> Aber wie mein Ausbilder immer gesagt hat, mir kommt das so vor, wie von
> hinten durch die Brust ins Auge.
Damit hat er wohl das gemeint:
> und in jedem Durchlauf 50ms wartet

Mit "Warten" verplemperst du nur Rechenzeit, die du evtl. für was 
anderes (z.B. die Tastenabfrage) besser brauchen könntest.

Besser, du setzt dir einen Timerinterrupt (z.B. 10ms), der die Zeit 
herunterzählt. Dann setzt du die Zeit auf 100 und frägst in der 
Hauptschleife danach dauernd den Zählerwert des Timers und gleich danach 
die Taste ab.

von Falk B. (falk)


Lesenswert?

@  ich (Gast)

>Also nochmal kurz. Wie implementiere ich am besten einen Abbruchtaster
>in eine Warteschleife von mehreren Minuten, der jedoch auch bei einem
>sehr kurzen Tasten abbricht.

So wie du es beschrieben hast. Auf einem Mikrocontroller wartet man 
nicht mehrere Minuten am Stück, nicht mal 100ms. Siehe Multitasking.

MFG
Falk

von Timmo H. (masterfx)


Lesenswert?

Wenn der TO dennoch eine while oder for-schleife unterbrechen will, kann 
man das auch mit break; machen.

Also z.B. so:
1
while(time--){
2
  foo();
3
  delay_ms(100); //oder was weiß ich
4
  if(PIND & (1<<PD1)) //wenn PD1 = High
5
    break;  //schleife verlassen
6
}

aber wie die anderen ja schon sagten macht es wenig sinn sowas in einer 
"Endlos"-Schleife zu machen.

von ich (Gast)


Lesenswert?

Alles klar, dann werde ich das nochmal mit dem Timer schreiben. Musste 
erstmal fertig werden und weil abgesehen vom Warten und Taste abfragen 
nur kurz was gerechnet werden muss, war es auch nicht so kritisch.

Soll ich den Timer dann lieber 100ms warten lassen und öfters wieder 
anwerfen oder soll ich den Teiler so hochstellen, wie es geht um evtl. 
500ms oder sogar 1000ms zu warten?

von Karl H. (kbuchegg)


Lesenswert?

ich schrieb:

> Soll ich den Timer dann lieber 100ms warten lassen und öfters wieder
> anwerfen oder soll ich den Teiler so hochstellen, wie es geht um evtl.
> 500ms oder sogar 1000ms zu warten?

Das kann man nicht so pauschal sagen.
Es hängt z.B. davon ab, ob es in deinem Programm weiteren Bedarf für 
eine Zeitbasis gibt. Dann wählt man die Interrupt-Zeit so, dass alle 
Zeitbasen einen gemeinsamen Nenner haben, von dem man alle anderen Zeit 
ableiten kann.

Es kann aber auch sein, dass man die Zeitbasis so wählt, dass man für 
die eigentliche 'Stoppuhr' (denn genau das baust du ja letzten Endes) zb 
mit einem Datentyp von uint8_t (also einem 8 Bit Zähler) durchkommt.

Es hängt eben immer auch von der Anwendung ab, welche Zeitbasis sinnvoll 
ist.

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Das hängt vom Programm bzw. Projekt ab.

Beispiel #1: hh:mm LCD-Uhr mit Thermometer

Die Uhrzeit ändert sich nur alle Minute und braucht auch nur beim 
Wechsel der Minutenstelle angezeigt zu werden (LCD ist persitent). Aber 
die Temperatur willst du "sofort" haben. Dann könnte dein Timer auf 1 
Minute stehen und alle Min. die Uhrzeit hochzählen. Dein Hauptprogramm 
würde ständig die Temperatur messen und anzeigen.

Beispiel #2: hh:mm Siebensegment-Uhr mit Thermometer

Hier wird die vierstellige Siebensegment-Anzeige i.d.R. im 
Multiplex-Verfahren betrieben. Jetzt darf der Timer nicht im Minutentakt 
arbeiten, sondern soll das Multiplexing übernehmen. Und das wären ca. 
25x jede Stelle der Anzeige pro Sekunde, also rund 100 Hz, d.h. 10ms ist 
ein praktikabler Wert. Mit den 10ms kann der Timer aber die Minuten auch 
gleich mitzählen.

von ich (Gast)


Lesenswert?

ok alles klar, das hab ich jetzt auch verstanden.

Vielen dank für die Hilfe

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.