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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Basti (Gast)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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. (Firma: Thomas Eckmann Informationst.) (thomase)


Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.