Solche grob gerasterten Zählarbeit mache ich gerne mit einem
Countdown-Zähler:
1 | int main (void)
|
2 | {
|
3 | // Hardware initialisieren, inclusive Timer2
|
4 | ioinit ();
|
5 |
|
6 | // Interrupts (IRQs) global erlauben
|
7 | sei();
|
8 |
|
9 | // Zeit vertrödeln bis sich die Spannung stabilisiert hat.
|
10 | // In die Hauptschleife gehört 'wait' oder 'delay' nicht rein!
|
11 | wait_10ms (1);
|
12 |
|
13 | // Blockierfreie Hauptschleife
|
14 | // Weil die LEDs zu Anfang aus sind und die die Countdowns
|
15 | // nach der Initialisierung auf 0 stehen, beginnen die LEDs
|
16 | // sofort mit einem ON-Zyklus.
|
17 | while (1)
|
18 | {
|
19 | // Falls Countdown für LED1 abgelaufen ist,
|
20 | // neu aufziehen auf 1 Sekunde (100ms)
|
21 | // und toggle LED1
|
22 | if (0 == count.ms10.led1)
|
23 | {
|
24 | PIN_LED1 |= (1 << PAD_LED1);
|
25 | count.ms10.led1 = 100;
|
26 | }
|
27 |
|
28 | // Falls Countdown für LED2 abgelaufen ist,
|
29 | // neu aufziehen auf 1.1 Sekunde (110ms)
|
30 | // und toggle LED2
|
31 | if (0 == count.ms10.led2)
|
32 | {
|
33 | PIN_LED2 |= (1 << PAD_LED2);
|
34 | count.ms10.led2 = 110;
|
35 | }
|
36 | } // Hauptschleife
|
37 |
|
38 | // Hier kommen wir nie hin
|
39 | }
|
In den Anwendungen hab ich eh einen 10ms-Interrupt aktiv für Taster
entprellen, DCF77, etc.
Für konkrete Implementierung und Für und Wider siehe
Beitrag "Warten und Verzögern ohne zu Blockieren (avr/delay.h)"
Von den Quellen muss nur countdown.h angepasst werden: dort werden
benötigte countdown-Zähler eingetragen. Es gibt einträge für
Countdown-Zähler im 10ms-, im 1 Sekunden- und im 1 Minuten-Raster
countdown.c muss nicht angepasst werden.