Habe mal einige Messung gemacht mit 2 Aufbauten und der gleichen Software und mehrere Tage laufen lassen. (Nach dem Einschalten der RTC habe ich zur Sicherheit noch 100us und vor dem Ausschalten ebenfalls 100us delay eingefügt.) Dann habe ich über ca. 12h die Zeiten gemessen (bei beiden RTCs sind die Ladedioden abgetrennt, da kein Akku drin steckt):
Aufbau A) (Steckbrett):
Hier wurde die RTC ständig (1x / sec) eingeschaltet, ausgelesen und ausgeschaltet. Zum erwarteten Synchronisationssignal wurde die RTC 10ms vorher eingeschaltet und danach wieder aus. Das hat ohne Probleme funktioniert, nachdem ich einen 100nF C in die VCC der RTC ergänzt hatte! Die 100us delays alleine halfen nicht.
Konnte mir bei dem Aufbau die Spannung an der RTC leider noch nicht mit/ohne C ansehen. Aber es scheint mit der Versorgungsspannung der RTC zu tun zu haben. Mein Code selbst scheint nicht das Problem zu sein.
Nur warum bleibt der Code hängen, wenn die RTC nicht oder nicht richtig Antwortet da sie (offensichtlich) Versorgungsspannungsprobleme hatte?? Also doch die RTC-Library?
Laufzeit laut PC-Uhr: 12:12:30,991
Laufzeit laut RTC: 12:12:31,000 (ms werden von RTC nicht ausgegeben)
Laufzeit laut millis(): 12:11:55,968
Laufzeit millisync(): 12:12:31,008 (basiert auf millis(), wurde aber alle 5s mit RTC Signal synchronisiert)
PC und RTC sind nahezu identisch, die millis() geht hoch gerechnet auf 24h 68,9s nach. Das entspricht 0,08% oder 797ppm.
Für einen Datenlogger der Monate läuft schon doof, wenn (rechnerisch) nach 6 Monaten ca. 3,5h oder 12 Monaten fast 7h Versatz drin ist.
Aufbau B (Gehäuse):
Hier lief die RTC nicht fehlerfrei, wenn sie ein- und aus geschaltet wird. Der Trick mit dem 100nF C hat hier nicht funktioniert, daher habe ich die RTC auf Dauer +5V geklemmt (muss unbedingt mal mit dem Osszi schauen). So lief sie zumindest mal auch mehrere Tage fehlerfrei durch. Die Zeitmessung hier:
Laufzeit laut PC-Uhr: 12:12:29,974
Laufzeit laut RTC: 12:12:30,000 (ms werden von RTC nicht ausgegeben)
Laufzeit laut millis(): 12:12:19,440
Laufzeit millisync(): 12:12:29,999 (basiert auf millis(), wurde aber alle 5s mit RTC Signal synchronisiert)
Das sind 0,02% bzw. 240ppm Fehler oder 20sec/Tag, 20min/Monat 2h/Jahr, was schon viel besser und akzeptabel ist.
Besonders freue ich mich aber, dass das angedachte Prinzip, mit der RTC synchronisierte ms nutzen zu können anscheinend Funktioniert und gleichzeitig kann man Strom sparen indem die RTC 90% der Zeit aus bleibt (zumindest bei 1 von 2 Aufbauten). :)
PS: Wobei bei Verwendung eines Akkus in der RTC natürlich noch untersucht werden müsste, ob die RTC nicht doch einen mind. Anteil eingeschaltet bleiben sollte um den Ladezustand des RTC-Akkus zu waren. ;)