Genauigkeit einer Uhr per TimerCounter

OP #6419321
Lesenswert?

Liebe Leute,

ich habe mir eine Uhr gebaut, die die Uhrzeit (Stunden und Minuten) im 
Binärsystem mit LEDs anzeigt und für die Sekunden eine LED mit der 
Frequenz 1Hz blinken lässt.
Das ganze mit einem Arduino Klon mit dem ATmega 2560 mit 16MHz und 
programmiert in Assembler.

Für die Darstellung der Uhrzeit habe ich den 16-Bit TC1 programmiert und 
zwar so, dass er alle 500ms einen Compare Match A Interrupt auslöst. 
Hierzu lade ich das OCR1A mit dem Wert 31249 nach der im Datasheet 
angegebenen Gleichung für den CTC-Modus

f_OC1A = f_CPU/(2*N*(1+OCR1A)) Mein Prescaler hat den Wert 256.

In der ISR werden dann die gespeicherten Werte für halbe Sekunden, 
Sekunden, Minuten und Stunden upgedatet und es werden die aktuellen 
Werte für Minuten und Stunden auf den betreffenden Portbits ausgegeben.

Mittels zweier Taster kann ich die Stunden und Minuten einstellen und 
setze dabei auch immer die gespeicherten Werte für die halben Sekunden 
und Sekunden auf Null, damit ich möglichst sekundengenau einstellen 
kann.
Die Einstellung wird per Abfrage in der ISR gemacht.

Prinzipiell funktioniert die ganze Chose, ABER die Uhrzeit läuft nicht 
100%ig korrekt...läuft die Uhr einige Stunden, gibt es langsam 
Abweichungen im unteren Sekundenbereich....die Uhr scheint etwas 
schneller zu laufen.

Gibt es Erfahrungswerte hinsichtlich der Genauigkeit und Stabilität der 
CPU Taktfrequenz bei solchen Aruino-Boards bzw. Klons?

Liebe Grüße
Uwe Homm
Gast #6419347
Lesenswert?

Uwe H. schrieb:
> Prinzipiell funktioniert die ganze Chose, ABER die Uhrzeit läuft nicht
> 100%ig korrekt...läuft die Uhr einige Stunden, gibt es langsam
> Abweichungen im unteren Sekundenbereich....die Uhr scheint etwas
> schneller zu laufen.
 500ms

Dein Quarz hat demnach nicht ganz genau 16MHz, oder deine ISR braucht 
länger als 500ms für die Bearbeitung.
Gast #6419353
Lesenswert?

Uwe H. schrieb:
> Gibt es Erfahrungswerte hinsichtlich der Genauigkeit und Stabilität der
> CPU Taktfrequenz bei solchen Aruino-Boards bzw. Klons?

In der Regel werden die µCs mit einem keram. Resonator getaktet, deren 
Genauigkeit garkeine ist. 500 ppm sind für genaues Timing 
grottenschlecht.

Besser ist es, den 16 MHz Quarz vom ATmega16U2 zu verwenden. Eine knappe 
Beschreibung nebst Foto für einen UNO R3 findet sich hier: 
http://www.mino-elektronik.de/fmeter/fm_software.htm#bsp7 im 2. 
Abschnitt.
Gast #6419358
Lesenswert?

Man kann die Frequenz von Quarzen ein bisschen "ziehen", indem man einen 
der beiden Last-Kondensatoren verändert. Allerdings bleibt dann noch die 
Temperaturabhängigkeit.

Wenn du auf weniger Abweichung als 5 Minuten pro Monat kommen willst, 
solltest du besser einen Uhrenquarz an den µC anschließen (falls er das 
kann) oder eine externe RTC verwenden.

Die RTC Module aus China für unter 5€ sind oft auch sehr ungenau.
Gast #6419363
Lesenswert?

Uwe H. schrieb:
> die Uhr scheint etwas
> schneller zu laufen.

Für eine Uhr, die den Namen verdient, muss die zugrundeliegende Frequenz 
auf mindestens 6 Stellen genau sein. Das ist bei Prozessor-Quarzen ohne 
zusätzlichen Abgleich selten und eher zufällig der Fall.

Ob von Time-IRQ zu Time-IRQ genau die richtige Anzahl Zyklen ausgeführt 
wird musst du schon selber in deiner Software überprüfen.

Georg
Gast #6419385
Lesenswert?

Man kann die Frequenz von Quarzen ein bisschen "ziehen", indem man einen
der beiden Last-Kondensatoren verändert.
In modernen Quarzuhren wird i.a. kein manueller Abgleich mehr 
durchgeführt, da der Arbeits- und Zeitaufwand dafür zu hoch ist.
Einfacher ist es, die Korrektur per Software zu machen. Geht die Uhr 
vor, setzt man in regelmässigen Abständen den Reload-Wert des Timers um 
1 herunter, also 31248 statt 31249. Diese Sekunde wird dann um ca. 32 
ppm kürzer, was nicht auffällt. Geht die Uhr also um 8ppm vor, müsste 
die Korrektur in jeder 4. Sekunde durchgeführt werden. Voraussetzung ist 
natürlich, dass die Abweichung stabil ist und z.B. nicht mit der 
Temperatur schwankt.
Gast #6419404
Lesenswert?

