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?
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.
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.
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
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.
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.
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.
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.
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).
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.
@ 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.
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.
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!
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.
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.
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".
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.