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.
Hallo, - interner Oszillator - Uhrenquarz an XTAL1/2 check mal im Datenblatt wo der Uhrenquarz angeschlossen wird !!!!! Gruß Holger
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
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
ups, sorry falschen uC erwischt. - Uhrenquarz an XTAL1/2 ! Gruß Holger
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.