Uwe H. schrieb:
> ja, das hatte ich schon probiert...ist aber etwas langwierig beim Testen
> und dazu müsste die Abweichung des Quarzes auch konstant sein, was ich
> ehrlich gesagt, bezweifle :-)

Es hat schon seinen Grund, warum viele Leute sich bei der 
Langzeitstabilität einer Uhr auf externe Dienstleister verlassen, z.B. 
DCF77 oder GPS.
#6419505
Lesenswert?

Hallo,
ich nutze einen Quarzoszillator mit 6,5535 Mhz für ein 100Hz PWM und 
gleichzeitig den Überlauf für die Uhrzeit. Allerdings mit dem 
ATtiny4313.
Die ISR:
.ORG OVF0addr      ;8 Bit Timer Überlauf
rjmp zeit00      ;Überlauf 8 Bit Zähler für Uhr
...
...
Zeit00:
  push AL
  in AL,SREG
  push AL
  push R24
  push R25

  ldi AL, LOW (hsec)
  ldi AH, HIGH(hsec)
  lds R24, zeitl
  lds R25, zeith
  adiw R24, 1
  sub AL, R24
  sbc AH, R25
  brcc Zeit01
  clr R24
  clr R25

  lds AL, nminute
  ori AL, 0b01111111    ;Bit 7 zufrieden lassen
  sts nminute, AL
Zeit01:
  sts zeitl, R24
  sts zeith, R25
  pop R25
  pop R24
  pop  AL
  out  SREG,AL
  pop  AL
  reti

hsec ist 6000
nminute

Dann irgendwann in der Hauptschleife:
Uhr:
  clr AL
  sts Zeit, AL
  lds AL, nminute
  sbrs AL, 0      ;Sprung, wenn Bit gesetzt
  ret
  andi Al, 0b11111110  ;Bit 0 löchen
  sts nminute, AL
  lds AL, Minute    ;lese Minute
  inc AL
  cpi AL, 60      ;nächste Stunde? 60=0x3C
...usw.

Der Weg ist etwas anders, läuft aber ganz gut.
nminute wird jede Minute gesetzt
Der Quarz
https://www.reichelt.de/quarzoszillator-6-553600-mhz-oszi-6-553600-p13719.html?&trstct=pol_5&nbc=1
Die Frequenztoleranz:±100 ppm
reicht mir für meine Schaltzeiten aus.
Ich hoffe, das dir die Anregung weiter brint.
Gruß Carsten
#6419652
Lesenswert?

Uwe H. schrieb:
> .....vielen Dank für all Eure Antworten, die mich wieder etwas
> sensitiver hinsichtlich der Genauigkeit von Quarzen gemacht haben.

Ein Quarz schwingt nicht einfach "mal so" mit der f, die der Hersteller 
angegeben oder aufgedruckt hat. Die Schwingfrequenz hängt (auch) von der 
Art der Oszillator-Schaltung und diversen anderen Randbedingungen (Temp. 
/Betriebsspannungs-Schwankung, Beschaltung) ab und bei weitem nicht nur 
von der Fertigungstoleranz des Quarzes selbst.
Man kann ihn -wie Stefan bereits sagte- mit externen Elementen (z.B. Cs 
und/oder Ls) auf die Soll- Frequenz "ziehen". Wenigstens das sollte man 
dann wenigstens mal mit Hilfe eines Zählers machen, wenn man ihn als 
Referenz für eine Uhr nutzt.

Wenn die Randbedingungen einigermaßen konstant und f-soll abgeglichen 
sind, zeigt ein nicht "unordentlich" gebauter Q-Osz. durchsus eine 
Stabilität von 10^(-6) oder sogar weit besser.
DAS siehst du auf einer Uhrzeitanzeige innerhalb von 24 Stunden nicht im 
Geringsten ( < 1/10tel Sek.).
#6419655
Lesenswert?

georg schrieb:
> Hast du das mal aufs Jahr ungerechnet?

Meine Uhr läuft weniger wie 3 Minuten im Monat falsch.
Ich kann nicht sagen, welche Genauigkeit Uwe braucht.
Bei mir ist es eben oft mehr ein Software-Problem, wenn die Abweichung 
zu groß werden.

...läuft die Uhr einige Stunden, gibt es langsam
Abweichungen im unteren Sekundenbereich....

Das erscheint mir zu viel Abweichung für den Quarz zu sein.
Ich bab viel ausprobiert und viel verworfen, was eigentlich laufen 
sollte. (wer nicht?)
Manchmal ist es einfacher, in Abständen die Zeit automatisch neu zu 
setzen.

Gruß Carsten

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren