Forum: Mikrocontroller und Digitale Elektronik rtc - generelle Frage


von Thorsten S. (whitejack)


Lesenswert?

Was ich immer schon mal wissen wollte. Wenn man beispielweise mit der 
DS3231 eine Uhr baut, wie geht man da generell mit dem Abgleich um?

Wie oft liest man die Uhr aus, wenn man bespielsweise einen Atmega mit 
dem internen RC Oszillator laufen hat...?

Man programmiert sich ja eine Uhr auf dem Atmega und synchronisiert die 
dann mit der rtc, oder? Wäre ja blöd wenn man das beispielweise alle 24h 
macht, die Uhr dann aber mehrere Minuten springt ...

Man soll die Dinger ja auch nicht zu häufig auslesen...

von Arduino F. (Firma: Gast) (arduinof)


Lesenswert?

Thorsten S. schrieb:
> Man soll die Dinger ja auch nicht zu häufig auslesen...

Aha...
Was sagt denn das Datenblatt zu der Behauptung?

von S. L. (sldt)


Lesenswert?

> Wie oft liest man die Uhr aus, wenn man bespielsweise einen
> Atmega mit dem internen RC Oszillator laufen hat...?

Nun - rechnen!
  Im günstigen Fall hat man damit 3 % Abweichung, ist eine Genauigkeit 
von 1 Sekunde verlangt, muss folglich die RTC jede halbe Minute 
ausgelesen werden.

PS:
Der DS3231 hat ja einen 32 KiHz-Ausgang - diesen als Interrupt für den 
ATmega zu verwenden könnte sinnvoll sein ...

: Bearbeitet durch User
von Jens M. (schuchkleisser)


Lesenswert?

Es gibt/gab mal RTCs die man nicht so oft auslesen sollte, weil es da zu 
Zählfehlern kommen konnte.
Das ist m.W. aber vorbei, seit die I²C sprechen.
Man muss aber dennoch auf die Reihenfolge und den Zeitpunkt des 
auslesens der Register achten, damit es nicht dazu kommt das man über 
einen Minuten-/Stunden-/Tagessprung ausliest.

Zum anderen haben viele einen Ausgang, der einen Takt abgeben kann, 
teilweise z.B. feste 32768kHz, teilweise auch programmierbar, z.B. auf 
1Hz.
Den kann man an einen Pin des Controllers andocken und dann dort 
entsprechend benutzen, dann ist der Takt des Controllers reichlich egal. 
Ja, technisch gesehen sind die Takte asynchron und daher kommt es zu 
winzigen Sprüngen in der Dauer z.B. einer Sekunde, aber für menschliche 
Wahrnehmung ist das genau.
Damit kann man dann selber Sekunden zählen und nur einmal pro Minute die 
Uhr abfragen, oder eben auch "immer nach dem Signal" die RTC komplett 
auslesen.

Oder drittens man rechnet aus wie lange der Controller braucht um mit 
seinem Takt 1/2 LSB Abweichung zu bauen und liest immer in diesem 
Intervall.

Die programmiertechnisch einfachste Lösung dürfte die zweite sein:
- Warte auf 1PPS-Signal
- Lies die RTC
- Bring das auf's Display
- wieder von vorne.

Wenn die Schaltung noch anderen Kram machen muss, sollte man probieren 
das in den 4. Schritt zu packen.

von Carsten-Peter C. (carsten-p)


Lesenswert?

Moin,
vielleicht ist es einfacher dem Atmega einen Quarz oder Oszillator zu 
gönnen. Der würde die Urzeit im Atmega oder Attiny gleich genau erzeugen 
können und der Aufwand ist geringer. Nur eine freier Timer muss 
vorhanden sein
Gruß
 Carsten

von Rainer W. (rawi)


Lesenswert?

Carsten-Peter C. schrieb:
> Der würde die Urzeit im Atmega oder Attiny

