Hallo, ich messe eine Frequenz (timer0) und gebe diese über den timer1 wieder aus. Die Werte für den Timer1 errechnet mein Programm. Per Debug (UART) habe ich diese werte bereits geprüft. Es scheint so als wenn der timer beim umschalten von Presc. OCR1A 8 20958 -> 47Hz auf 64 12614 -> 10Hz einen kurzen aussetzer macht (siehe anhang) habe es in bascom sowohl mit der bascom eigenen anweisung, also auch mit direktzugriff auf das register versucht if real_presc=1024 then tccr1B=13 if real_presc=256 then tccr1B=12 if real_presc=64 then tccr1B=11 if real_presc=8 then tccr1B=10 if real_presc=1 then tccr1B=9 ocr1a=real_value tccr1a=64 Hat jemand eine vorgehensweise die funktioniert?
Ich habe mal einen code gebaut der das gleiche macht, wie das zielprogramm, nur simuliert halt $regfile="m328pdef.dat" $crystal=16000000 config portb.1=OUTPUT dim tim as word dim l as Word dim real_presc as Word dim real_value as Word do real_presc=8 real_value=20958 if real_presc=1024 then Config Timer1 = Timer , Prescale = 1024 , Clear Timer = 1 , Compare A = Toggle if real_presc=256 then Config Timer1 = Timer , Prescale = 256 , Clear Timer = 1 , Compare A = Toggle if real_presc=64 then Config Timer1 = Timer , Prescale = 64 , Clear Timer = 1 , Compare A = Toggle if real_presc=8 then Config Timer1 = Timer , Prescale = 8 , Clear Timer = 1 , Compare A = Toggle if real_presc=1 then Config Timer1 = Timer , Prescale = 1 , Clear Timer = 1 , Compare A = Toggle ocr1a=real_value wait 1 real_presc=64 real_value=12614 if real_presc=1024 then Config Timer1 = Timer , Prescale = 1024 , Clear Timer = 1 , Compare A = Toggle if real_presc=256 then Config Timer1 = Timer , Prescale = 256 , Clear Timer = 1 , Compare A = Toggle if real_presc=64 then Config Timer1 = Timer , Prescale = 64 , Clear Timer = 1 , Compare A = Toggle if real_presc=8 then Config Timer1 = Timer , Prescale = 8 , Clear Timer = 1 , Compare A = Toggle if real_presc=1 then Config Timer1 = Timer , Prescale = 1 , Clear Timer = 1 , Compare A = Toggle ocr1a=real_value wait 1 loop
vor dem umschalten den timer1 zurückzusetzen scheint die lösung real_presc=8 real_value=20958 timer1=0 if real_presc=1024 then Config Timer1 = Timer , Prescale = 1024 , Clear Timer = 1 , Compare A = Toggle if real_presc=256 then Config Timer1 = Timer , Prescale = 256 , Clear Timer = 1 , Compare A = Toggle if real_presc=64 then Config Timer1 = Timer , Prescale = 64 , Clear Timer = 1 , Compare A = Toggle if real_presc=8 then Config Timer1 = Timer , Prescale = 8 , Clear Timer = 1 , Compare A = Toggle if real_presc=1 then Config Timer1 = Timer , Prescale = 1 , Clear Timer = 1 , Compare A = Toggle ocr1a=real_value
Basti schrieb: > einen kurzen aussetzer macht (siehe anhang) Ein Aussetzer ist das nicht. Das OCR1A-Register wird sofort aktualisiert. Wenn der Wert des TCNT zufällig größer als der neue Wert ist, ist er schon am Schaltpunkt vorbei. Dann läuft der Timer einmal ganz herum, fängt bei 0 wieder an und läuft weiter, bis er den Compare-Wert wieder erreicht hat. Nimm den Compare Interrupt und aktualisiere den Wert in der ISR. Oder frag ohne Interrupt nur das Flag ab. Löschen nicht vergessen! Basti schrieb: > vor dem umschalten den timer1 zurückzusetzen scheint die lösung Damit wird die neue Flanke auf die abgewürgte Flanke aufaddiert. D.h. die erste ist auch länger. Aber natürlich nicht soooo lang. Nach obiger Methode wird die aktuelle erst beendet und dann kommt die neue.
:
Bearbeitet durch User
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.