Manfred W. schrieb:
> Bräuchte mal wieder einen Tip.
>
> Ich möchte gerne eine Variable nach einer bestimmten Zeit (10 sek) auf 1
> setzen.
> Das ganze soll jedoch im Hintergrund laufen.
Klarer Fall für einen Timer mit einer zugehörigen ISR.
> Der Zähler soll jedoch immer auf 0 gesetzt werden sobald eine Taste oder
> ein Drehgeber betätigt wird.
Ja, kann man machen.
> Kann ich das mit einer IF-Abfrage machen?
>
> if(timer != 0)
wo kommt die Variable 'timer' her?
> {
> ntimer++;
> while(ntimer < 100)
No. while Schleife willst du da überhaupt nicht haben. Dazu hast du ja
eine ISR, die regelmässig aufgerufen wird. WEnn die ISR zu oft
aufgerufen wird (zb alle 1 Sekunde), kann man immer noch in der ISR
einen Zähler mitführen und erst beim 10.ten Aufruf das gewünschte tun.
Dann hat man ebenfalls eine Verzögerung von 10 Sekunden.
> Mir ist jedoch noch nicht klar welchen Interrupt ich dafür nehmen soll.
Der mit dem du eine ISR Aufruffrequenz bekommst, mit der du gut rechnen
kannst.
>
> Kann ich das in ein ISR(TIMER0_OVF_vect) stecken?
Sicher kannst du.
Du musst nur ausrechnen bzw. den Timer so einstellen, dass die ISR
entsprechend oft und möglichst mit einem für dich brauchbaren Zeitraster
aufgerufen wird.
Hinweis: das werden nicht 10 Sekunden sein, sondern schneller. Aber das
ist ja kein Problem. Auch mit einer Uhr auf der nur 1 Sekundenzeiger
ist, kann man schliesslich 1 Minute abzählen. Man muss nur 60
Sekundenticks abwarten. Und genau das gleiche kann man auch mit einer
Timer-ISR machen
1 | volatile uint8_t timeCount;
|
2 |
|
3 | ISR( TIMER0_OVF_vect )
|
4 | {
|
5 | if( timeCount > 0 ) {
|
6 | timeCount--;
|
7 |
|
8 | if( timeCount == 0 )
|
9 | mache was auch immer zu machen ist
|
10 | }
|
11 | }
|
setzt du die Variable timeCount auf einen Wert ungleich 0, so wird diese
variable bei jedem Aufruf der ISR um 1 heruntergezählt. Nach
entsprechend vielen Aufrufen wird die irgendwann zu 0 und wenn das der
Fall ist, löst dann die ISR die Aktion aus.
Wird die ISR jede Sekunde aufgerufen und setzt du timeCount auf 10, dann
erfolgt die Aktion daher 10 Sekunden nachdem du timeCount auf 10 gesetzt
hast. timeCount arbeitet also wie ein Küchentimer, den man auf eine Zeit
einstellt und der langsam bis auf 0 zurückzählt, ehe die Glocke bimmelt
und anzeigt, dass die Eier fertig sind.
Und das alles im Hintergrund und ohne das sich die Hauptschleife darum
kümmern müsste.