Hallo,
ich möchte einen Timer1 in der selben Routine zwischen CTC und PWM
umschalten (einmal Tonausgabe, das andere Mal Sprachausgabe über PCM),
das Sonderbare: sobald der Timer PWM hat, lässt er sich nicht mehr auf
CTC umkonfigurieren - habe ich im Datenblatt etwas überlesen?
Tccr1a = &B10100001 'Pin D5, OC1A, nicht invertiert, 8-Bit-...
15
Tccr1b = &B00001001 '...Fast-PWM, Timer1 ohne Vorteilung
16
Waitms 300
17
Loop
Wenn ich die beiden Zeilen
Tccr1a = &B10100001 'Pin D5, OC1A, nicht invertiert,
8-Bit-...
Tccr1b = &B00001001 '...Fast-PWM, Timer1 ohne Vorteilung
auskommentiere, peepst es am Piezoausgang D.5 jeweils für 300ms, ist
also alles in Ordnung.
Wenn ich umschalte, beepst es genau beim ersten Durchlaufen der
Schleife, dann nie wieder bzw. erst ca. 1 Minute später?! Was ist da
los?
Daniel schrieb:> Versuch mal ein Timer Reset bevor du auf den anderen Modus wechselst.
Hi,
danke - nur wie kann ich den Timer reseten?
Hab jetzt nochmals alles im Datenblatt durchgesehen, das bleibt mir ein
Rätsel, außer einem kurzen rhytmischen Knacken und in unregelmäßigen
Abständen ein Beepserl kommt nichts aus dem Lautsprecher.
Wenn ich den Prozessor resete, wieder kurzer Startton vom CTC (976,6
Hertz), das wars dann.
Ich find nix im Datenblatt - werd in letzter Konsequenz einmal den
Prozessor tauschen - hat irgendwer noch eine Idee?
Welcher Dutycycle? OCR1A und OCR1B sind sind auf Default, also 0, nehm
ich an, da nicht explizit gesetzt. In Verbindung mit non-inverted Mode
bei Fast PWM artet das in folgendes Verhalten aus:
If the OCRnx is set equal to BOTTOM (0x0000) the out-
put will be a narrow spike for each TOP+1 timer clock cycle.
Edit: Timer resetet man, indem man den TCNTx Wert einfach auf 0
zurücksetzt. Ist bei dir nicht notwendig, da du im CTC Modus bis 3
zählst, im Fast PWM bis 255 (0xff TOP). Der Fall, das beim
Modusumschalten der TCNTx Wert höher als der neue TOP ist kann somit
nicht eintreten.
Ja, schon - aber warum schaltet der nicht wieder auf CTC zurück, der
sollte dann wieder ganz normal ausgeben - ich vermute jetzt, dass das
nicht sauber funktioniert - also es scheint nicht möglich zu sein, den
Timer vom PWM auf CTC im laufenden Betrieb umzuschalten...
Halte den Timer auch vor der Umstellung auf CTC mal an. Dann aber TCNTx
auf 0 zurücksetzen.
Mir ist nicht klar, warum du den Timer auf PWM schaltest, wenn du dann
erst wieder mit waitms verzögerst um wieder auf CTC zu schalten.
Invertierender PWM oder nicht, die entsprechenden Pins sind gar nicht
auf Output gesetzt. Die OCR Register sind ja auch wie gesagt anscheinend
auf 0.
Christopher G. schrieb:> Halte den Timer auch vor der Umstellung auf CTC mal an. Dann aber TCNTx> auf 0 zurücksetzen.
BINGO - Super, das wars - vielen Dank!!!
Tccr1a = &B10100001 'Pin D5, OC1A, nicht invertiert, 8-Bit-...
17
Tccr1b = &B00001001 '...Fast-PWM, Timer1 ohne Vorteilung
18
Waitms 300
19
Tccr1a = 0 'WICHTIG
20
Tccr1b = 0 'WICHTIG
21
Tcnt1h = 0 'AUCH WICHTIG
22
Tcnt1l = 0 'AUCH WICHTIG
23
Loop
> Mir ist nicht klar, warum du den Timer auf PWM schaltest, wenn du dann> erst wieder mit waitms verzögerst um wieder auf CTC zu schalten.
Das war ja nur das Testprogramm, weil es im eigentlichen Programm
(Sprachausgabe am Telefon mit PCM und dann wieder Signaltöne mit CTC)
nicht funktioniert hat
> Invertierender PWM oder nicht, die entsprechenden Pins sind gar nicht> auf Output gesetzt. Die OCR Register sind ja auch wie gesagt anscheinend> auf 0.
Nein, das passt schon - D5, OC1A ist mit DDRD.5=1 eingeschaltet, OC1B
hab ich nur zum Testen dazugeschaltet - wird nicht benötigt.
Super aber jetzt gehts, man muss verdammt aufpassen beim Umschalten vor
allem des Prescalers, wenn der Counter weiter läuft..