Projekt-Ziel
|
In diesem Projekt soll ein einfacher DCF77-Signalempfänger
mittels eines RS232-Pegelwandlers und etwas Software auf einem
Standard-PC zu einer genauen Zeitbasis im Netzwerk verwendet
werden.
|
Was man braucht: Hardware
|

|
DCF77-Empfänger |

|
RS232-Kabel |

|
etwas 4-adriges Kabel |

|
ein paar Bauteile (Widerstände, Transistoren, siehe unten) |
|
Pegel-Umsetzer von TTL/OpenCollector zu RS232/V24
|
Schaltplan als Postscript
Schaltplan als Acrobat PDF
|
Schaltplanbeschreibung
|
Der DCF77-Empfänger selber benötigt so wenig Strom, dass er
ohne Probleme aus den Signalleitungen der seriellen Schnittstelle versorgt
werden kann. Glücklicherweise kann er mit einer Betriebsspannung von
bis zu 15V versorgt werden. Leider liefert er das rohe DCF77-Signal nur
als OpenCollector-Signal. Deshalb ist der Pegelumsetzer notwendig.
|
Auf der rechten Seite des Schaltplans sind die Anschlussmöglichkeiten
zum PC dargestellt. Da die TxD-Leitung aus Richtung PC in dieser Applikation
nichts zu tun hat, liegt sie im Ruhezustand auf "1", d.h. bei der für
RxD und TxD zur Anwendung kommenden negativen Logik auf -3...-15V, und
liefert eine perfekte, negative Versorgung. Fehlt noch eine positive
Versorgung, die aus DTR oder RTS dauerhaft gewonnen werden kann.
|
C1 und C2 stützen die eingehende Spannungsversorgung, D1 und D2
schützen vor Verpolung. Q1 und Q2 treiben die Signalleitung mit RS232/V24
Pegeln in Richtung PC, um das rohe DCF77-Signal zu übertragen.
Q3 sorgt nur dafür, dass auch der Q2 aus einem auf Masse bezogenen
Steuersignal angesteuert werden kann.
|
Die linke Seite zeigt die Anschlussbelegung in Richtung DCF-Empfänger.
Es sind nur vier Leitungen erforderlich. Allerdings darf man die Signale
/DCF und DCF nicht verwechseln, sonst erzeugt der Pegel-Umsetzer
einen Kurzschluss. Das dürfte zwar zu keiner Zerstörung der
Schaltung führen, jedoch zu einer Nichtfunktion, nach der man unter
Umständen stundenlang sucht.
|
LED D3 hilft beim Ausrichten der Antenne. Ist diese korrekt ausgerichtet,
zeigt sich auf dieser LED ein periodisches Blinken des DCF77-Signals.
Es muss 59 mal im Sekunden-Rhythmus aufleuchten, dann eine Sekunde Pause
machen und dann wieder 59 mal blinken usw. Schaut man es genau an, merkt
man auch, dass es jeweils unterschiedlich lange aufleuchtet. Für eine
Null leuchtet es 100ms, für eine Eins 200ms. In den somit
übertragenen 59 Bits pro Minute steckt kodiert die Uhrzeit und das
Datum.
|
Konfektioniert man sein serielles Kabel selber, hat man hier alle
Freiheitsgrade, ebenfalls den, die positive Versorgung aus RTS oder DTR
zu beziehen. Man muss es nur entsprechend in der NTP Konfiguration
berücksichtigen (siehe mode-Option zum
server-Schlüsselwort).
In meiner Konstellation verwende ich das RS232-Adapterkabel einer alten,
kaputten seriellen Maus. Dort sind nur die Signale RxD, TxD, RTS und Masse
elektrisch verbunden. Somit versorge ich meinen Pegelwandler aus TxD
(negativ) und RTS (positiv).
|
Signalbeschreibung
|
Hier ist der Signalverlauf der beteiligten Schaltungen dargestellt.
Die steigenden Flanken habe ich bewusst schräg gezeichnet, da sie
mittels Pull-Up-Widerstand erzeugt werden und deshalb niemals besonders
steil sind. Die beiden Signale DCF und /DCF sind als OpenCollector
ausgeführt, und daher nur die jeweils fallende Flanke aktiv getrieben.
|
Wie man hier sehen kann, gibt es einmal pro Sekunde beim DCF77-Signal
zwei Informationen: Die eine Information ist der Beginn der Sekunde selbst
(die fallende Flanke des /DCF-Signals) und die andere Information steckt
in der Länge des Impulses. 100ms stehen für ein 0-Bit, 200ms
stehen für ein 1-Bit.
|
Normalerweise müsste man nun die Länge des Impules vermessen,
um die enthaltene Information zu gewinnen. Man kann das Signal aber auch
als asynchrones 8 Bit Datenwort mit 50Bd interpretieren. Dabei entstehen
in Abhängigkeit zu der Länge des Impules spezifische (Fehler-)Muster.
Aus diesen gewinnt der weiter unten erwähnte Raw-DCF-Treiber die
notwendigen Informationen und kann das DCF77-Signal interpretieren.
|
Deshalb genügt es, das reine DCF77-Signal vom Empfänger an
die Pegel einer RS232-Schnittstelle anzupassen und in einen Rechner
einzuspeisen. Den Rest erledigt (wie immer) die Software.
|
|
|
Zusammenbau
|
Wer noch eine alte serielle Maus sein eigen nennt, und diese auch noch
defekt ist, trennt sich sicher gerne von dem elektronischen Nager. Das
Kabel lohnt sich aber aufzuheben. Zumindest als einfaches Terminal-Adapterkabel
taugt es immer, oder wie hier, um "Zeit zu gewinnen".
|
Da das Kabel ordentlich verschweißt ist, sieht es auch gleich
professioneller aus. Sehr praktisch ist auch der 4-polige Buchsen-Adapter
am anderen Ende, erspart es einem doch das Gefiesel mit Einzellitzen. Einfach
eine Stiftleiste (2,54mm Rastermaß) eingelötet und schon hat
man perfekten Kontakt.
|
|
|
In Ordnung, das ist nicht so wichtig. Hier tut es aufgrund der extrem
niedrigen Übertragungsbandbreite (10 Hz) jedes X-beliebige Kabel mit
wenigstens 4 Adern. Ich hatte hier ein Verlängerungskabel für
Telefon-Einrichtungen übrig, was sich prima für diesen Zweck
eignet.
|
|
|
Dieser Teil ist evtl. der Schwierigste, vor allem für den
ungeübten Löter. Es gibt auf der Lochraster-Karte sicher eine
bessere Plazierung der Bauteile, so dass man auch ohne Brücken
auskommt. Aber wozu? Die Schaltung ist so klein, dass man etwa rund 30
Minuten benötigt, um sie einigermaßen sauber aufzubauen.
|
|
|
Wenn man sich dann beim Aufbau keinen groben Schnitzer erlaubt hat,
sollte die Schaltung auch auf Anhieb funktionieren. Ich hatte zunächst
eine fehlende Lötbrücke, so dass die LED niemals blinkte und ich
die ganze Zeit meine Antenne drehte und wendete, um endlich vernünftigen
Empfang zu haben. Währenddessen zeigte aber der NTP schon an, dass er
erste Synchronisationen mit dem DCF77-Datenstrom versucht hat. Zu blöd,
wenn man nur dauernd auf die LED starrt...
|
Und nun alles in ein kleines nettes Gehäuse eingebaut und die Welt ist schön!
|
|
|
Tja, wozu Schmuckverpackungen alles gut sein können... Nachdem
ich es satt hatte mit der baumelnden Antenne zu hantieren (die sich auch
beharrlich weigerte sich ausrichten zu lassen), habe ich die kleine
Empfänger-Schaltung kurzerhand in ein Plastikgehäuse eingeklebt.
Heißkleber ist eine feine Erfindung!
Ja, das Klarsichtgehäuse offenbart natürlich das Innenleben und
dass es darin nicht sonderlich professionell zugeht. Aber es war gerade zur
Hand und erfüllt seinen Zweck.
|
|
|
Bleibt natürlich die Frage, wie man nun das Gehäuse mitsamt
der Antenne dauerhaft ausrichten kann. Und da hilft eine alte IKEA
Schreibtischlampe. Der Hitze-Abstandshalter schreit förmlich danach,
auf diese Art und Weise missbraucht zu werden. Einmal ausgerichtet und nie
mehr angerührt.
|
|
|
Software
|
ntp Paket 4.2
|
Wie man es auf seinen Rechner bringt, überlasse ich jedem selber.
Da ich ein Linux from Scratch
Anhänger bin, habe ich dieses Paket (wie alles andere auch) aus den
Quellen gebaut.
|
Ich habe hier ein Paket gebaut, welches nur die notwendigsten Dinge
enthält. Ich greife nicht auf NTP-Dienste aus dem Internet zu, sondern
ausschließlich lokal.
- --disable-debugging
Unterdrückt jede Menge unnötige Text-Ausgaben
- --disable-all-clocks
Schaltet zunächst alle per Voreinstellung aktivierten (und niemals
benötigten) Uhrentreiber aus
- --enable-LOCAL-CLOCK
aktiviert die lokale (und meist ungenaue Systemzeit) als eine
mögliche Quelle
- --enable-RAWDCF
aktiviert den auf der RS232 basierenden Treiber für ein rohes
DCF77-Signal
|
$ ./configure --prefix=/usr --bindir=/usr/sbin --sysconfdir=/etc --disable-debugging
--disable-all-clocks --enable-LOCAL-CLOCK --enable-RAWDCF
$ make
$ make install |
|
Konfiguration des NTP-Dienstes
|
Der NTP-Prozess bezieht seine Konfiguration aus /etc/ntp.conf
(zumindest in meinem System). Um nun den DCF77-Treiber verwenden zu
können, erfordert es eine zusätzliche "server" Zeile:
|
server 127.127.8.0 mode 16 prefer |
|
Hierbei bedeuten: Die Spezial-IP Adresse beginnend mit "127.127"
bedeutet, dass mit diesem Eintrag einer der internen Uhrentreiber des NTP
gemeint ist. Die dann folgende ".8" bedeutet, dass einer der
Parse-Treiber verwendet werden soll und die angehängte ".0"
ist als Index gemeint, d.h. bis zu drei solcher Uhrenquellen wären
gleichzeitig möglich (also ".0", ".1" und ".2").
|
Bei mode muss man sich nun entscheiden, in welcher Art und Weise
man seinen Pegel-Umsetzer realisiert hat. Da ich meine Schaltung mittels
RTS positiv aus dem Rechner versorge, benötige ich hier 16.
Wer seinen Pegel-Umsetzer aus dem DTR-Signal seines Rechners positiv
versorgt, benötigt stattdessen 14.
|
prefer sagt einfach nur, dass ntp diese Zeit-Quelle vor anderen
Quellen bevorzugen soll.
|
Damit bei keinem oder schlechtem Empfang ntp trotzdem eine Ahnung von
der Zeit hat, sollte noch die normale Systemzeit als Quelle angegeben
werden:
|
|
Wird nun der ntp-Dienst gestartet, versucht der Raw-DCF-Treiber das
Gerät /dev/refclock-0 zu öffnen, wenn man wie im Beispiel
oben bei der Pseudo-IP-Adresse als letzte Ziffer eine .0 angegeben
hat. Bei mir hängt die Uhr an der zweiten seriellen Schnittstelle,
also /dev/ttyS1 und es genügt somit ein:
|
$ ln -s /dev/ttyS1 /dev/reflock-0 |
|
auszuführen, um den Raw-DCF-Treiber glücklich zu machen.
Beachte: Ist das dev/-Verzeichnis mittels tempfs realisiert (was bei
der Verwendung von udev die Regel ist), muss man diesen Link bei jedem
Systemstart ggf. neu erzeugen!
Oder folgende udev-Regel hinzufügen und udev den Link selbst anlegen lassen:
|
KERNEL=="ttyS1", SYMLINK+="refclock-0" |
|
Das war's. Bei mir läuft diese Uhr nun seit April 2006 und in
meinem Netz herrscht immer die richtige Zeit.
|
|
Aktualisierung 1.1.2010:
Dieser Empfänger ist nun in Rente gegangen. Ersetzt durch einen USB basierten
DCF77 Empfänger, der hier zu finden ist.
|