Hallo, Ich habe mir ein paar Beispielprojekte für DCF77-Emfang angesehen. Der Sekundentimer des AVR sorgt meistens dafür, dass die Uhrzeit auch ohne DCF77-Signal weiter läuft. Aber auch mit Signal wird bei den meisten Uhren der Timer verwendet, um die Sekunde weiterzuzählen. Wie wird erreicht, dass die Timer-Flanke mit dem DCF77-Sekundenbeginn synchronisiert wird? Reicht es hierbei aus, den Timer des AVR einfach auf 0 zu setzen, wenn die Interrupt-Routine eine neue Minute detektiert? Irgendwie habe ich das Prinzip noch nicht ganz verstanden, wie man sicherstellt, dass die Sekunden (DCF77 und Uhr) immer gleichzeitig weiterzählen. (Meine gekaufte Funkuhr neben dem PC tickt bspw. im gleichen Takt wie die Funkuhr-Anzeige einer Internetseite) Die Frage wurde in einem anderem Thread vlt. schon beantwortet: > Woher weis ich aber genau,dass eine Sekunde beginnt? Der Counter in > meiner Uhr fängt zu einem beliebigen Zeitpunkt an zu zählen. Da muss der Counter halt syncronisiert werden. Im allgemeinen wartet man auf die 59. Sekunde und mit der steigenden Flanke der neuen 0. Sekunde syncronisiert man, zumindest habe ich es so gemacht und erreiche damit eine ausreichende Genauigkeit (besser 1ms) innerhalb der CPU. Quelle: [[DCF77 Grundsatzfrage: Phasengleichheit ?]] Trotzdem ist mir nicht so ganz klar, was hier wie synchronisiert werden soll/(kann).....
Malte schrieb: > Irgendwie habe ich das Prinzip noch nicht ganz verstanden, wie man > sicherstellt, dass die Sekunden (DCF77 und Uhr) immer gleichzeitig > weiterzählen. Mann stellt man es nicht sicher. Die meisten Uhren synchronisieren nur einmal pro Stunde, manche sogar nur einmal pro Tag auf das DCF-Signal. Ansonsten läuft der Timer quarzgetaktet weiter, das ist genau genug.
Man könnte sich mal die Doku zum NTP Daemon anschauen und Ideen auf DCF-77 übernehmen. Der NTP Daemon ermittelt, wie viel die Uhr des Rechner zu schnell oder zu langsam läuft. Mit diesem Wissen wird die Uhr anschließend fortlaufend korrigiert. Die eingentliche Synchronisation (Sprunghaftes Umstellen auf die richtige Zeit) findet auch bei NTP nur in größeren Abständen statt, z.B. einmal täglich. Im Idealfall genügt bereits die fortlaufende Korrektur.
Malte schrieb: > ... > Trotzdem ist mir nicht so ganz klar, was hier wie synchronisiert werden > soll/(kann)..... Und wie können wir dabei helfen, dass Dir das klarer wird? Stelle bitte eine konkrete Frage.
Malte schrieb: > Wie wird erreicht, dass die Timer-Flanke mit dem > DCF77-Sekundenbeginn synchronisiert wird? Drehen wir die Frage einfach mal um. Wovon hängt es ab, zu welchem Zeitpunkt ein Timer einen bestimmten Zählerstand erreicht? > Reicht es hierbei aus, den Timer des AVR einfach > auf 0 zu setzen, wenn die Interrupt-Routine eine neue Minute detektiert? Hast Du Anlass zu der Vermutung, es könnte weitere notwendige Schritte geben? Welche Aussage in welchem Text genau veranlasst Dich zu dieser Vermutung? Versuche möglichst fokussiert zu denken und zu formulieren. Meine Nachfragen sollen Dir dabei helfen.
Die Betrachtungsweise umdrehen, wie es Andreas bereits schrieb: Man hat eine Quarzuhr. Nebenher läuft ein DCF-HW/SW-Modul; wenn dieses einen gültigen Zeitstempel erkannt hat (einmal pro Tag oder Stunde oder wann auch immer), dann wird dieser (yy-mm-dd hh:mm:ss) in die Quarzuhr übertragen. Wie stefanus schrieb, kann man bei dieser Übertragung in der Quarzuhr noch eine Gangkorrektur berechnen. Sonst ist es wie bei meinem Aldi-Funkwecker, der nur einmal, mitten in der Nacht, synchronisiert, und abends um 22:00 Uhr glatt zwei Sekunden falsch geht.
S. Landolt schrieb: > Sonst ist es wie bei meinem > Aldi-Funkwecker, der nur einmal, mitten in der Nacht, synchronisiert, > und abends um 22:00 Uhr glatt zwei Sekunden falsch geht. Puuuuhhh ...... So eine krasse Misweisung hätte ich bei solch einem hochpreisigen Präzisionsteil nicht erwartet.
> Präzisionsteil
Und wie! Zweimal im Jahr, nämlich bei der Zeitumstellung, geht das Ding
einen ganzen Tag lang eine Stunde falsch.
Hi, Malte, > Wie wird erreicht, dass die Timer-Flanke mit dem DCF77-Sekundenbeginn > synchronisiert wird? Reicht es hierbei aus, den Timer des AVR einfach > auf 0 zu setzen, wenn die Interrupt-Routine eine neue Minute detektiert? Die simple und naheliegende Lösung findest Du im AtMega-Datenblatt unter "Input Capture Register" (ICR). Die DCF-Flanke überträgt den Zähler in das ICR, und nun hat der Prozessor alle Zeit, den Inhalt des ICR auszuwerten. Idealerweise sollte dort "0" drin stehen. Die Differenz kannst Du auswerten. Beispielsweise um den Quarz Deines AtMega zu ziehen. Vergleichbare Lösungen gibt es für GPS. Ciao Wolfgang Horn
Ich finde, es ist nicht geschickt, die Rtc durch Überschreiben mit dem DCF77-Empfang zu setzen, wenn es sich nicht nur um eine primitive Zeitanzeige handelt, sondern um eine Uhr für Steuerungszwecke, d.h. eine Schaltuhranwendung. Denn bei letzterer gibt es Uhrzeittabellen, in denen irgendwelche Aktivitäten drinstehen, z.B. ein Licht einzuschalten. Wenn durch Überschreiben hart gesetzt wird ist es theoretisch möglich, daß der Schaltzeitpunkt aus einer Tabelle übersprungen wird und der Tabelleneintrag dann nicht zur Wirkung kommt. So ein Fehler könnte evt. auch erst in Jahren mal auftreten und ist daher prinzipiell eine schlimme Fehlerquelle. Bei meinen DCF77-gestützten Schaltuhranwendungen lasse ich daher die Rtc schneller oder langsamer laufen, bis sie die DCF77-Zeit erreicht hat. Dadurch fallen niemals Tabelleneinträge flach und das o.g. Problem tritt nicht auf.
Je nach Umsetzung der DCF dekodierung gibt es verschiedene Möglichkeiten. Das zurücksetzen des Timer wertes ist eine, wenn auch eher schlechte Möglichkeit - es gibt für die einzelnen Impluse Toleranzen, und beim Umstellen nahe der 0 kann man da ggf. einen Überlauf verpassen. Die bessere Wahl wäre eher ein Mitteln über viel Pulse und dann ein vorsichtiges Korrigieren in die richtige Richtung. Etwa so wie bei einem PLL. Es ist aber halt die Frage wie es mit dem Rest den Programms zusammen passt.
Wo ist das Problem? Der Eingang wird z.B. im 10ms Timerinterrupt abgetastet. Wird die 0. Sekunde erkannt und war das Telegramm davor fehlerfrei, wird einfach der Sekundenvorteiler auf 100 gesetzt und die neue Zeit übernommen. Ob Delay und Jitter der üblichen Empfängermodule besser 10ms sind, weiß ich nicht. Wo kriegt man heutzutage überhaupt die genaue Zeit her? Die Zeitsignale in Radio und TV gehen ja mehrere 100ms nach durch die AD- und DA-Wandlung auf dem Sendeweg.
zeitler schrieb: > Wenn durch Überschreiben hart gesetzt wird ist es theoretisch möglich, > daß der Schaltzeitpunkt aus einer Tabelle übersprungen wird und der > Tabelleneintrag dann nicht zur Wirkung kommt. So ein Fehler könnte evt. > auch erst in Jahren mal auftreten und ist daher prinzipiell eine > schlimme Fehlerquelle. Das ist für mich in erster Linie ein Denk- und ein daraus resultierender Programmierfehler. Denn wenn der Programmierer sein Hirn auch nur für eine Minute benutzt, dann kommt er darauf, dass Zeitfenster mit "größer" und "kleiner" abgefragt werden müssen. Leider gibt es aber genau solche halbgaren Schaltuhren...
:
Bearbeitet durch Moderator
Hi, Peter, > Wo kriegt man heutzutage überhaupt die genaue Zeit her? > Die Zeitsignale in Radio und TV gehen ja mehrere 100ms nach durch die > AD- und DA-Wandlung auf dem Sendeweg. Wenn Du unter "genau" die Steilheit der abfallenden Flanke von DCF meinst, dann genügt der ICP-Interrupt am Atmega. Als Frequenzreferenz war mir die Steilheit nicht steil genug, deshalb ziehe ich meinen Ofenkristall in Abhängigkeit von der Phase. Die sagt Dir aber nicht, wie spät es ist. Das hat die PTB mit einem bestimmten Betrag des Abfalls von der 100%-Amplitude definiert, ähnlich LORAN. Das wäre wohl vielmals zu messen, jede Sekunde vielleicht dreimal, einmal vor Mikrosekunde "0", einmal kurz davor, einmal kurz danach. Sicher geht's noch besser. Mich interessiert die Schaltung der Messeinrichtung, mit der die PTB in Braunschweig die Genauigkeit der Flanken misst. Ob das so einfach ist wie mit der Schwarzschulter in PAL-Fernsehern? Ciao Wolfgang Horn
Lothar M. schrieb: > Das ist für mich in erster Linie ein Denk- und ein daraus > resultierender Programmierfehler. Denn wenn der Programmierer sein > Hirn auch nur für eine Minute benutzt, dann kommt er darauf, dass > Zeitfenster mit "größer" und "kleiner" abgefragt werden müssen. und logisch bitte noch mit einem Flag wurde geschaltet oder muss geschaltet werden, sonst muss ich ja immer ins "größer" und "kleiner" hüpfen, oder mache ich nun einen Denkfehler?
Hallo Malte, DCF77-Empfang mit Atmega auswerten. Hier ein Beispiel in BASCOM geschrieben: ' DCF77 auf PinB.0 einstellen Config Dcf77 = Pinb.0 , Timer = 1 , Debug = 1 , Check = 1 , Inverted = 1 , 'Gosub = Sectic ' Interrupts müssen aktiviert werden Enable Interrupts ' Datumsformat festlegen Config Date = Dmy , Separator = . Print "Synchronisiere die Uhrzeit mit dem DCF77 Zeitsignal..." ' Auf die Synchronisierung der Uhrzeit mit dem DCF77 Zeitsignal warten While Dcf_status.7 = 0 ' Dcf_status.7 wird auf 1 gesetzt sobald die Zeit erfolgreich synchronisiert wurde ' aktuelle Zeiten (intern und DCF) sowie den Status zum Terminal ausgeben Print "Uhr: " ; Time$ ; " " ; Date$ ; " " ; "DCF: " ; Time(dcf_sec) ; " " ; Date(dcf_day) ; " " ; Dcf_status.7 Wait 1 Wend Print "Uhrzeit erfolgreich synchronisiert! " ; Time$ ; " " ; Date$ ' Hauptschleife des Programms ' (kann weitere Anweisungen enthalten) Do Print Time$ ; " " ; Date$ Loop ' Programmende End Wenn noch fragen zum Programm z.B. 'Gosub = Sectic oder Invertet dann nachfragen. Mit freundlichen Grüßen Fred
Joachim B. schrieb: > sonst muss ich ja immer ins "größer" und "kleiner" hüpfen Warum nicht? Meine Schaltuhr wertet jede Sekunde alle 128 Schaltprogramme für die 8 Ausgänge aus. Das muss man nur 1x incl. Datenstruktur sauber durchdenken, dann geht das ratzfatz...
Lothar M. schrieb: > Warum nicht? > Meine Schaltuhr wertet jede Sekunde alle 128 Schaltprogramme für die 8 > Ausgänge aus. Das muss man nur 1x incl. Datenstruktur sauber > durchdenken, dann geht das ratzfatz... ja wenns "nur" ne Schaltuhr ist. Wenn es ein Timer mit LCD und Unterprogramme oder eine Wordclock hat der µC noch einiges mehr zu tun und da ich kein begnadeter Progger bin stört mich jede verlorene Zeit und ich setze lieber Flags, Job erfüllt oder nicht und entscheide dann bevor ich unnötig in die Abfragen hüpfe. Ich gestehe aber ich untersuche nicht jede Zeitdauer jeder Routine.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.