www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Abbruch einer Warteschleife


Autor: ich (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Düsendieb (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Timmo H. (masterfx)
Datum:

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

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

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

Autor: ich (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: ich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok alles klar, das hab ich jetzt auch verstanden.

Vielen dank für die Hilfe

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.