Nutzung eines DCF77-Moduls zur Erfassung des Funkzeitsignals

Beschreibung

Im Folgenden findet sich eine C-Funktion zur Nutzung eines DCF77-Moduls, mit dem das Zeitsignal des DCF77-Senders eingelesen werden kann. Solche Module sind für wenig Geld zum Beispiel bei Pollin Electronic, reichelt elektronik oder Conrad Electronic verfügbar.
Diese Module haben in der Regel vier Anschlüsse: Je nach Betriebsspannungsbereich des DCF-Moduls und der Betriebsspannung des Mikrocontrollers ist eine Pegelwandlung für die Signale DATA und PON notwendig.

In den nachfolgend verlinkten Quellen befindet sich nur eine einzelne Funktion, die zyklisch aufgerufen werden muss und die die gesamte Funktionalität enthält. Ihr ist das zyklisch abgetastete Ausgangssignal des DCF-Moduls zu übergeben. Die Funktion beginnt mit der Suche nach der Synchronisationsmarke und anschließend mit der Extraktion der Zeitdaten aus dem Bitstrom. Tritt bei der Extraktion dieser Daten ein Fehler auf, beginnt die Funktion erneut mit der Suche nach der Synchronisationsmarke. Am Ende jeden Aufrufes gibt die Funktion den aktuellen Status aus, der anzeigt, welche Daten sie bereits extrahiert und in die übergebene Datenstruktur geschrieben hat: Mit dem Rückgabewert DCF77_TIMESYNC_COMPLETED ist das Einlesen der Zeitdaten komplett abgeschlossen und damit auch kein Aufruf der Funktion mehr notwendig.

Achtung: Vor jedem Synchronisationsbeginn muss die Funktion mit dem Befehl DCF77_RESET_TIME aufgerufen werden, um die internen Speicher und den Status auf DCF77_STARTSYNC_SEARCH01 zurückzusetzen.

Quellen

Beispiel

Vor Beginn der Zeitsynchronisation ist die Funktion dcf77_sync() mit dem Befehl DCF77_RESET_TIME aufzurufen, um den Zustand und die internen Speicher zurückzusetzen:

dcf_state = dcf77_sync(current_dcf_signal, DCF77_ACTIVE_LOW, &real_time, DCF77_SAMPLE_TIME, DCF77_RESET_TIME);

Anschließend muss eine zyklische Abtastung des DCF-Signals und ein ebenfalls zyklischer Aufruf der Funktion in Verbindung mit dem Befehl DCF77_GET_TIME zur kompletten Erfassung der Zeitdaten erfolgen:

dcf_state = dcf77_sync(current_dcf_signal, DCF77_ACTIVE_LOW, &real_time, DCF77_SAMPLE_TIME, DCF77_GET_TIME);

Das zyklisch abgetastete Signal befindet sich dabei in der Variable current_dcf_signal in Bit 0. Der zweite Parameter - DCF77_ACTIVE_LOW - zeigt an, dass das Logiksignal "active low" ist. Der Zeiger auf die Struktur real_time (vom Typ real_time_data) ermöglicht der Funktion, die erfassten Zeitdaten in diese Struktur zu schreiben. Die seit dem letzten Aufruf bzw. seit der letzten Abtastung vergangene Zeit ist mittels Parameter DCF77_SAMPLE_TIME in der Auflösung 10 ms angegeben.

Achtung: Die internen Variablen zur Bestimmung der Zeitdauer zwischen zwei Pulsen sind 8 Bit breit. Bei der Auflösung von 10 ms sind somit maximal 2,55 Sekunden erfassbar. Es ist also empfehlenswert, das Signal aller 10 ms abzutasten und die Funktion dcf77_sync() aufzurufen.

Der Rückgabewert der Funktion enthält die oben spezifizierten Rückgabewerte und gibt Aufschluss über den Stand des Einlesevorganges.
Das Einlesen der kompletten Zeit- und Datumsdaten benötigt im Idealfall mindestens eine Minute, kann aber in Abhängigkeit von den Empfangsbedingungen auch sehr viel länger dauern oder gar nicht komplett gelingen.

Fehlerquellen

Folgende potentielle Fehlerquellen sind beim Einlesen des DCF77-Signals zu beachten:

Lizenz

Alle hier veröffentlichten Quellen stehen unter der LGPLv3.

Versionsinfo

Anregungen oder weitere Informationen

Für Anregungen oder die Beantwortung von Fragen zum Projekt steht ein Forum zur Verfügung.