ATMega32 Problem mit Timer0 als Uhr

Hallo!

Ich habe einen AtMega32 mit 16MHz Quarz und zwei 27pF Kondensatoren am Quarz in Betrieb. Timer0 hat einen Vorteiler von 1024, soll bis 125 zählen und sich dann auf 0 setzen und weiterzählen. => Interruptroutine soll 125 mal pro Sekunde aufgerufen werden. Interruptroutine zählt bis 125 und setzt dann Sekunden + 1.

Problem: meine Uhr geht sehr ungenau (ca. -6 Sekunden auf 13 Minuten) Habe ich einen +-1 Fehler in den IFs gemacht? Ist der Quarz so ein Mist?

Konfiguration im Hauptprogramm:

SFIOR &= ~( 1

Reply to
Harald Noack
Loading thread data ...

Hallo Harald,

=2E.. im Datenblatt des ATMegas stehen aber Kondensatorwerte 12-22pF...

Alternativ k=F6nntest Du doch auch, sofern sie noch frei sind, an die Pins PC6 und PC7 einen Uhrenquarz mit 13,...kHz anschlie=DFen. Bei meinen "Uhrenschaltungen" mit dem ATMega32 habe ich =FCber Wochen hinweg damit keine Zeitabweichung.

Artur

Reply to
Artur

Harald Noack schrieb:

Also rechnen wir mal...

6 Sekunden / 780 Sekunden (13 Minuten) = 1/130 Fehler Da die Interruptroutine durch 125 teilen soll und du die Interruptroutine 125 mal bis zur Erhöhung der Sekunde aufrufst und 125 nicht weit von 130 entfernt ist, schließe ich auf einen Programmfehler entweder in der Interruptroutine selber oder beim Hochzählen des Interruptroutinenzählers.

Bei der Analyse deines Programms kann ich dir leider nicht weiterhelfen, ich programmiere in Assembler, in C kenne ich mich zu wenig aus.

Gruß Reinhard

Reply to
Reinhard Richter

sollte ok sein

Sicher nicht. Selbst bei einem schlechten Quarz müsste der Fehler kleiner als 1 sec / h sein. Ohne nachzurechnen würde ich 1 sec. pro Tag für realistisch halten.

Würde ich auch vermuten. Was macht denn die Zeile:

if(sub_sekunden%25==0) { timer_interrupt=1; }

Was macht die Variable timer_interrupt?

Gruß

Stefan DF9BI

Reply to
Stefan Brröring

Harald Noack schrieb:

Warum die leute immer mit Volldampf unterwegs sein müssen? Brauchst du die 16 MHz wirklich? Aber das nur nebenbei.

Hmm, mal rechnen.

16 MHz /1024 = 15625 Hz

15625 / 125 = 125 Hz

Nöö, den Quarz kann man physikalisch gar nicht so weit verstimmen. Aber dein Compare Wert ist falsch. Der ist 0x7D=125. Damit zählt dein Timer aber 126! Takte! Immer 0 .. X. Probier mal 0x7C ;-)

MFg Falk

Reply to
Falk Brunner

timer_interrupt ist eine Variable, auf die im Hauptproramm gepollt wird und die mehrfach pro Sekunde bestimmte Aktionen ausführt (ADC-Messungen).

Mit freundlichen Grüßen, Harald Noack

Reply to
Harald Noack

Tut er nicht, weil er beim Compare match resettet wird:

0, 1 ... 123, 124, 0, 1 ... || Probier mal 0x7C ;-)

IMHO stimmt das mit den 0x7D.

Micha

Reply to
Michael Baeuerle

Hallo!

DANKE!! Ich bin auf den Wert 0x7D mit dem Programm AvrCalc gekommen und bekam für diesen Wert 125Hz Interrupt-Frequenz mit keinem Fehler. Wie bist Du darauf gekommen? Von 0 - 125 muss ich 125 mal 1 addieren. Oder wird beim Sprung auf 125 und anschließendes Rücksetzen auf Null 2 Takte gebraucht?

Mit freundlichen Grüßen, Harald Noack

Reply to
Harald Noack

Hallo!

