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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.