Klingt doch nicht sooo schwierig,
ich würde es so versuchen.
Wir haben :
-einen Zeittakt (Quarz -> Prescaler -> TimerInterrupt) der mit einen
Drift behaftet ist.
-Wir haben die Genaue Zeit welche mit einen Offset behaftet ist.
(Übertragungsweg, verarbeitung in Deinem Programm)
Ich denke der Offset vom DCF77 und deinem Controller/Verarbeitung ist zu
vernachlässigen ;)
Wenn Du deine beiden Uhren vergleichst wirst Du irgendwann eine
Abweichung feststellen.
Abweichung = DCF77 Uhr - TimerUhr.
Wenn Abweichung ungleich null wird es spannend :
Ist unsere Abweichung Positiv dann läuft unsere TimerUhr langsamer als
die DCF77.
Der TimerInterrupt zum weiterzählen unserer internen Uhr muss
grundsätzlich nach weniger Ticks aufgerufen werden.
Jetzt müssen wir zwei Dinge bedenken :
1. wir müssen den Timmer Interrupt welcher unsere interne Uhr antreibt
schneller zählen lassen.
Kennt man die aktuelle und die letzte Uhrzeit beider Uhren kann man
deren Differenz ausrechnen.
DCF77 Uhr lief z.b. 3600s
Timer Uhr lief z.B. 3580s
Unsere TimerUhr muss also 5,6 Promille schneller laufen -> Also
Comparewert für den Timerinterrupt abändern...
(Achtung bei Tageswechsel, oder UnixZeit benutzen...!!!)
2. Wir können nicht einfach die neue, richtige Zeit übernehmen.
Im extremfall kann dann z.B. unser Wecker nicht mehr anschlagen,
oder was auch immer mit der Zeit gesteuert wird.
(Der "Zeitsprung" springt quasi über den Alarm drüber...)
Im Endeffekt muss unsere Uhr über jede kleinste Zeiteinheit laufen.
(mit der wir rechnen)
Wir wollen uns also gleitend an die richtige Uhrzeit annähern.
Deshalb muss die Uhr eine bestimmte Zeit lang noch schneller laufen.
============--==--==--==--==--==--==--=
--
--
--
--
--
Die Gleichzeichen stellen die Refernzuhr dar.
Wir nähern uns jetzt mit unserer Timer Uhr, das sind die -- Zeichen
unserem Zeitnormal an.
Unter punkt eins haben wir den Drift unseres Quarz oder was auch immer
kompensiert.
Bei Punkt zwei überlagern wir für eine bestimmte Zeit unseren Drift.
Wir gehen jetzt mal davon aus das sich kein neuer Drift ergeben hat.
Theoretisch wissen wir nach wieviel Interrupts/Ticks unsere Uhr beim
Zeitnormal angekommen ist und nehmen unseren Drift von Punkt2 wieder
raus.
Beim nächten Abgleich haben wir wahrscheinlich wieder einen kleinen
drift und das spiel geht von vorne los...
PS :
Die Steigung der "--" Zeichen ist ein Zielkonflikt.
Ist die Steigung zu gross sieht man von aussen das "rennen" der Uhr.
Ist die Steigung zu klein nähert man sich bei steigendem Drift niemals
wirklich an.
Es mach meiner Meinung nach Sinn die Steigung auf einen bestimmten
Betrag zu begrenzen.
z.B. 10ms / 1s
Man bräuchte dann 100 Sekunden um 1 Sekunde Abweichung zu ändern.