Abbruch einer Warteschleife

Gast #1966146
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
Moderator (Firma: Titel) Persönliche Seite #1966160
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.
#1966164
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
#1966183
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.
Gast #1966189
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?
#1966199
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.
Persönliche Seite #1966210
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.

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