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.

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.