Forum: Mikrocontroller und Digitale Elektronik ATmega168 mit asynchronem Timer 2


von Sören (Gast)


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.

von Holger S. (223rem)


Lesenswert?

Hallo,


- interner Oszillator
- Uhrenquarz an XTAL1/2


check mal im Datenblatt wo der Uhrenquarz angeschlossen wird !!!!!

Gruß Holger

von Oliver (Gast)


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

von spess53 (Gast)


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

von Holger S. (223rem)


Lesenswert?

ups, sorry falschen uC erwischt.
- Uhrenquarz an XTAL1/2 !

Gruß Holger

von Sören (Gast)


Lesenswert?

Hallo zusammen,

besten Dank für die Hinweise!

Wenn ich OC2A und OC2B auf den gleichen Wert setze, ist das Problem 
behoben: Der Timer läuft und Pin OC2B toggelt.

Schöne Grüße
Sören

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.