Forum: Mikrocontroller und Digitale Elektronik AVR Timer1 Compare Toggle - beim schalten aussetzer


von Basti (Gast)


Angehängte Dateien:

Lesenswert?

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?

von Basti (Gast)


Lesenswert?

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

von Basti (Gast)


Lesenswert?

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

von Thomas E. (thomase)


Lesenswert?

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
Noch kein Account? Hier anmelden.