Dienstag, 15. Mai 2012

Das DCF77-Signal

Jeder kennt sie, die meisten besitzen mindestens eine. Doch wie funktionieren eigentlich Funkuhren?

Wie der Name schon sagt, empfangen sie ein Funksignal, und zwar ein codiertes Langwellensignal auf 77,5 kHz aus Mainflingen. Im Sekundenrhythmus ändert sich die Amplitude, das heißt die maximale Auslenkung des ausgestrahlten Signals. An dieser Stelle könnte man schon ansetzen, um ein einfaches Taktsignal auszuwerten. Aber wir wollen ja noch mehr Informationen. Daher schauen wir uns mal an, wie die Daten codiert sind:
Quelle: Wikipedia

Das ist ein typischer Signalverlauf über ein einen Zeitraum von 10 Sekunden. wie wir unschwer erkennen können, sind die "Unterbrechungen" entweder 100 ms (Millisekunden) oder 200 ms lang. Hier steht die kürze Absenkung für eine logische 0, die längere für eine logische 1.
Reihen wir diese Informationen aneinander, ergibt sich hier aus der Darstellung der Datensatz 1110011000. Und jede Sekunde kommt in neues Bit hinzu. Wenn die Daten aber kontinuierlich hereinflattern, woher weiß man dann, welches Bit welchen Wert codiert?
Hier soll keine Frage offen bleiben. Zählen wir die empfangenen Absenkungen in einer Minute mit, werden wird feststellen, dass ihre Anzahl nur 59 ist, außerdem gab es in einer Sekunde gar keine Absenkung! Das ist kein Fehler, sondern eine wirklich wichtige Eigenart des Protokolls. Diese Lücke im Signalverlauf können wir nämlich nutzen, sie liegt immer in der 59. Sekunde der Datenübertragung.
Ein Datensatz besteht demnach aus 59 Bit, üblicherweise zählt man diese von 0 bis 58. Was sie im einzelnen bedeuten, behandeln wir anhand eines eben aufgenommenen Signals, zur Veranschaulichtung der einzelnen Informationsblöcke habe ich Leerzeichen eingeführt:

0 11111111000110 00010 1 1010001 1 111010 0 110000 101 01000 01001000 1

Das Bit 0 (hier das erste in unserer Reihe) ist immer 0, hier stecken also keine sich ändernden Informationen drin.
Die Bits 1-14 wünscht sich jeder Technikbegeisterte gern auszuwerten, in der Regel werden hier Wetterinformationen der Firma MeteoTime verschlüsselt ausgestrahlt, der Bereich dient auch zur Informationsübertragung für den Katastrophenschutz.
Die nächsten 5 Bits enthalten allgemeine Informationen zur Sommerzeit, der Zeitzone und möglichen Schaltsekunden.

Erst jetzt wird es spannend, eingeleitet wird das Zeitsignal immer mit einer logischen 1, die nächsten 7 Bit stehen für die Minuten des Zeitsignals. Hier werden die Einer- und Zehner separat übertragen. Ein bisschen Mathematik darf nicht fehlern, wir errechnen aus dem Datenabschnitt 1010001 die Einer-Stelle aus den ersten 4 Bit:

1*2^0 + 0*2^1 + 1*2^2 + 0*2^3 = 5

Analog dazu errechnen wir die Zehner-Stelle:

0*2^0 + 0*2^1 + 1*2^2 = 4

Wir wissen nun, in welcher Minute wir uns befinden, nämlich in der 45. Weiter geht es mit einem Prüfbit, woraufhin die Stunden folgen, der nächste sechsbittige Datensatz 111010 wird ebenso wie das Sekundensignal stellenweise übertragen. Hier gilt wiederum für die Einer-Stelle:

1*2^0 + 1*2^1 + 1*2^2 + 0*2^3 = 7

Die Zehnerstelle kann ja nur 0, 1 und 2 werden, folglich reichen auch 2 Bit:

1*2^0 + 0*2^1 = 1

Zusammengesetzt heißt das 17:45 Uhr, gefolgt von einem Prüfbit für die Stunden. Es handelt sich um ein sogenanntes Paritätsbit, wer daran Interesse hat, sollte sich den entsprechenden Wikipediaartikel ansehen. Kurz gesagt können wir damit überprüfen, ob unsere empfangenen Werte valide sind, gibt es hier einen Fehler, müssen wir für korrekte Informationen den nächsten Minutensatz abwarten und dürfen nicht auf die ermittelte Uhrzeit vertrauen.
Schauen wir weiter, was sich in den restlichen Bits versteckt.
Weitere 7 Bits ergeben den Kalendertag, auch hier separiert nach Einer- und Zehnerstelle:

1*2^0 + 1*2^1 + 0*2^2 + 0*2^3 = 3 (Einer) und
0*2^0 + 0*2^1 = 0 (Zehner)

Wir wissen nun, dass heute der 3. eines Monats ist. Anders als man vielleicht denkt, kommt noch nicht gleich die Ausgabe des Monats. In den 3 Folgebits kommt erst einmal der Wochentag, in unserem Fall steht die 101 für folgendes:

1*2^0 + 0*2^1 + 1*2^2 = 5

Das ergibt den 5. Tag der Woche, wobei der Montag den ersten Tag darstellt.
Nun aber folgt der Monat mit weiteren 5 Bit mit 4 Stellen für die Einer, und einer Stelle für die Zehner:

0*2^0 + 1*2^1 + 0*2^2 + 0*2^3 = 2 (Einer) und
0*2^0 = 0 (Zehner)

Fast geschafft, 8 Bits stehen für das Jahr, ein letztes wiederum als Paritätsbit, nun aber für das gesamte Datum. Also werten wir die mit jeweils 4 die Einer- und Zehnerstelle aus:

0*2^0 + 1*2^1 + 0*2^2 + 0*2^2 = 2 (Einer) und
1*2^0 + 0*2^1 + 0*2^2 + 0*2^2 = 1 (Zehner)

Alles zusammengenommen ergab der Datensatz:

17:45 Uhr am Freitag, den 03.02.12

Zufrieden mit der Erklärung? Hab ich wichtige Sachen vergessen? Lasst es mich wissen!

1 Kommentar:

  1. Hier gibt es wohl eine Anleitung die Meteotime Wetterdaten zu entschlüsseln:

    http://www.fact4ward.com/blog/meteotime/

    AntwortenLöschen