rtc - generelle Frage

OP #7959937
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...

#7959981
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
#7959988
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.

#7960122
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
#7960134
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.

#7960169
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.

#7960182
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
#7960586
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.

#7960613
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?

#7960772
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
#7960777
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.

#7960863
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.

#7960880
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.

(Firma: Gast) #7960906
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
#7960930
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 :)

#7960932
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.

#7960974
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
#7961037
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.

#7962015
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...

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