Hallo, ich habe wie im ATMEL-Datenblatt an einen AT90CAN128 zwischen TOSC1 (19)und TOSC2 (18) einen 32,768kHz Quarz, beide Leitungen mit je einem Kondensator gegen Masse angeschlossen und versucht, mit dem TIMER2 einen genauen Sekundentakt zu erzeugen. Das ganze funktioniert auch, ist aber extrem ungenau, d.h. in 2Minuten geht die Uhr 1s nach. In der ISR(TIMER2_COMP_vect) - Interrupt-Funktion zähle ich die Sekunden, Minuten, Stunden hoch. Ein extremes Abspecken des Programmcodes (nur Sekundenabarbeitung) hilft auch nicht weiter. Am Quarz oder den Kondensatoren liegt es sicherlich auch nicht, da habe ich verschiedene Typen und Kapazitäten ausprobiert habe. Vielleicht liegt der Fehler in der Initiailisierung des TIMER2? void rtc_init(void) { // enable extern pulsing via quartz ASSR=(1<<AS2); /* setup RTC for 1s-interrupt extern-clock: 32.768 Hz prescaler: 256 ctc-mode: preset 127 --> --> 128 32.768/256pulses/s --> preset 128 */ OCR2A=128; TCNT2=0; TCCR2A=(1<<WGM21) | (1<<CS22) | (1<<CS21); // enable overflow compare interrupt TIMSK2=(1<<OCIE2A); } Ein Funkuhrempfänger oder die in den Foren mehrfach beschriebene Nutzung des TIMER1 (ms-Takt) wäre eine Alternative, trotzdem würde ich gern die Ursache wissen, da diese Anwendung sehr einfach ist und in einigen Datenblättern als real-time-clock beschrieben ist. Vielleicht kennt jemand den Fehler?
@ Dietmar Kunst (kunsti) >Das ganze funktioniert auch, ist aber extrem ungenau, d.h. in 2Minuten >geht die Uhr 1s nach. Dann sit was faul. Das sind fast 1%! >In der ISR(TIMER2_COMP_vect) - Interrupt-Funktion zähle ich die >Sekunden, Minuten, Stunden hoch. Warum nicht im Überlauf? >auch nicht, da habe ich verschiedene Typen und Kapazitäten ausprobiert >habe. Was hast du denn da jetzt dran? Die Kapazitäten sind vom Quarz abhängig. Ausserdem können einige AVRs an die Pins interne Kapazitäten per [[AVR Fuses]] zuschalten. > OCR2A=128; Dir ist hoffentlich klar, dass dein Interrupt eine Periode von 129!!! Takten hat? Denn der zählt von 0..128. ;-) MFG Falk
Hallo Falk! Vielen Dank für deine schnelle Hilfe! Ich glaub' das letzere war's! Blöder Anfängerfehler! Der Gedanke war mir auch schon mal gekommen, hatte ihn aber nicht weiter verfolgt. Die Uhr läuft jetzt mit OCR2A=127 fast eine halbe Stunde und es sieht auf jeden Fall besser aus ;-), genaues kann ich erst morgen sagen. Ist es nicht egal, welchen Interrupt man nimmt? Überlauf oder Compare? Mit den Kapazitäten hast du natürlich recht. Aber da hab' ich darauf geachtet, dass die Kapazität wie im Datenblatt des Quarzes gefordert angeschlossen ist. Im Moment habe ich zwei 12pF Kondensatoren dran. Aber Danke für den Tipp. Bei den Fuses-Bits habe ich bisher noch nicht geschaut. Ich programmiere den AT90CAN128 mit AVR-Studio. Welches BIT ist dann da relevant? VG Kunsti
Die angeblichen internen Kondensatoren die man zuschalten kann funktionieren nicht. Das ist ein bekannter BUG bei (fast ?) allen AVRs. Einfach mal in den Errats zu dem µC nachschauen ob der Chip gerade eine Ausnahmen ist.
@ Dietmar Kunst (kunsti) >Ist es nicht egal, welchen Interrupt man nimmt? Überlauf oder Compare? Jain. Wenn man mit dem Sleep Mode Strom sparen will, nimmt man den Überlauf, weil der die geringstmögliche Frequenz bietet. Ansonsten ist es gleichwertig. >Ich programmiere den AT90CAN128 mit AVR-Studio. >Welches BIT ist dann da relevant? Gibt es bei dem AVR nicht. MFG Falk
Vielen Dank Falk und Ulrich! Damit sind meine Fragen erst mal beantwortet. Die Uhr läuft mittlerweile über 2 Stunden und ich kann noch keine Verspätung feststellen. Ich lasse sie mal bis Montag in Ruhe und werde dann den Überlauf-Interrupt ausprobieren. VG Kunsti
Und wenn du deine Uhr richtig schön kalibrieren willst, schau mal hier rein AVR - Die genaue Sekunde / RTC 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.