ATmega168 mit asynchronem Timer 2

Gast #3150686
Lesenswert?

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.
Gast #3150711
Lesenswert?

Sören schrieb:
> Der Timer TCNT2 ist null und ändert seinen Wert fortan nicht mehr.

Nun ja, wenn das da oben wirklich der ganze Code ist, dann ist das so 
richtig. Beim CTC-Mode definiert OCRA Timer-Top, da du das aber nigends 
setzt, wird das wohl 0 sein. Solange OCRB auch Null ist toggelt der Pin, 
aber OCRB=200 erreicht der halt nie.

Oliver
Gast #3150712
Lesenswert?

Hi

>- Uhrenquarz an XTAL1/2

Sicher?

>(5)    OCR2B = 200;                        // OC Register setzen

Du hast vergessen, OCR2A zu setzen. Damit wird damit wird der Topwert 
(Zählumfang) bei CTC bestimmt. Da der Defaultwert (nach RESET) von OCR2A 
Null ist und du OCR2B mit 200 lädst kann es nie zu einem Compareereignis 
kommen.

MfG Spess

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren