Forum: Mikrocontroller und Digitale Elektronik DCF77 (Sekunden Synchronisieren)


von Malte (Gast)


Lesenswert?

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

von Andreas (Gast)


Lesenswert?

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.

von Stefan F. (Gast)


Lesenswert?

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.

von Klaus (Gast)


Lesenswert?

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.

von Klaus (Gast)


Lesenswert?

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.

von S. Landolt (Gast)


Lesenswert?

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.

von Mitlesa (Gast)


Lesenswert?

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.

von S. Landolt (Gast)


Lesenswert?

> Präzisionsteil

Und wie! Zweimal im Jahr, nämlich bei der Zeitumstellung, geht das Ding 
einen ganzen Tag lang eine Stunde falsch.

von Wolfgang H. (Firma: AknF) (wolfgang_horn)


Lesenswert?

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

von zeitler (Gast)


Lesenswert?

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.

von Lurchi (Gast)


Lesenswert?

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.

von Peter D. (peda)


Lesenswert?

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.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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
von Wolfgang H. (Firma: AknF) (wolfgang_horn)


Lesenswert?

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

von Joachim B. (jar)


Lesenswert?

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?

von Fred R. (fredylich)


Lesenswert?

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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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

von Joachim B. (jar)


Lesenswert?

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
Noch kein Account? Hier anmelden.