Forum: Mikrocontroller und Digitale Elektronik die genaue Sekunde will nicht genau sein


von Daniel K. (danielk91)


Angehängte Dateien:

Lesenswert?

Hallo User,

ich brauche dringend eure Hilfe. Ich bekomme einfach keine genaue Zeit 
hin. Ich benutze die bekannte "genaue sekunde" Routine von Peter und es 
klappt auch alles einwandfrei, nur bin ich innerhalb einer Minute schon 
um ein paar Sekunden hinterher. Ich moechte mir eine Zeitschaltuhr 
bauen. Sie brauch nicht sehr genau sein, aber es waere wunderbar falls 
ich aehnlichen Resultate bekomme wie Peter.
Vielleicht kann jemand mal drueber schauen und mir weiter helfen. Ich 
verzweilfel naemlich......denn es klappt ja alles...

Danke, Gruss
Daniel

von STK500-Besitzer (Gast)


Lesenswert?

Benutzt du u.U. den internen RC-Oszillator?
Der ist so genau, wie eine Sanduhr...
Ich habe auch schon eine Uhr programmiert und als Taktquelle einen 
Quarzoszillator benutzt. Da war die Abweichung wesentlich geringer als 
beio dir.

von Christoph db1uq K. (christoph_kessler)


Lesenswert?

Stimmt der Quarz? Der kann eigentlich nicht so weit daneben liegen, mehr 
als 1 Promille ist nicht möglich. Das Vorteiler-Fusebit würde einen 
Faktor 8 daneben liegen, das kann es auch nicht sein. Stimmen die 
Fusebits für den Oszillatortyp, oder stehen sie noch auf interner 
RC-Oszillator?

von Daniel K. (danielk91)


Lesenswert?

Habe die Fuses auf externe clock gesetzt und benutze einen 4.032MHz low 
profile Schwingquarz auf meinem STK500. Wenn ich den Quarz heraus nehme, 
bleibt die Uhr auch stehen, also wird der wohl auch genutzt.

Habe auch schon ein Uhrenquarz ausprobiert-mit dem gleichen Ergebniss. 
Irgendwo scheint diese Verzoegerung zu kommen.

DANKE fuer die schnelle Hilfe bis jetzt!!!!

von holger (Gast)


Lesenswert?

>  update_clock();               // exact one second over
>#if XTAL % DEBOUNCE         // handle remainder
>   OCR1A = XTAL / DEBOUNCE + XTAL % DEBOUNCE - 1; // compare once per second
>#endif

Wenn du das update_clock() mal ans Ende der ISR schiebst
könnte es besser werden.

von Johnny (Gast)


Lesenswert?

Für solche Sachen empfiehlt es sich, einen Uhrenquarz (32.768kHz) zu 
nehmen und damit periodisch einen Interrupt auszulösen. Es ist noch zu 
beachten, dass der Code im IRQ für die Ausführung nicht länger braucht 
als der Timerinterval, sonst geht einer oder mehrere verloren.

von Daniel K. (danielk91)


Lesenswert?

Hallo Holger,

das hat leider auch nicht geholfen. Bleibt der gleiche Effekt. Kann ein 
so grosser Unterschied aus der Ungenauigkeit des Quarzes entstehen. Nur 
so empfindlich koennen diese Quarze doch nicht sein, denn halbwegs 
genaue Uhren gibt es doch wie Sand am Meer. Oder muss ich mir was 
anderes als einen Quarz kaufen, der das Zeitsignal liefert.

Gruss
Daniel

von Peter D. (peda)


Lesenswert?

holger wrote:
>>  update_clock();               // exact one second over
>>#if XTAL % DEBOUNCE         // handle remainder
>>   OCR1A = XTAL / DEBOUNCE + XTAL % DEBOUNCE - 1; // compare once per second
>>#endif
>
> Wenn du das update_clock() mal ans Ende der ISR schiebst
> könnte es besser werden.

Nein!

Das update_clock() enthält schnarchlahme LCD-Ausgaben und damit gehört 
es aus dem Interrupt verbannt und ins Main gepackt.
Völlig klar, daß Dir Interrupts verloren gehen und die Uhr nachgeht.

Ich hab im Interrupt immer nur ein 1s-Flag gesetzt und damit im Main die 
Zeit gezählt.
Damit hat man dann ne ganze Sekunde Zeit für LCD-Ausgaben.


Peter

von Klaus R. (klaus2)


Lesenswert?

...da hat einer den Grundlagenartikel zu ISRs wohl doch nicht so genau 
gelesen - zudem kann das Quarz sehr wohl recht ungenau sein, wobei sich 
die Fehler im Programm potenzieren können. Daher MUSS man ja nicht nur 
rechnen, sondern die Uhr auch messtechnisch eichen.

Klaus.

von Benedikt K. (benedikt)


Lesenswert?

Klaus R. wrote:
> Daher MUSS man ja nicht nur
> rechnen, sondern die Uhr auch messtechnisch eichen.

Nein! Du darfst die Uhr nicht eichen, das darf nur die Eichbehörde.

von Falk B. (falk)


Lesenswert?

@Johnny (Gast)

>Für solche Sachen empfiehlt es sich, einen Uhrenquarz (32.768kHz) zu
>nehmen und damit periodisch einen Interrupt auszulösen.

Vollkommen unnötig, siehe Artikel AVR - Die genaue Sekunde / RTC

> Es ist noch zu
>beachten, dass der Code im IRQ für die Ausführung nicht länger braucht
>als der Timerinterval, sonst geht einer oder mehrere verloren

In der Tat, siehe Interrupt.

MFG
Falk

von Daniel K. (danielk91)


Lesenswert?

Danke fuer die klasse Hilfe!!!

@Peter Es hat daran gelegen, jetzt laeuft die Uhr genau, zumindest die 
letzten 12 Stunden;-)

Danke auch an alle anderen. Auf euch ist Verlaß!!

Gruss
Daniel

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
Noch kein Account? Hier anmelden.