DCF77
From Lochraster
Contents |
[edit] Was ist DCF77?
Der Begriff DCF77 steht für einen Langwellensender in der Nähe von Frankfurt/M., der für Deutschland ein amtliches Zeitsignal ausstrahlt. Amtlich deshalb, weil die eingespeisten Zeitinformationen aus einer Atomuhr der Physikalisch-Technische Bundesanstalt stammen, welche per Gesetz mit der offiziellen "Zeitherstellung" für Deutschland beauftragt ist.
Die Zeitinformation wird in 59 Bits, verteilt über eine Minute, im 1-Sekundentakt, als Austastlücken der Langwellenträgerfrequenz übermittelt. Die Dauer der Austastlücke kennzeichnet, ob es sich um eine 0 oder 1 handelt. Die genaue Kodierung und weitere Informationen zu diesem Thema sind hier zu finden:
[edit] DCF77-Lösungen fürs Ethterrape
[edit] Variante von Uwe
[edit] Hardware
Für meine hier beschriebene Lösung habe ich das DCF77-Empfangsmodul von ELV (Artikelnummer 68-352-62) verwendet. Mit Sicherheit ist auch jedes ähnlich aufgebaute Modul anderer Hersteller verwendbar.
Das ELV-Modul besteht aus einer kleinen Ferrit-Antenne und etwas Elektronik mit einen Opencollector-Ausgang, welcher direkt mit einem Pin des Atmels (plus eines Widerstandes nach Plus) verbunden werden kann. Die DCF77-Impulse am Modul-Ausgang sind soweit aufbereitet, dass sie elektrisch eine "sicheres" LOW bzw. HIGHT ergeben. Der Signalimpuls selbst ist dabei ein LOW-Impuls, dessen Dauer dann eine 0 (>60ms) oder 1 (>150ms) der Zeitinformation kennzeichnet.
Eigentlich zu Debuggingzwecken, aber doch ganz lustig und nützlich, ist an einem weiteren Atmel-Pin eine LED angeschlossen, die beim Empfang des Zeitzeichens leuchtet. Dabei blinkt sie im Takt der LOW-Impulse. Ab dem Empfang einer vollständigen Zeitinformation wird aus dem Blinken ein Dauerleuchten. Wird ein undefinierbarer Zeitimpuls erkannt, blinkt die LED wieder. Die LED in meinem Aufbau ist als LOW-aktiv verschaltet.
Ich denke ein Schaltplan erübrigt sich für diesen einfachen Aufbau...
[edit] Software
Hier der entsprechende Code-Schnipsel.
Eine der Hauptaufgaben der Software ist es, die Dauer der LOW-Impulse am Pin, an welchem das DCF77-Modul angeschlossen ist, zu messen und danach, wenn ein Zeitsignal (59 Impulse) vollständig empfangen wurde, diese zu Datum/Uhrzeit zu decodieren.
Das Erkennen des LOW-Impulses übernimmt eine Interrupt-Routine, welche durch einen Pegelwechsel am DCF77-Pin angesprungen wird. Innerhalb dieser Routine werden diverse Merker und Zähler ausgewertet bzw. gesetzt, die den aktuellen Zustand des empfangenen Zeitzeichens kennzeichnen.
Die Dauer eines Impulses und der Austastlücke in der 59.Sekunde der Minute (siehe DCF77-Signalbeschreibung in den oben angegebenen Links) wird mit Hilfe einer ständig laufenden Timer-Overflow-Interrupt-Routine ermittelt. Der Timer ist so parametriert, dass der Interrupt jede Millisekunde ausgelöst wird. Gleichzeitig dient dieser Timer-Interrupt auch als Zeitbasis für einen Unixzeit-Zähler (globale Variable base_sec
und base_sec_valid
), welcher unabhängig von der DCF77-Zeit läuft, aber durch diese synchronisiert wird.
Weiterhin sind noch einige Routinen enthalten, die eine Umrechnung von Unixzeit von/nach Datum/Uhrzeit im "Klartext" ermöglichen und auch in anderen Programmmodulen verwendet werden können. Ich habe u.a. noch ein Modul geschrieben, welches ein "Andocken" via telnet an das Etherrape und das Absetzen von Kommandos ermöglicht, also um z.B. Datum/Uhrzeit des Mikrocontrollersystemes abzufragen oder zu setzen.
Achso, prinzipiell muß nur die Routine dcf77_init()
an geeigneter Stelle innerhalb der Etherrape-Firmware einmal aufgerufen werden. Dabei werden beide oben erwähnten Interrupte initialisiert und "scharf" geschaltet.
Achtung: Ich bin nicht DER C-Programmierer, der den konformsten, optimalsten und schönsten Code schreibt. Für konstruktive Hinweise und Ideen habe ich jederzeit ein offenes Ohr. Mit Sicherheit habe ich z.B. zu viele globale Variable als volatile
deklariert...
[edit] Erweiterungsideen
Wenn ich mal viel Zeit und Lust habe, möchte ich noch einen SNTP-Client und -Server für das Etherrape implementieren. Der Client soll eine gültige Zeitinformation aus dem Internet holen, falls mal das DCF77-Signal nicht empfangen werden kann. Der Server soll aus dem Netz ansprechbar sein, um andere Rechner mit einer synchronisierten Zeitinformation versorgen zu können. Eine SNTP-Client-Version war bereits einmal in einem frühen Stadium der orginalen Etherrape-Firmware enthalten.