Forum: Mikrocontroller und Digitale Elektronik RTC3231 SQW-Ausgang und DCF77-Modul-Ausgang nicht synchron


von Martin (Gast)


Lesenswert?

Momentan beschäftige ich mich mit dem RTC-Modul DS3231 und dem 
DCF77-Funksignal für ein Arduino Nano 
Uhren-/Wetterstation-/Kalender-Projekt.

Das Funksignal wird mit der "DCF77.h"-Library ausgewertet 
(https://github.com/thijse/Arduino-DCF77).

Das DS3231 hat einen SQW-Ausgang, der auf 1Hz eingestellt werden kann. 
Eine gegen VCC angeschlossene LED blinkt dann im Sekundentakt. Ich gehe 
davon aus, dass der SQW-Takt zum RTC-Sekundentakt synchronisiert läuft.

Weiterhin kann man am Ausgangspin des DCF77-Moduls mit einer LED den 
Takt des DCF77-Signals anzeigen lassen (100ms bzw. 200ms Impulse).

Im Sketch frage ich regelmäßig die DCF-Zeit ab (alle 10 min), 
synchronisiere dann die RTC-Zeit damit und die interne 
Arduino-Systemzeit. Die Systemzeit wird zudem alle 300 s mit der RTC 
abgeglichen (setSyncProvider(syncProvider)).

Damit sollten doch die LED am SQW-Ausgang und die LED am DCF77-Modul im 
Gleichtakt blinken (die RTC-LED natürlich mit 500ms ON und 500ms OFF), 
oder? Zumindest eine zeitlang.

Das passiert jedoch nicht: die beiden LEDs blinken zwar im Sekundentakt 
aber unsynchronisiert.

Was mache ich hier falsch?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Martin schrieb:
> Was mache ich hier falsch?
Das hier:
> Ich gehe davon aus...
... dass der Sekundenvorteiler (im Übersichtsbild im Datenblatt DIVIDER 
genannt) beim Schreiben der RTC zurückgesetzt wird und in diesem 
Augenblick der SQW Ausgang einen definierten Pegel einnimmt.

Ich kann in dem Datenblatt aber nichts finden, das ein solches 
"Subsekunden"-Management beinhaltet. Deshalb würde ich davon ausgehen, 
dass der Prescaler einfach weiterläuft und die LED auch beim Schreiben 
einfach ohne kurzes "Stolpern"  weiterblinkt.

: Bearbeitet durch Moderator
von Philipp K. (philipp_k59)


Lesenswert?

Ich denke es ist einfach das der DS3231 nur ganze Sekunden kennt.

Wenn man Jetzt die Zeit setzt ist es 21:01:21.000

wenn man die Zeit um 21:01:21.500 setzt zählt der RTC 21:01:21.000 
ebenso zählt der Zähler für die 1Hz los..

da ist 32khz besser.. dann muss man halt ein bisschen für die Syncro 
zählen, garantiert aber den Gleichlauf.

: Bearbeitet durch User
von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Philipp K. schrieb:
> wenn man die Zeit um 21:01:21.500 setzt zählt der RTC 21:01:21.000
> ebenso zählt der Zähler für die 1Hz los..
Das ist die andere Variante. Dann könnte man aber diesen .xxx 
Subsekundenzähler und damit das LED-Verhalten an den DCF77 anpassen.

Weil das aber scheinbar nicht geht, vermute ich, dass wenn die Zeit 
gerade 11:11:11.400 ist und ich die auf 12:12:12 setze, dann die Uhr 
intern mit 12:12:12.401 weiterläuft und eben nicht mit 12:12:12.000

von Philipp K. (philipp_k59)


Lesenswert?

Lothar M. schrieb:
> Weil das aber scheinbar nicht geht, vermute ich, dass wenn die Zeit
> gerade 11:11:11.400 ist und ich die auf 12:12:12 setze, dann die Uhr
> intern mit 12:12:12.401 weiterläuft und eben nicht mit 12:12:12.000

Müsste so sein weil...

wenn man Batterie und VCC wegnimmt muss man bei anlegen der 
Spannung/Batterie das Oszillator-Stop Bit löschen.. damit geht dann die 
Rechnung los und dort kann man das angleichen.

von Martin (Gast)


Lesenswert?

Im Datenblatt https://datasheets.maximintegrated.com/en/ds/DS3231.pdf 
steht auf S. 12 unten links:

"The countdown chain is reset whenever the seconds
register is written. Write transfers occur on the acknowledge from the 
DS3231. Once the countdown chain is
reset, to avoid rollover issues the remaining time and
date registers must be written within 1 second. The 1Hz
square-wave output, if enabled, transitions high 500ms
after the seconds data transfer, provided the oscillator is
already running."

Der letzte Satz klingt nach 500ms Verzögerung zwischen Sekundentakt und 
SQW-Pin, oder? Rein optisch könnte das bei meinen beiden LEDs hinkommen.

von Ozvald K. (Gast)


Lesenswert?

Martin schrieb:
> die beiden LEDs blinken zwar im Sekundentakt
> aber unsynchronisiert.

Hast du die DS3231 aus China? Ich habe dieselbe Erfahrung gemacht mit 
DS1307, Chinesischer Nachbau. Obwohl im Datenblatt steht, dass die 
Teilerkette mit Schreiben der Sekunden zurückgesetzt wird, passiert es 
nicht. Habe auch 2 Stück original DS1307 gekauft um es zu testen. Die 
original IC-s benehmen sich wie im Datenblatt geschrieben, sie zählen 
genau 1 Sekunde nach dem Schreiben weiter. Offensichtlich weist deine 
DS3231 IC denselben Mangel auf.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Martin schrieb:
> The 1Hz
> square-wave output, if enabled, transitions high 500ms
> after the seconds data transfer, provided the oscillator is
> already running."
> Der letzte Satz klingt nach 500ms Verzögerung zwischen Sekundentakt und
> SQW-Pin, oder?
Nein, das hört sich an wie wenn der SQW Ausgang nach einem Reset wie 
jedes anständige andere Zählerbit mit 0 beginnt,  dann nach 500ms nach 1 
wechselt, dann wieder nach 500ms auf 0 und nach weiteren 500ms wieder 
nach 1 usw, usf...

Dann wäre das Blinken völlig synchron zu der DCF LED, nur eben 
abwechselnd. Das dürfte aber leicht zu erkennen sein.

von Martin (Gast)


Lesenswert?

Die DS3231 stammen von AZDelivery und kommen ws. aus China. Auf dem Chip 
steht z.B. DS3231N, 1204A3, 586AA (habe hier mehrere rumliegen aus 
verschiedenen Chargen).

von Wolfgang W. (Gast)


Lesenswert?

Hallo, ich habe über die Bucht eine 2-stellige Anzahl von Modulen mit 
DS3231 und DS3231M (mit etwas geringerer Anfangsgenauigkeit) über die 
letzten 4 Jahre bestellt und getestet. Die Offsets 0x07 bis 0x0f habe 
ich alle zu 0 gesetzt, um den 1-Hz-SQW-Ausgang zu benutzen. Bisher alle 
Module funktionieren, d. h. bei der Zeiteinstellung wird durch 
abschliessendes Beschreiben des Offsets 0x00 (sec) wieder 
synchronisiert, d.h. der O. D. SQW-Ausgang schaltet zum Sekundenbeginn 
wie erwartet auf low.
Der DS3231M mit MEMS-Oszillator weist im Offset 0x0eh Unterschiede auf: 
er ist fest auf 1-Hz-Teiler eingestellt. Um die M-Typen auf die gleichen 
Grund-Genauigkeiten zu bekommen, ist in der Regel ein Abgleich über 
Offset 0x10 nötig.
Bei manchen Lieferungen waren die Module gemischt bestückt. Es gab auch 
den Fall, dass auf dem Händlerfoto normale DS3231 waren, bei den 
gelieferten aber dann M-Typen bestückt waren.

von Martin (Gast)


Lesenswert?

Mit Offset meinst Du die Register-Adressen des DS3231 ?

von Wolfgang W. (Gast)


Lesenswert?

@ Martin:
Richtig, die Register-Adressen 0x00 bis 0x06 sind Uhrzeit und Datum. 
0x07 bis 0x0d sind für die Alarmoptionen. 0x0e ist das Control Register. 
0x0f ist das Status Register. 0x10 ist die 2er-Complement 
Frequenz-Korrektur. 0x11 und 0x12 die Chiptemperatur. Wenn man 0x13 usw. 
anwählt, bekommt man wieder Zugriff auf 0x00 usw.

von Peter D. (peda)


Lesenswert?

Wozu braucht man noch zusätzlich ne RTC, wenn man schon DCF-77 hat?
Nach dem Power On Reset wartet man einfach, bis ein gültiges Paket 
empfangen wurde und synchronisiert damit eine software Uhr/Kalender mit 
einem Timerinterrupt. Man kann dann sogar nach einiger Zeit die Quarzuhr 
feinjustieren und den Korrekturwert im EEPROM ablegen.

von Teo D. (teoderix)


Lesenswert?

Peter D. schrieb:
> bis ein gültiges Paket
> empfangen wurde

[@TO!]
Nur der Vollständigkeit halber: EIN Paket reicht NICHT, um gesichert die 
Aktuelle Zeit/Datum zu erhalten. Am simpelsten ist es die einzelnen 
Teile des Paketes, durch mehrfach einlesen zu verifizieren. Sonnt zeigt 
das bei schlechten Empfang, schneller als man glauben möchte, den 
krudesten Scheiß an!

von Martin (Gast)


Lesenswert?

Peter D. schrieb:
> Wozu braucht man noch zusätzlich ne RTC, wenn man schon DCF-77
> hat?
> Nach dem Power On Reset wartet man einfach, bis ein gültiges Paket
> empfangen wurde und synchronisiert damit eine software Uhr/Kalender mit
> einem Timerinterrupt. Man kann dann sogar nach einiger Zeit die Quarzuhr
> feinjustieren und den Korrekturwert im EEPROM ablegen.

Ganz einfach: Das DCF77-Signal kann gestört sein oder ausfallen und die 
Arduino-interne Uhr über Millis ist zu ungenau.

von Philipp K. (philipp_k59)


Lesenswert?

Peter D. schrieb:
> Man kann dann sogar nach einiger Zeit die Quarzuhr feinjustieren und den
> Korrekturwert im EEPROM ablegen.

Das übliche Thema, wenn man es sorglos und genau haben möchte sind die 
normalen Uhrenquarze raus oder man hat so eine stabile 
Umgebungstemperatur das man nur einmal abgleichen muss. Der ds3132 hat 
es bei mir auf 10 Sekunden im Jahr gebracht. das macht komischerweise 
ca. 2ppm wie im Datenblatt. Dadurch muß ich mich nur alle 2 Jahre um die 
Uhr kümmern. Sommer/Winterzeit mach ich mit einem Kippschalter.

: Bearbeitet durch User
von Stefan F. (Gast)


Lesenswert?

Lothar M. schrieb:
> Dann wäre das Blinken völlig synchron zu der DCF LED, nur eben
> abwechselnd.

Vermutlich meint Martin genau dieses abwechselnde Blinken mit "nicht 
synchron", bzw. "nicht im Gleichtakt".

von Peter D. (peda)


Lesenswert?

Philipp K. schrieb:
> Das übliche Thema, wenn man es sorglos und genau haben möchte sind die
> normalen Uhrenquarze raus

Normale CPU-Quarze (z.B. 11,0592MHz) sind erstaunlich temperaturstabil.
Uhrenquarze sind im Wohnbereich aber oft ausreichend. Und alle paar Tage 
sollte ja wohl der DCF-77 Empfang wieder klappen (vorzugsweise nachts).

Eine zusätzliche RTC ist so überflüssig, wie Gürtel mit Hosenträger.

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.