Die gab es zu Urzeiten noch nicht ;-)
Da stapften noch die Dinosaurier rum.

von H. H. (hhinz)


Lesenswert?

Rainer W. schrieb:
> Carsten-Peter C. schrieb:
>> Der würde die Urzeit im Atmega oder Attiny
>
> Die gab es zu Urzeiten noch nicht ;-)
> Da stapften noch die Dinosaurier rum.

Ach wo, das ist UTC+3.

https://de.wikipedia.org/wiki/Ur_(Stadt)

von Christian S. (roehrenvorheizer)


Lesenswert?

Rainer W. schrieb:
> Da stapften noch die Dinosaurier rum.

Und mangels genauer Zeitangabe zum Date sind die Dinos ausgestorben.

mfg

von Rainer W. (rawi)


Lesenswert?

Thorsten S. schrieb:
> Wäre ja blöd wenn man das beispielweise alle 24h macht, die Uhr dann
> aber mehrere Minuten springt ...

Dann hat man blöd programmiert. Nach den ersten 24h kann das vielleicht 
passieren, aber daraus sollte der ATmega lernen, den Fehler seines 
RC-Oszillators bestimmen und den Gang seiner Software-Uhr immer 
entsprechend korrigieren, so dass es nicht wieder zu so großen 
Abweichungen kommt.

: Bearbeitet durch User
von Karl K. (leluno)


Lesenswert?

Thorsten S. schrieb:
> mehrere Minuten springt ...

lass sie doch springen.
1
//------------------- smh timer ------------------
2
  if (timer_smh>99)
