Wenn du eine konstante Zeitbasis haben willst, ist ein Timer im
CTC-Modus genau das richtige.
Der Timer muss im CTC-Modus sein
Der Compare-Match-A-Interrupt muss aktiv sein
Der Prescaler und Compare-Registe-A-Register muss richtig eingestellt
sein
1 | * Sample for Clear Timer on Compare Match (CTC) mode:
|
2 | *
|
3 | * /- Clock /- Timer/Counter Compare Match A
|
4 | * | |
|
5 | * V V
|
6 | * 16 MHz / ( 64 * ( 249 + 1 ) ) = 1 kHz = 1 (ms)^-1
|
7 | * ^ ^
|
8 | * | |
|
9 | * Prescaler -/ \- Compare Register A
|
10 | *
|
11 | * 16 MHz / ( 64 * ( 24 + 1 ) ) = 10 kHz = 0.1 (ms)^-1
|
12 | * 16 MHz / ( 64 * ( 249 + 1 ) ) = 1 kHz = 1 (ms)^-1
|
13 | * 16 MHz / ( 1024 * ( 124 + 1 ) ) = 125 Hz = 8 (ms)^-1
|
für einen Interrupt alle 0,001 Sekunden (1ms) also:
1 | OCR2 = 249;
|
2 | TCCR2 = ((0 << FOC2) | (0 << WGM20) | (0 << COM21) | (0 << COM20) | (1 << WGM21) | (1 << CS22) | (0 << CS21) | (0 << CS20));
|
3 | TIMSK = ((1 << OCIE2) | (0 << TOIE2) | (0 << TICIE1) | (0 << OCIE1A) | (0 << OCIE1B) | (0 << TOIE1) | (0 << OCIE0) | (0 << TOIE0));//Interrupts für Timer 0, 1 und 2
|
Genau 0,01 Sekunden ist leider nicht möglich, musst du in der ISR immer
bis 10 Zählen.