Forum: Mikrocontroller und Digitale Elektronik Timer 1 zwischen CTC und PWM umschalten


von Manfred S. (Firma: Manfred) (xfred343)


Lesenswert?

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?
1
$regfile = "m644def.dat"                                    'ATmeg644$crystal = 8000000        
2
Ddrd.5 = 1                                                  'OC1A
3
Tccr1c = 0
4
Do
5
     Tccr1a = &B01010000         'CTC Pin D5, OC1A, CTC-Mode
6
     Tccr1b = &B00011101
7
     Tccr1c = 0                  'Prescaler 1024, IC1 Mode
8
     Icr1h = 0
9
     Icr1l = 3
10
     Ddrd.5 = 1
11
     Waitms 300
12
     Tccr1a = 0
13
     Tccr1b = 0
14
     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?

von Daniel (Gast)


Lesenswert?

Versuch mal ein Timer Reset bevor du auf den anderen Modus wechselst.

Gruß Daniel

von Manfred S. (Firma: Manfred) (xfred343)


Lesenswert?

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?

von Christopher G. (cbg)


Lesenswert?

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.

von Manfred S. (Firma: Manfred) (xfred343)


Lesenswert?

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...

von Christopher G. (cbg)


Lesenswert?

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.

von Manfred S. (Firma: Manfred) (xfred343)


Lesenswert?

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!!!
1
$regfile = "m644def.dat"                                    'ATmeg644$crystal = 8000000
2
Ddrd.5 = 1                                                  'OC1A
3
Tccr1c = 0
4
Do
5
     Tccr1a = &B01010000         'CTC Pin D5, OC1A, CTC-Mode
6
     Tccr1b = &B00011101
7
     Tccr1c = 0                  'Prescaler 1024, IC1 Mode
8
     Icr1h = 0
9
     Icr1l = 3
10
     Ddrd.5 = 1
11
     Waitms 300
12
     Tccr1a = 0
13
     Tccr1b = 0
14
     Tcnt1h = 0
15
     Tcnt1l = 0
16
     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..

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.