3
    {
4
      sec=sec+timer_smh/100;
5
      timer_smh=timer_smh%100;
6
      if(sec>59){
7
        sec=sec-60;  min=min+1;
8
        lcd_goto(2,4);//              
9
        lcd_int2(min);//
10
        lcd_write(":");
11
      if(min==60){
12
        min=0; hou++;
13
        if(hou==24)
14
        {
15
        hou=0;
16
          if(sperre_rtc==0)
17
          {
18
        kk_ds1307_getAll_to_global_struct_zt();
19
            sub_sommerzeit();
20
            sperre_rtc=1;
21
            sub_day_start();
22
          }
23
        }
24
        if(hou==2)sperre_rtc=0;
25
        lcd_goto(2,1);//              
26
        lcd_int2(hou);//
27
        lcd_write(":");              
28
        }
29
      }
30
    lcd_goto(2,7);//              
31
    lcd_int2(sec);//
32
//    led1_tog;

Für die meisten Anwendungen ist das egal. Mehr Genauigkeit erfordert 
halt mehr Aufwand.

von H. H. (hhinz)


Lesenswert?

Christian S. schrieb:
> Rainer W. schrieb:
>> Da stapften noch die Dinosaurier rum.
>
> Und mangels genauer Zeitangabe zum Date sind die Dinos ausgestorben.

Die sind doch bei einem Flugzeugunglück...


https://de.wikipedia.org/wiki/De_Havilland_DH.106_Comet

von Michael B. (laberkopp)


Lesenswert?

Rainer W. schrieb:
> Dann hat man blöd programmiert. Nach den ersten 24h kann das vielleicht
> passieren, aber daraus sollte der ATmega lernen, den Fehler seines
> RC-Oszillators bestimmen und den Gang seiner Software-Uhr immer
> entsprechend korrigieren,

Blöderweise arbeitet der RC Oszillator Temperatur- und 
Betriebsspannungsabhängig.

Es sieht einfach doof aus, wenn die Anzeige nicht gleichmässig im 
Sekundentakt springt. Ob man dazu die RTC 20 x pro Sekunde ausliest, 
oder eine PLL nur 1 x am Tag synchronisiert, bleibt dem Programmierer 
überlassen.

von Rainer W. (rawi)


Lesenswert?

Michael B. schrieb:
> Blöderweise arbeitet der RC Oszillator Temperatur- und
> Betriebsspannungsabhängig.

Wenn man schon einen RC Oszillator als Zeitbasis für eine Uhr verwenden 
will, tut man das tunlichst nur bei halbwegs stabilen Bedingungen. 
Solange das Ding unter Wohnraumbedingungen betrieben wird, ist der 
Mittelwert über 24h recht stabil. Wenn das dem Anwender nicht reicht, 
muss er eben öfter bei der RTC nachfragen oder direkt die RTC für die 
Zeit in der Anwendung nutzen.

Es ging um die Kalibrierung des RC-Oszillator gegen die RTC.
Im Endeffekt ist das eine PLL mit einer Referenzfrequenz entsprechend 
dem RTC-Abfragetakt.

> Es sieht einfach doof aus, wenn die Anzeige nicht gleichmässig im
> Sekundentakt springt.

Entweder überschätzt du maßlos dein absolutes Zeitgefühl oder die 
Instabilität eines RC-Oszillators. Wie oft hast du auf einer Uhr schon 
eine Schaltsekunde gesehen? Das dürfte so ziemlich die größtmögliche 
Ungleichmäßigkeit im Ablauf einer Minute auf einer Uhr sein.

p.s.
Adjektive schreibt man klein ...

: Bearbeitet durch User
von Pandur S. (jetztnicht)


Lesenswert?

Es gibt ja ATMega mit Timer2, auch mit clock Pins. Dort kann man einen 
32768Hz Quartz anhaengen. die gibt es fuer wenig Geld mit erhoehter 
Genauigkeit, zB mit 10 ppm anstelle von 100ppm. Wenn man in dessen 
Inerrupt eine Uhr zaehlen laesst muss man diese Uhr eigentlich nur beim 
Powerup einmal vom RTC laden.

von Jens M. (schuchkleisser)


Lesenswert?

Manchmal glaube ich es gibt hir einen versteckten 
Rube-Goldberg-Wettbewerb...

von Bauform B. (bauformb)


Lesenswert?

Dafür müsste die Anzeige aber mechanisch sein (hatten wir das nicht 
gerade?) und man braucht noch einen Thermostat für den 10ppm-Uhrenquarz 
am AVR. Am besten mit Kohle beheizt, Gas wäre ja zu einfach. Das kostet 
dann zwei Förderbänder und einen Ozongenerator oder was hilft gegen 
statische Aufladung?

von Jens M. (schuchkleisser)


Lesenswert?

Nein, dazu muss es nur nutzlos kompliziert gemacht werden.
Gewinnen kann man damit nix, aber der TO auch nicht.

von H. H. (hhinz)


Lesenswert?

Jens M. schrieb:
> Manchmal glaube ich es gibt hir einen versteckten
> Rube-Goldberg-Wettbewerb...

Erster Preis ist ein original Familienbenutzer.

von Philipp K. (philipp_k59)


Lesenswert?

Kommt drauf an wie genau es bleiben soll, ich gleiche das irgendwie 
zwischen 1-10 Minuten ab. (Für eine Uhr)

Will man durchgehend einen sehr genauen z.B. Millisekunden Takt haben, 
kann man die Minütlich synchronisierte Zeit mit dem 32khz Signal 
abgleichen. So kann man eine X Tages Stopuhr mit 2ppm und 32768/Sekunde 
umsetzen.

Man kann auch ein 1 Sekunden Takt nehmen, und dazwischen mit dem 16Mhz 
Basistakt zählen. Das muss man dann nach Genauigkeit abwägen.

Jens M. schrieb:
> Das ist m.W. aber vorbei, seit die I²C sprechen.

Die Dallas haben das trotzdem, wenn man per I2C Sinnloses Massen Polling 
betreibt.

: Bearbeitet durch User
von Rainer W. (rawi)


Lesenswert?

Philipp K. schrieb:
> Kommt drauf an wie genau es bleiben soll, ich gleiche das irgendwie
> zwischen 1-10 Minuten ab. (Für eine Uhr)

Pro Stunde, Tag, Monat, Jahr oder Jahrzehnt?

von Jens M. (schuchkleisser)


Lesenswert?

Philipp K. schrieb:
> Die Dallas haben das trotzdem, wenn man per I2C Sinnloses Massen Polling
> betreibt.

Daher macht es Sinn, den 1Hz-Ausgang zu nutzen, der immer dann 
signalisiert, wenn die Zähler eh "eins weiter" sind.
Man hat dann knapp eine Sekunde Zeit alles aus der RTC rauszuholen, 
bevor die Vorsichtsmaßnahmen beachtet werden müssen.
Für eine Schaltung deren Hauptzweck ist eine Uhr zu sein ist das ideal 
weil einfach zu bauen, einfach zu programmieren und genau ist es auch 
noch.

von Arduino F. (Firma: Gast) (arduinof)


Lesenswert?

Philipp K. schrieb:
> Die Dallas haben das trotzdem, wenn man per I2C Sinnloses Massen Polling
> betreibt.

Vielleicht, manchmal, mag das auf die DS1307 zutreffen.
Und soweit mit bekannt, eher ein Problem beim Schaltungsaufbau.

Bei den DS3231  konnte ich das nicht feststellen!
Trotz Dauertest über Monate

von Bauform B. (bauformb)


Lesenswert?

Philipp K. schrieb:
> Will man durchgehend einen sehr genauen z.B. Millisekunden Takt haben,
> kann man die Minütlich synchronisierte Zeit mit dem 32khz Signal
> abgleichen. So kann man eine X Tages Stopuhr mit 2ppm und 32768/Sekunde
> umsetzen.
>
> Man kann auch ein 1 Sekunden Takt nehmen, und dazwischen mit dem 16Mhz
> Basistakt zählen.

Wobei das 32kHz Signal bei den meisten RTCs nicht so genau ist wie der 1 
Sekunden Takt. Der DS3231 ist einer der ganz wenigen, bei denen die 
Temperaturkompensation am Oszillator ansetzt. "Normale" RTCs machen das 
weiter hinten digital. Bei denen ist die 1 Sekunde exakt, aber nur über 
viele 32kHz-Perioden gemittelt, z.B. über 512 Sekunden. Der RV-3032-C7 
schafft das angeblich in 1 Sekunde.

Für eine normale Uhr ist der 1 Sekunden Takt ideal. I2C braucht man 
damit nur genau einmal nach einem Stromausfall.

von Sn60pb38cu2 (sn60pb38cu2)


Lesenswert?

Thorsten S. schrieb:
> Man soll die Dinger ja auch nicht zu häufig auslesen...

Das Datenblatt zur DS3231 ist da unmissverständlich:


When reading or writing the time and date registers,
secondary (user) buffers are used to prevent errors when the
internal registers update. When reading the time and date
registers, the user buffers are synchronized to the internal
registers on any START and when the register pointer
rolls over to zero. The time information is read from these
secondary registers, while the clock continues to run. This
eliminates the need to reread the registers in case the
main registers update during a read.

von Arduino F. (Firma: Gast) (arduinof)


Lesenswert?

Sn60pb38cu2 schrieb:
> Das Datenblatt zur DS3231 ist da unmissverständlich:

Das Problem ist natürlich nicht das Datenblatt!
Auch nicht diese RTC.
Sondern die menschliche Fähigkeit, ein erlebtes, oder nur gehörtes, 
Problem auf alles zu projizieren, was nicht schnell genug auf den Baum 
kommt.

Gerüchteküche und Vorurteile
Und diese lassen sich eher selten durch Fakten beeinflussen.

: Bearbeitet durch User
von Rainer W. (rawi)


Lesenswert?

Bauform B. schrieb:
> Wobei das 32kHz Signal bei den meisten RTCs nicht so genau ist wie der 1
> Sekunden Takt.

Woher soll der 1 Sekunden Takt einer RTC denn sonst kommen, wenn nicht 
durch Teilung aus dem 32768Hz-Takt?
Die saubere Teilbarkeit ist doch genau der Grund für diese Taktfrequenz.

: Bearbeitet durch User
von Philipp K. (philipp_k59)


Lesenswert?

Bauform B. schrieb:
> der DS3231 ist einer der ganz wenigen, bei denen die
> Temperaturkompensation am Oszillator ansetzt.

Ich finde es gibt genügend "TXCO-RTC"s Chips.

Bauform B. schrieb:
> Für eine normale Uhr ist der 1 Sekunden Takt ideal. I2C braucht man
> damit nur genau einmal nach einem Stromausfall.

Genau so isses.

Ich habe einen 3 Jahres mit dem dS3231 auf 2-2,5ppm pro Jahr durch. (Nie 
unter 10 Grad.)

Dazu auch parallele Synchronisierung zur Langzeitmessung von Takten mit 
16Mhz der MCU, GPS-PPS und TCXO-RTC als Zweitbasis bzw. Sekundenreferenz 
von der dann der 16Mhz Takt in eigenem Zähler korrigiert wurde (Digitale 
Kompensation.)

Das ist aber schon 10 Jahre her, es war aber nur eine Spielerei im 
Heim-Labor :)

