PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : CTC Problem - gelöst!



DonParmesano
12.03.2008, 19:30
Hi!

Ich versuche mit einem MEGA8515 ein variables Rechtecksignal zu erzeugen. Dazu benutze ich den CTC-Modus. Die dazu notwendigen Register setze ich einfach "per Hand":

$crystal = 1000000 ' used crystal frequency
$baud = 19200 ' use baud rate
$hwstack = 32 ' default use 32 for the hardware stack
$swstack = 10 ' default use 10 for the SW stack
$framesize = 40 ' default use 40 for the frame space

Tccr1a = &B01000000
Tccr1b = &B00001001 'Setzt der TCCR1 Register (für den 16 bit Timer1) auf CTC Waveform

Config Portd = Output

Do
Ocr1ah = &B10011
Ocr1al = &B10000111
Waitms 5000
Ocr1ah = &B1011
Ocr1al = &B11010101
Waitms 5000
Ocr1ah = &B110
Ocr1al = &B110
Waitms 5000
Ocr1ah = &B11
Ocr1al = &B1010010
Waitms 5000
Ocr1ah = &B1
Ocr1al = &B110111
Waitms 5000
Ocr1ah = &B0
Ocr1al = &B11000111
Waitms 5000
Ocr1ah = &B0
Ocr1al = &B10100110
Waitms 5000
Loop


End

Eine einzelne Frequenz zu erzeugen funktioniert wunderbar. Mein Problem ist nun folgendes:
Wenn ich, wie im Codebeispiel, die Frequenz immer wieder wechsle, dann kommt es zwischendurch immer wieder zu ganz kurzen Ausfällen der Frequenz. Das einzig reproduzierbare daran ist, dass es immer beim Wechsel von einer Frequenz zur nächsten passiert.
Ich denke ja es hat etwas mit folgendem Text aus dem Datenblatt zu tun:


However, changing the TOP to a value close to BOTTOM when the
counter is running with none or a low prescaler value must be done with care since the
CTC mode does not have the double buffering feature. If the new value written to
OCR1A or ICR1 is lower than the current value of TCNT1, the counter will miss the
Compare Match. The counter will then have to count to its maximum value (0xFFFF)
and wrap around starting at 0x0000 before the Compare Match can occur.

Liege ich damit richtig? Und wie kann ich verhindern, dass meine Frequenzwechsel genau zur falschen Zeit passieren?

lg
Pedro

EDIT:

Ich hatte wohl recht mit meiner Vermutung! Mit FastPWM und OC1A als TOP funktioniert es durch die Doppelpufferung wie gewünscht!
Dazu setzt man die TCCR einfach so:


Tccr1a = &B01000011
Tccr1b = &B00011001