Hallo zusammen,
ich möchte auf einem ATmega328p mit Timer2 einen Sekundentakt erzeugen.
Meine Überlegung dazu:
Taktfrequenz 16 MHz
Prescaler 1024 => 15625 Hz
Per Output Compare bis 125 zählen lassen => 125 Hz
mit eigenem Zähler nach 125 Interrupts => 1 Hz
wenn bis hierher schon ein Denkfehler drinnen ist, geh ich mich schämen,
und ihr brauchts den Code gar nicht mehr ansehen.
Wenn nicht: bitte um weitere Denkfehler-Analyse:
Setup des Timers:
1 | TCCR2A = _BV(WGM21); // Mode 2: CTC
|
2 | TCCR2B = _BV(CS22) | _BV(CS21) || _BV(CS20); // prescaler 1024
|
3 | OCR2A = 125; // Output Compare A
|
4 | TIMSK2 = _BV(OCIE2A); // Enable Output Compare A
|
die ISR:
1 | static volatile uint16_t tack;
|
2 | // Timer 2 output compare handler
|
3 | ISR(TIMER2_COMPA_vect)
|
4 | {
|
5 | if (++tack > 125) {
|
6 | tack = 0;
|
7 | PORTC ^= _BV(3); // blink
|
8 | }
|
9 | }
|
Damit blinkt die LED nciht mehr sichtbar, also viel zu schnell. Wenn ich
den vergleich ändere in
Dann seh ich sie blinken, immer noch zu schnell (schwer zu sagen um
wieviel zu schnell)
Wo ist mein Denkfehler?
Danke, Michi (der heute schon seit 3 uhr früh arbeitet, daran wirds wohl
liegen...)