Hallo! Ich arbeite mit einem ATmega16 und dem Timer 2 und ich möchte den Clock für den Timer mit einem Quarz erzeugen. Dazu habe ich einen Quarz mit passenden Kapazitäten an die Pins TOSC1 und TOSC2 angeschlossen. Im Datenblatt steht: "Allows clocking from External 32 kHz Watch Crystal Independent of the I/O Clock" Bedeutet das, dass ich keinen Quarz mit mehr als 32kHz anschließen darf? Ich würde nämlich gerne Timer2-Overflows in 50ms abständen erhalten und dafür brauche ich mehr als 32 khz. Vielen Dank für euere Hilfe! Lukas.
@Lukas -- (lukas) >Bedeutet das, dass ich keinen Quarz mit mehr als 32kHz anschließen darf? Ja, der Oszillator dort ist auf 32kHz optimiert. >Ich würde nämlich gerne Timer2-Overflows in 50ms abständen erhalten und >dafür brauche ich mehr als 32 khz. Wozu? Schon mal was vom CTC-Modus gehört? MFG Falk
Ja, CTC-Modus kenne ich. Das Problem ist blos, ich möchte mehrere Stunden lang Messwerte in einem Intervall von 50ms ausgeben. Das beste Ergebnis bekommt man bei einem Prescaler von 8 und einem CTC-Wert von 205. Dann erhalte ich intervalle von 50,048828ms das bedeutet nach einer Stunde einen Zeitverzug von +3,51 Sekunden. Meine Lösung: Ich arbeite weiterhin mit einem 32768kHz Quarz am Timer und einem ATmega16 mit 16Mhz. Ich nehme einen Prescaler von 8 und einen CTW-Wert von 204 statt 205. Dann erhalte ich ein Intervall von 49,804688ms. Wenn ich dann nach jedem Interrupt vom Timer den Timer für 3125 Takte anhalte, müsste der Zeitverzug gleich null sein. Ich werde bei meiner nächsten Reicheltbestellung ein paar Uhrenquarze ordern und testen, ob meine Berechnung so hinkommt. Falls jemand einen Fehler findet oder einen Besseren Vorschlag hat, immer her damit! @ Falk Brunner: Vielen Dank für die Hilfe! Lukas.
Lukas -- schrieb: > Meine Lösung: Ich arbeite weiterhin mit einem 32768kHz Quarz am Timer > und einem ATmega16 mit 16Mhz. Wenn du sowieso 16Mhz hast, dann leite doch von dem die 50ms ab. Timer2 so einstellen, dass ein Vielfaches von der CTC-Frequenz die 50ms ergibt. Kein Gesetz der Welt verbietet dir in einer ISR die Aufrufe mitzuzählen und erst beim x-ten Aufruf eine Funktionalität zu machen. Durch die viel höhere Frequenz im Vergleich zu den 32kHz kannst du den Zeitraum auch noch genauer einstellen.
Karl heinz Buchegger schrieb:
> Wenn du sowieso 16Mhz hast, dann leite doch von dem die 50ms ab.
Hmm, stimmt, ich habe alles gerade nochmal durchgerechnet und
festgestellt, das man von 16Mhz 50ms ja super ableiten kann.
Vielen Dank an alle!
@ Lukas -- (lukas) >Das Problem ist blos, ich möchte mehrere Stunden lang Messwerte in einem >Intervall von 50ms ausgeben. Das beste Ergebnis bekommt man bei einem >Prescaler von 8 und einem CTC-Wert von 205. Dann erhalte ich intervalle >von 50,048828ms das bedeutet nach einer Stunde einen Zeitverzug von >+3,51 Sekunden. >Meine Lösung: Ich arbeite weiterhin mit einem 32768kHz Quarz am Timer Das sind eher 32768 Hz ;-) >und einem ATmega16 mit 16Mhz. Ich nehme einen Prescaler von 8 und einen >CTW-Wert von 204 statt 205. Dann erhalte ich ein Intervall von >49,804688ms. Wenn ich dann nach jedem Interrupt vom Timer den Timer für >3125 Takte anhalte, müsste der Zeitverzug gleich null sein. >Ich werde bei meiner nächsten Reicheltbestellung ein paar Uhrenquarze >ordern und testen, ob meine Berechnung so hinkommt. Nicht testen, DENKEN! >Falls jemand einen Fehler findet oder einen Besseren Vorschlag hat, >immer her damit! 50ms kann man mit fast jeder beliebigen Quarzfrequenz genau erzeugen. Mit 32,768 kHz wirds eng, ja, aber man kann tricksen. Der einfache Ansatz ist einfach ein normaler Quarz mit 1, 4, 8, whatever MHz am Hauptoszillator und gut. Damit kann man die 50ms genau erzeugen, einziger Fehler ist die Toleranz des Quarzes von ca. +/- 100ppm ohne Abgleich. Wenn man Stom sparen will, muss man auf den Uhrenquarz und [[Sleep Mode]] gehen. Aber 32768 / 20 Hz (50ms) = 1638,4. Dumm, das ist keine Ganzzahl. Aber es gibt ja Festkommaarithmetik!! Siehe auch AVR - Die genaue Sekunde / RTC. Ach ja, dein CTC Wert ist falsch. Denn die Periode ist nicht 205 Takte sondern 206, von 0..205! Damit ist deine Periodendauer 50,293 ms ;-) Mit einem Vorteiler von 204 erhält man eine Periodendauer von 205*8 Takten, macht die oben genannten 50,0488ms. Der ideale Teilerfaktor ist 204,8, ein Fehler von 0,2 Takten bzw. 0,9765625 Promille, macht halt deine 3,51s/ Stunde. Aber 0,2 Takte Fehler klingt einfach. Denn man kann einfach 4 Perioden durch 205 teilen und die 5. Periode durch 204, macht im Mittel 204,8 ;-) Also muss man nur im Timer Interrupt eine (statische) Variable hochzählen (0..4) und bei vier den Compare Wert für den CTC-Modus auf 203 setzen, sonst auf 204. Schwups hat man ideal einen 50ms Takt, der lediglich um max. acht 32KHz Takte (244µs) um den idealen Zeitpunkt jittert.
1 | ISR () { |
2 | static uint8_t jitter; |
3 | |
4 | if (jitter==4) { |
5 | jitter=0; |
6 | OCR2A = 203; |
7 | } else |
8 | jitter++; |
9 | OCR2A = 204; |
10 | }
|
So in etwa. MfG Falk
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.