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.
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...
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.