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
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.
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
Die nächste Firmwareversion ist dann den µC energiesparend schlafen zu legen (Sleep Modus), wenn der minutenlang nix machen muss, und per Taster aufzuwecken.
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.
@ 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
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.
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?
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.