Gast
#3150686
Hallo,
seit ein paar Tagen schon versuche ich, den ATmega168 mit asynchronem
Timer zu betreiben. Dazu gibt es hier auch einige gute Artikel. Nur
scheint das in meinem Fall nicht zu funktionieren.
Das Setup:
- interner Oszillator
- Uhrenquarz an XTAL1/2
- Timer2 läuft im CTC-Modus und soll den Pin OC2B toggeln
- die Interrupts dieses Timers werden nicht genutzt
Der betreffende Abschnitt aus der Software:
(1) ASSR = (1<<AS2); // Asynchronous Timer/Counter2
(2) _delay_ms(1000); // Einschwingzeit des 32kHz Quarzes
(3) TCCR2A = (1<<COM2B0) | (1<<WGM21); // CTC Mode, Toggle OC2B
(4) TCCR2B = (1<<CS22) | (1<<CS21); // Prescaler 256
(5) OCR2B = 200; // OC Register setzen
(6) while (ASSR & ((1<<OCR2BUB)|(1<<TCR2AUB)|(1<<TCR2BUB))); //warten
(7) TIFR2 = (1<<OCF2B) | (1<<OCF2A) | (1<<TOV2); // Flags löschen
Folgendes kann mit Oszilloskop und Debugger beobachtet werden:
- Es wurden Breakpoints in Zeile (5) und (7) gesetzt.
- (5): Der Uhrenquarz schwingt, und Pin OC2B toggelt
(nur mit Prescaler, da OCR2B noch null)
- (7): Nun wurde OCR2B gesetzt, was dazu führt, dass der Uhrenquarz
zwar weiter schwingt, der Pin OC2B aber nicht mehr toggelt.
- Der Timer TCNT2 ist null und ändert seinen Wert fortan nicht mehr.
Nun die Frage:
Was mache ich hier falsch? Ja, die Aufgabe könnte man auch mit dem
PWM-Mode machen, ich will aber verstehen, was hier im CTC-Mode
schief läuft.
Besten Dank.