Ich würde die Sache trotzdem immer noch umdrehen, wie es weiter oben
schon mal angesprochen wurde.
Anstatt den Zähler hochzählen zu lassen, würde ich ihn von
einem Startwert bis auf 0 herunterzählen lassen. Auf lange Sicht
gesehen funktioniert das meist besser unter anderem auch deshalb,
weil dann Änderungen im Zielwert leichter (mit weniger Code)
durchführbar sind, wenn im Zähler immer die Anzahl der noch
ausständigen Schritte enthalten ist. Auch ist das Beenden
der ganzen Zählerei (Notstop) einfacher möglich: Einfach den
Zähler auf 0 setzen und gut ists (Alles klar: Ein Notaus
sollte immer mit Hardware realisiert werden, es schadet aber
nichts, wenn die Software dafür auch eine einfache Möglichkeit
hat).
1 | uint16_t StepsLeft;
|
2 |
|
3 | ISR( .... )
|
4 | {
|
5 | if( StepsLeft > 0 ) {
|
6 | ... Hardwareschritt ausführen
|
7 | StepsLeft--;
|
8 | }
|
9 | }
|
10 |
|
11 | int main()
|
12 | {
|
13 | ....
|
14 |
|
15 | while( 1 ) {
|
16 | if( PINxx & ( 1 << irgendwas ) ) { // das Polling der Taste
|
17 | cli();
|
18 | StepsLeft = 10000;
|
19 | sei();
|
20 | }
|
21 |
|
22 | if( PINxx & ( 1 << irgendwasanderes ) ) { // Polling der 2.ten Taste
|
23 | cli();
|
24 | StepsLeft = 3000;
|
25 | sei();
|
26 | }
|
27 |
|
28 | if( PINxx & ( 1 << nochwasanderes ) ) { // sofort abschalten
|
29 | cli();
|
30 | StepsLeft = 0;
|
31 | sei();
|
32 | }
|
33 | }
|
34 | }
|
Zum Thema Tasten-polling:
Keine gute Idee. Taster sind notorische Preller. Die Entprellroutine
von PeDa (Artikelsuche benutzen) ist die Ideallösung für die
Auswertung von Tasten. Was anderes braucht man nicht um eine 100%
funktionierende, zufriedenstellende, problemlose Lösung zu bekommen.