AVR Timer1 Compare Toggle - beim schalten aussetzer

Gast #4787249
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?
Angehängte Dateien:
Gast #4787261
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
Gast #4787271
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
#4787278
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 9 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.