Hallo,
ich betreibe auf einem ATmega32 den Timer1 im CTC-Modus,
so dass ich daraus einen Sekundentakt ableiten kann (nach
AVR - Die genaue Sekunde / RTC ).
1 | #define TIMER_PRESCALER_FREQ 250
|
2 |
|
3 | ISR (TIMER1_COMPA_vect)
|
4 | {
|
5 | #if (F_CPU % TIMER_PRESCALER_FREQ)
|
6 | OCR1A = (F_CPU/CLOCK24_TIMER_PRESCALER_FREQ) - 1;
|
7 | #endif
|
8 |
|
9 | static uint8_t soft_prescaler = 0x0000;
|
10 | if (--soft_prescaler == 0)
|
11 | {
|
12 | #if (F_CPU % TIMER_PRESCALER_FREQ) // handle remainder
|
13 | OCR1A = (F_CPU/TIMER_PRESCALER_FREQ) +
|
14 | (F_CPU%TIMER_PRESCALER_FREQ) - 1;
|
15 | #endif
|
16 | LED_TOGGLE; // LED toggeln
|
17 | // irgendeine HH:MM:SS uhr +1 sekunde zaehlen lassen
|
18 | soft_prescaler = TIMER_PRESCALER_FREQ;
|
19 | }
|
20 | }
|
Das ganze funktioniert auch wunderbar.
Nun moechte ich das Blinken mit einem externen Event synchronisieren, am
einfachsten entprellter Tasterdruck in der main()-loop.
Ich verwende dazu folgenden Code
1 | void timer_sync(void)
|
2 | {
|
3 | cli(); // Ints sperren
|
4 | TCCR1B = (1<<WGM12); // Timer1 stillegen
|
5 | TCNT1 = 0x0000; // Timer1 auf 0 setzen (Hi vor Lo setzen macht der gcc)
|
6 | TCCR1B = (1<<WGM12) | (1<<CS10); // Timer1 in CTC Modus
|
7 | sei(); // Ints enablen
|
8 | }
|
Das Blinken aendert sich aber nicht, sondern ist im gleichen Takt wie
vorher. Der timer_sync()-Aufruf erfolgt auch wirklich unverzoegert nach
dem Event.
Kann mir einer sagen, warum der Timer1 meinen timer_sync()-Aufruf
ignoriert?
Vielen Dank!