von Bauform B. (bauformb)


Lesenswert?

Rainer W. schrieb:
> Bauform B. schrieb:
>> Wobei das 32kHz Signal bei den meisten RTCs nicht so genau ist wie der 1
>> Sekunden Takt.
>
> Woher soll der 1 Sekunden Takt einer RTC denn sonst kommen, wenn nicht
> durch Teilung aus dem 32768Hz-Takt?
> Die saubere Teilbarkeit ist doch genau der Grund für diese Taktfrequenz.

das war der Grund für diese Frequenz, damals, im vorigen Jahrhundert. 
Heute kann eine RTC abwechselnd zwei verschiedene Teiler benutzen und so 
den Fehler der 32kHz reduzieren. Dadurch ist der 1Hz Takt im Mittel 
genauer als die 32kHz.

Ja, Dallas hat damals feste 32768:1 benutzt und zum Abgleich die 
Kapazität(en) im Quarzoszillator verändert, vielleicht mit einer 
Kapazitätsdiode? Aber heutzutage muss ja alles digital funktionieren.

von Jens M. (schuchkleisser)


Lesenswert?

Rainer W. schrieb:
> Woher soll der 1 Sekunden Takt einer RTC denn sonst kommen, wenn nicht
> durch Teilung aus dem 32768Hz-Takt?

