Es kann sein dass wenn du einen Prescaler von 64 nimmst das die 10MHz schlecht geteilt werden können und dadurch ungenauigkeiten im Timer entstehen.
Hallo,
ich bin gerade etwas am Verzweifeln. Vielleicht kann mir jemand meinen wahrscheinlichen Denkfehler aufzeigen.
Mein Aufbau sieht wie folgt aus:
Auf einer Steckkarte sitzt mein mit Bascom programmierter Attiny13, die Fuses wurden auf external Clock gesetzt.
Als Taktquelle benutze ich einen 10Mhz TTL OCXO. Dessen Frequenz habe ich mit meinem Frequenzzähler mal überprüft. Die Abweichung vom Soll sind etwa 130 Hz, wobei ich den Frequenzzähler nicht auf dessen Genauigkeit überprüft habe. Es geht mir nur um einen Vergleich.
Wenn ich die Timer der AVR`s richtig verstanden habe, dann sollte die Genauigkeit des externen Taktes die Genauigkeit der Timer bestimmen.
Bei 130 Hz Abweichung des OCXO`s ergeben sich so 130 PPM oder 0,13 Promille...
Diese Abweichung sollte der Timer des Attiny nun doch auch haben?
Wenn ich also den Pinb.0 durch den Timer0 mit einem Prescale von 64 und OCR0A mit 125 toggle, dann sollte man eine Frequenz von 5000 Hz am Pin messen können...Vorrausgesetzt wir schicken 10Mhz heinein...Da wir aber einen Fehler von 130 PPM erwarten, sollte man "wenigstens" 4999,35 sehen. Leider bin ich hiervon aber weit entfernt...Die Ausgangsfrequenz liegt bei 4969 Hz, also 40 Hz daneben...
Was noch hinzukommt ist die Tatsache, dass der OCXO 130PPM zu weit "oben" schwingt, der AVR aber viel zu weit "unten"...Das Signal selbst ist dabei aber schön konstant und nicht Spannungsabhängig.
Interrupts verwende ich in meinem Programm nicht, sonst hätte ich auf Rechenzeit getippt, die das Ergebnis nach unten beeinflussen. Wo liegt mein Denkfehler? Wo ist das Delay welches sich auf die Frequenz auswirkt?
AlexCode:$regfile = "attiny13.dat" $crystal = 10000000 $hwstack = 32 $swstack = 8 $framesize = 16 Config Portb.0 = Output Config Timer0 = Timer , Compare A = Toggle , Prescale = 8 , Clear Timer = 1 Ocr0a = 125 Do Nop Loop
Es kann sein dass wenn du einen Prescaler von 64 nimmst das die 10MHz schlecht geteilt werden können und dadurch ungenauigkeiten im Timer entstehen.
Schaut ruhig mal auf meiner Homepage vorbei :
http://kampis-elektroecke.de
Oder folge mir auf Google+:
Daniel Kampert
Es gibt 10 Arten von Menschen. Die einen können Binär, die anderen nicht.
Gruß
Daniel
Die Formel für CTC ist aus dem DB ersichtlich: fOCNx = fclk I/O / (2 x Prescaler x (1 + OCRnx)) = 4960,317.
Passt also ganz gut.
Oder auf Deutsch, Dein CTC ist um 1 zu hoch.
Hallo Alex,
schau dir mal im Datenblatt auf Seite 64 die Berechnung der CTC Frequenz an.
Dort siehst du deinen Fehler.
130Hz bei 10MHz sind übrigens nur 13ppm
Hallo Kampi, MagicWSmoke und for_ro,
danke für eure nützlichen Hinweise. Stimme for_ro, ich hatte anscheinend mit 1 Mhz gerechnet, also 13PMM. Habe mir nochmal die Timerberechnung angesehen. In vielen FAQ`s und Skripten wird leider oft einfach nur der Takt durch Prescaler und das Register geteilt. Irgendwann habe ich dann diese Methode aus Faulheit übernommen...Im Datenblatt und in einem Buch habe ich dann die von euch erwähnte Formel (wieder) gefunden.
@MagicWhiteSmoke
Stimmt sogar sehr gut:4960,3277 Mhz In meinem Beitrag war ein Fehler, es werden NICHT 4969 angezeigt, sondern eben 4960xxxxx.
Werde mal schnell die Änderungen übernehmen und alles nochmal ausprobieren. Attiny wieder auf das Evolution Board und zum Brennen den externen Takt ranhängen.
Vielen Dank für eure Hilfe !
Für die, die es noch interessiert:
Der Frequenzzähler zeigt nun; 5000,00711 Hz an, ich konnte den OCXO noch etwas ziehen. Im Moment sind das alles nur reine Experimente, mal sehen ob sich daraus noch ein kleines Projekt ergibt.
Alex
Kleiner Nachtrag noch:
Ich habe jetzt auch nochmal einen Test mit dem internen RC Oszillator gemacht. Dieser erreicht natürlich nicht die Werte einen Quarzes. Bei meinem Attiny13V bei 3,3V und 19° Umgebungstemperatur bei 4,8 Mhz komme ich auf eine Genauigkeit von etwa 7 %. Dies bewegt sich im Rahmen der Herstellerdaten.
Alex
Lesezeichen