Ist denn der Timer1 schon belegt? Ich nehme für solche Uhrenanwendungen immer nen 4,194304 MHz Quarz und setz den Prescale auf 64. Dann läuft der Timer genau einmal pro Sekunde über und das Programm ist einfach zu machen. Und man hat noch etliches an Zeit für andere Dinge. Einen Ballast-C kann man dann schön durch nen Trimmer ersetzen und so sehr hohe Genauigkeiten hinbekommen. 1 Sekunde pro Woche sind mit etwas Fingerspitzengefühl und normalen Quarzen drin.

Gruß Thomas

Reply to
Thomas Stegemann

Ich würde das auch so verstehen, aber in einem meiner Programme habe ich folgendes gefunden: siehe OCR1A = 107, 11,0592 MHZ / 1024 = 108 !!! Keine Ahnung, ob ich das irgenwo abgeschrieben habe, oder durch Ausprobieren... Nachvollziehen kann ich das momentan auch nicht ganz.

.... TCCR1B = (1

Reply to
Stefan Brröring

Thomas Stegemann schrieb:

Mit minimaler Mathematik kann man mit so ziemlich jedem Quarz eine Uhr bauen. Kein Grund gleich auf Timer 1 und spezielle Frequenzen zu flüchten.

formatting link

Ds sind 1,6ppm. Schafft man per Trimmer, dann muss aber die Temperatur einigermassen stabil stehen, so +/-5K schätze ich mal.

MFG Falk

Reply to
Falk Brunner

Stefan Brröring schrieb:

Ich schon.

11,0592 MHz / 1024 = 10,800 kHz 10,800 kHz / 108 = 100 Hz.

Also muss der Tiomer durch 108 teilen, was im CTC Modus mit dem Wert

107! erreicht wird. Ist genauso wie beim UART und dem Baudgenerator, man muss immer Teiler-1 reinschreiben.

MfG Falk

Reply to
Falk Brunner

Falk Brunner schrieb:

Man kann schräge Quarze auch per Software und Bresenham-Algorithmus zurechtbiegen.

- Henry

--
www.ehydra.dyndns.info
Reply to
Henry Kiefer

Henry Kiefer schrieb:

Wenn die Frage nicht als Gag gemeint war findest du die Antwort im Link. Ja.

MfG Falk

Reply to
Falk Brunner

Ist schon klar. Genau meine Meinung.

Reply to
Stefan Brröring

Falk Brunner schrieb:

Habe ich gerade überflogen. Da sah ich nur Programme für Timerakrobatik mit _genauen_ Quarzen. Aber vielleicht habe ich es übersehen. Habe nicht die Zeit alles genau zu lesen.

Praktisch kann man das mit dem Bresenham auf Quarze hier nachlesen:

formatting link

- Henry

--
www.ehydra.dyndns.info
Reply to
Henry Kiefer

Hallo!

DANKE für Eure Hilfe! Fehler erkannt und beseitigt!

Mit freundlichen Grüßen Harald Noack

Reply to
Harald Noack

Ist wohl doch falsch was ich behauptet habe (nicht zu Ende gelesen). Gruende:

1) Atmel schreibt: "OCRx = TOP" und "TOP = highest value in count sequence" 2) Sie geben folgende Formel zur Frequenzberechnung an wenn man den OCx Pin mit dem Compare match toggeln laesst: f = fclk / (2 * Prescaler * (1 + OCRx))

Die Grafik zeigt das leider gar nicht. Den Spruch "In CTC mode the counter is cleared to zero when the counter value (TCNTx) matches the OCRx value" darf man also nicht so interpretieren als wenn das sofort passieren wuerde. Der Reset erfolgt erst im folgenden Takt (also wird von OCRx nach 0 weitergezaehlt).

Es muss also 0x7C sein wie Falk gesagt hat, sorry wenn ich Verwirrung gestiftet habe.

Micha

Reply to
Michael Baeuerle

Vielleicht hast du auch einfach nur die Dokumentation von Atmel gelesen?

Da stehen doch die Formeln zur Berechnung der Timerregister drin...

Reply to
Heiko Nocon

Obwohl der Quarz fast überall zu bekommen ist. Und Timer1 bietet sich dann halt an. Ist halt ein simpler Einstieg ohne viel komplizierte Algorithmen.

Ja, war nur im Innenraum selbstverständlich. Habe das Ganze dann trotzdem noch durch einen täglichen DCF-Abgleich erweitert. Jetzt geht sie quasi immer genau.

Gruß Thomas

Reply to
Thomas Stegemann

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.