Er meinte bei einer RTC mit Temperaturkompensation, wie z.B. der 3231.
Da gibt es grundsätzlich 2 Methoden:
a) Entweder wird die 32.768kHz-Frequenz des Quarzes angepasst, d.h. der 
Oszillator selber wird temperaturgeregelt.
b) Oder der Chip passt den Teiler an, und teilt nicht fest durch 32768.
Das kann passieren durch 2 abwechselnde Teiler, die abechselnd verwendet 
werden, oder durch einen anpassbaren Teiler.
Alternativ gibt es auch die Version, das der Zähler nicht auf 0 
initialisiert wird, sondern einige Zähler vorgegeben werden.

Bei a) ist der Taktausgang wenn auf 32.768kHz programmiert eben genau 
weil temperaturkompensiert.
Bei b) hingegen geht der Quarz und damit der 32.768kHz Takt je nach 
Temperaturgang leicht falsch.
Der 1Hz-Ausgang ist aber in beiden Fällen temperaturkompensiert und 
damit zu bevorzugen.

Bauform B. schrieb:
> vielleicht mit einer
> Kapazitätsdiode?

Kondensatorbank mit PROM-LUT, soweit mir bekannt.
Stand früher auch im Dabla oder einer Appnote.

: Bearbeitet durch User
von Philipp K. (philipp_k59)


