Mit einem DCF77-Funkempfängermodul ausgestattet, bezieht der RasPi nicht nur eine präzise Uhrzeit für alltägliche Anwendungen, sondern stellt diese auch im Netzwerk zur Verfügung.
README
Der RasPi ist ein zeitlos gutes Spielzeug – buchstäblich, denn er verfügt über keinen Uhren-Chip. Mit einem Empfänger für den Zeitzeichensender DCF77 synchronisiert sich der RasPi direkt mit der Atomuhr der Physikalisch-Technischen Bundesanstalt und somit mit der offiziellen Zeit Deutschlands. Fast schon nebenbei versorgt er als Stratum-1-NTP-Zeitserver andere Rechner im lokalen Netzwerk mit dieser Zeitinformation.
Wenn Sie schon einmal die Meldungen beim Hochfahren eines Raspberry Pis im Detail verfolgt haben, dann konnten Sie dabei feststellen, dass beim ersten Setzen der Systemuhr sowohl das Datum als auch die Uhrzeit in der Vergangenheit liegen – zum Teil recht deutlich, was davon abhängt wie lange der RasPi ausgeschaltet war.
Bei genauerem Hinsehen fällt außerdem auf, dass diese Zeit beim ersten Start der Distribution Raspbian “Wheezy” nur wenige Minuten vor dem Zeitstempel des Distributionabbilds liegt (Listing 1).
Listing 1
-rw-r--r-- 1 pi pi 1939865600 Mai 25 19:59 2013-05-25-wheezy-raspbian.img [...] Starting fake hwclock: loading system time. Sat May 25 17:56:59 UTC 2013 [...]
Das liegt daran, dass es weder im Systemchip des RasPis noch sonst irgendwo auf dem Board des Minirechners eine permanent laufende Real-Time-Clock (RTC) gibt, so wie sie jeder PC, jedes Notebook, Handy oder Tablet mitbringt. Daher lädt der Raspberry Pi die Systemzeit bei jedem Systemstart aus der Datei /etc/fake-hwclock.data, die bei jeder Raspbian-Version deren Entstehungszeitpunkt verewigt – beim Release 2013-05-25 eben dem 25. Mai 2013 um 17:56:59 Uhr UTC (was kurz vor 19:57 Uhr CEST entspricht – siehe Dateidatum des Raspbian-Images).
Schon kurze Zeit nach dem Systemstart stimmt die Zeit dann allerdings auf wenige Millisekunden genau – vorausgesetzt, der RasPi hat Zugang zum Internet. Dafür sorgen das Programm ntpdate und der Daemonntpd (siehe Kasten “Der NTP-Daemon”), die über das Network Time Protocol NTP [1] mindestens einen NTP-Zeitserver kontaktieren.
Der NTP-Daemon
Der NTP-Daemon fungiert als Server und Client zugleich. Seine wesentliche Aufgabe besteht darin, die lokale Systemzeit im Kernel zu stellen und zu regeln. Als Client steht er über das Network Time Protocol NTP mit anderen Zeitservern im Internet in Verbindung und synchronisiert die lokale Zeit mit deren Zeitangaben über einen Phase-Locked-Loop-Regler (PLL). Zusätzlich kann der Daemon die Zeitinformation auch aus verschiedenen lokal angeschlossenen Zeitnormalen [3] beziehen. Gleichzeitig bietet er seine Zeitinformation per NTP im Netzwerk zur Synchronisation an.
NTP sieht zum Absichern der Qualität den Aufbau einer Zeitserver-Hierarchie vor, die jedem einzelnen Zeitserver jeweils einen sogenannten Stratum-Wert zuordnet. Der Wert 0 gilt für ein Zeitnormal (etwa eine Atomuhr oder einen Zeitzeichenempfänger), Werte größer 15 bezeichnen unsynchronisierte Uhren. Dabei erhält ein Zeitserver, der sich gegen ein Stratum(n)-Gerät synchronisiert, selbst einen Stratum-Wert von n+1.
Dabei setzt Ntpdate beim Hochfahren der Netzwerkschnittstelle die Systemzeit. Ntpd synchronisiert dann während der gesamten Laufzeit die lokale Systemzeit im Kernel mit der eines Zeitservers im Netz. Das kann er freilich nur bis zum nächsten Systemstopp, bei dem er dann die aktuelle Systemzeit für den Neustart in der bereits erwähnten Datei /etc/fake-hwclock.data sichert. Dieser Zeitstempel taucht dann beim nächsten Start des RasPi als initiale Systemzeit wieder auf. Im Embedded-Bereich ohne Internetzugang, aber auch in Inselnetzwerken reicht das nicht – doch guter Rat ist hier erfreulicherweise nicht teuer.
In Mainflingen bei Frankfurt am Main steht der Zeitzeichensender DCF77. Die Hüterin der deutschen Zeit, die Physikalisch-Technische Bundesanstalt (PTB, [2]) sendet über diesen eine Normalfrequenz von 77,5 kHz und, diesem Träger aufmoduliert, eine von einer Atomuhr stammende Zeitinformation aus. Jede Funkuhr im Umkreis von bis zu 2000 Kilometern (Abbildung 1) kann von dort ihren Zeit-Wert beziehen. Theoretisch könnte mithilfe des ausgestrahlten Zeitzeichensignals jeder Empfänger seine Systemzeit binnen einer Minute auf wenige Millisekunden Versatz genau abgleichen und langfristig auf etwa eine Mikrosekunde phasensynchron halten (siehe Kasten “DCF77-Zeitzeichen und Empfängermodule”).
Für den praktischen Einsatz im Embedded-Bereich gibt es recht einfache und preisgünstige DCF77-Empfängermodule (siehe Tabelle “DCF77-Empfängermodule: Bezugsquellen”). Zwei davon – jene der Anbieter Conrad und Pollin – kamen für diesen Artikel zum Einsatz und bewiesen dabei ihre Tauglichkeit (Abbildung 2).
DCF77-Zeitzeichen und Empfängermodule
Für den Embedded-Bereich geeignete DCF77-Empfängermodule bieten ein aus der AM-Hüllkurve des 77,5-kHz-Trägers demoduliertes, digitales Signal an. Dieser serielle Datenstrom überträgt mit 1 bit/s einen 60-Bit-Datenblock pro Minute, in minutensynchrone Rahmen zusammengefasst. Die einzelnen Bits sind in den Pulsbreiten (100 ms: “0”, 200ms: “1”) kodiert. An einer seriellen Schnittstelle angeschlossen, kann ein spezieller Treiber im NTP-Daemon dieses Signal dekodieren.
Neben einigen anderen Informationen überträgt das DCF77-Signal Uhrzeit und Datum minutengenau in jedem Datenblock. Der Rahmenstart selbst legt auch den Startzeitpunkt der Minute fest. Zwar lässt sich die Zeitinformation im Datenpaket recht einfach dekodieren, doch die Genauigkeit jedes Pulsstart-Zeitpunkts hängt sehr von der Bandbreite und Qualität des Empfängers ab. Bei den in der Tabelle “DCF77-Empfängermodule: Bezugsquellen” vorgestellten Empfängern kann man mit einer Grundunsicherheit im Millisekundenbereich rechnen.
Tabelle “DCF77-Empfängermodule: Bezugsquellen”
|
Anbieter |
WWW |
Produkt |
Artikelnummer |
|---|---|---|---|
|
Conrad |
C-Control DCF-Empfängerplatine |
641138-62 |
|
|
ELV |
DCF-Empfangsmodul DCF-2 |
68-091610 |
|
|
Pollin |
DCF-Empfangsmodul DCF1 |
810054 |
|
|
Reichelt |
DCF77-Modul |
DCF77 MODUL |
Serielle Schnittstelle
Normalerweise ist am RasPi die serielle Schnittstelle /dev/ttyAMA0 schon belegt: Beim Systemstart dient sie als Konsole für den Kernel-Debugger und zur Ausgabe der Boot-Meldungen, danach bietet der Minirechner dort ein Login-Terminal an.
Um das Empfängermodul betreiben zu können, müssen Sie diese Funktionen in den entsprechenden Konfigurationsdateien deaktivieren. Dazu entfernen Sie aus der Kernel-Kommandozeile in der Datei /boot/cmdline.txt alle Einträge, die ttyAMA0 enthalten (Listing 2). Außerdem kommentieren Sie in der Datei /etc/inittab die Zeile mit ttyAMA0 aus (Listing 3). Nach dem nächsten Systemstart ist die serielle Schnittstelle dann frei.








