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":
Eine einzelne Frequenz zu erzeugen funktioniert wunderbar. Mein Problem ist nun folgendes:Code:$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
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:
Liege ich damit richtig? Und wie kann ich verhindern, dass meine Frequenzwechsel genau zur falschen Zeit passieren?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.
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:
Code:Tccr1a = &B01000011 Tccr1b = &B00011001
Lesezeichen