Auf einem tiny2313a will ich einen Timer laufen lassen. Bei Tastendruck
(IRQ) soll der Timer starten und dann Minuten zählen. Ist eine bestimmte
Zeit verstrichen, soll ein Pin geschaltet werden. Läuft der Timer nicht,
soll eine andere Routine ggf. ebenfalls den Pin schalten.
Hier ein Auszug aus dem Code (ich hoffe, ich habe nicht zu viel gekürzt
- damit es übersichtlich bleibt):
1 | ISR (INT0_vect)
|
2 | {
|
3 | minutes = 0;
|
4 | half_seconds = 0;
|
5 | TCCR1B |= (1 << CS11);
|
6 | PORTD |= (1 << PD0);
|
7 | }
|
8 |
|
9 | ISR (TIMER1_CAPT_vect)
|
10 | {
|
11 | half_seconds++;
|
12 | if (half_seconds == 120)
|
13 | {
|
14 | minutes++;
|
15 | half_seconds = 0;
|
16 | }
|
17 | }
|
18 |
|
19 | main()
|
20 | {
|
21 | while (1)
|
22 | {
|
23 | if (TCCR1B & (1 << CS11))
|
24 | {
|
25 | if (minutes >= 2)
|
26 | {
|
27 | TCCR1B &= ~(1 << CS11);
|
28 | PORTD &= ~(1 << PD0);
|
29 | }
|
30 | }
|
31 | else
|
32 | {
|
33 | _delay_ms(5000); // *1*
|
34 | PORTD &= ~(1 << PD0); // *2*
|
35 | }
|
36 | }
|
37 | }
|
Wenn ich die Zeile 1 auskommentiere, klappt es. Andernfalls wird 2
ausgeführt, selbst wenn gar nicht in diesen else-Zweig gewechselt werden
dürfte, weil der Timer noch läuft (CS11 gesetzt). Auch wenn ich die
Befehle in 1 und 2 vertausche funktioniert es.
Das raubt mir schon seit Stunden den Verstand - so blind kann ich doch
gar nicht sein!?