Lesenswert?

Jens M. schrieb:
> Kondensatorbank mit PROM-LUT, soweit mir bekannt.
> Stand früher auch im Dabla oder einer Appnote.

Jepp, das wird in der "Aging Offset Register" Beschreibung erklärt.. man 
kann so Kondensatoren als Grundlast aktivieren oder deaktivieren um 
sogar noch Feintuning zu betreiben.

One LSB represents one small capacitor to be switched in or out of the 
capacitance array at the crystal pins. The aging offset register capaci-
tance value is added or subtracted from the capacitance value that the 
device calculates for each temperature compensation.

von Martin S. (mmaddin)


Lesenswert?

Rainer W. schrieb:
> RC-Oszillators bestimmen und den Gang seiner Software-Uhr immer
> entsprechend korrigieren

mache ich auch so. 1x am Tag, immer morgens um drei. ich berechne mir 
die ms Abweichung pro minute und stelle den internen Softtimer für die 
Uhr entsprechend ein, sodass immer in der 59. Sekunde einer Minute etwas 
korrigiert wird. So läuft sie den ganzen Tag sehr sehr genau...


Die Abweichung des RC Oszillators liegt erfahrungsgemäß bei bis zu +/- 
100 ms/min. - hab nie im Datenblatt nach der "Genauigkeit" geschaut...

von S. L. (sldt)


Lesenswert?

> Die Abweichung des RC Oszillators liegt erfahrungsgemäß
> bei bis zu +/- 100 ms/min.

Also 1.7 Promille - parbleu!
  Sicher nicht bei einem üblichen ATmega.

von Philipp K. (philipp_k59)


Lesenswert?

S. L. schrieb:
> Also 1.7 Promille - parbleu!
>   Sicher nicht bei einem üblichen ATmega.

kommt drauf an, ich habe einen Atmega auch schon mit einem 5€ Oszillator 
(Edelstahlgehäuse) bestückt. Der hatte mit 16Mhz viel geringere 
Abweichungen als ein 5 €Cent Arduino Onboard Oszillator.

von Jens M. (schuchkleisser)


Lesenswert?

Stell dir mal vor, es gibt Oszillatoren für weniger als 1,50€, die 
1,5ppm absolute Toleranz (plus 0,5ppm für -40-85°C, plus ß,5ppm 
Alterung) bieten.
Leider nur 3,3V, aber man muss ja nicht unbedingt einen 5V-Prozessor 
benutzen.

von S. L. (sldt)


Lesenswert?

an Philipp K.:

Sie haben aber schon verstanden, dass von einem RC-Oszillator die Rede 
war?

von Alexander (alecxs)


Lesenswert?

Ich will auch mal gesiezt werden!

von Dirk F. (dirkf)


Lesenswert?

Jens M. schrieb:
> plus 0,5ppm für -40-85°C

Doch wahrscheinlich  0,5ppm / K  ?

von Jens M. (schuchkleisser)


Lesenswert?

Ne, ist ein TCXO, ich verstehe den Wert als "insgesamt".

Quote Dabla ECS-TXO-2016MV 
https://www.mouser.de/datasheet/3/294/1/ECS-TXO-2016MV.pdf
1
Tolerance at +25°C ± 2.0 ppm
2
Vs. Temp (-30 ~ +85°C) ±2.0 ppm
3
Vs. Temp (-40 ~ +85°C) ± 2.5 ppm
War jetzt eben schnell eine Mousersuche 16MHz/TCXO/CMOS-Output
Mit "Clipped Sine" gibts noch bessere für wenige Geld.

von Rahul D. (rahul)


Lesenswert?

Alexander schrieb:
> Ich will auch mal gesiezt werden!

Werd' volljährig! Und benimm dich so!

von Alexander (alecxs)


Lesenswert?

Aus dem Alter bin ich raus.

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.