Ohne weiteres Zutun wird die Systemuhr des Rechners z.B. grundsätzlich etwa eine Sekunde nachgehen.
Grund dafür sind Verzögerungen in den Hardware-FIFOs moderner serieller Schnittstellen. Um bei hohen
Baudraten allzu häufige Unterbrechungen zu vermeiden, triggert der FIFO die Unterbrechung
erst nach einigen Zeichen (einstellbare Schwelle). Bei der vorliegenden Anwendung wird
jedoch immer nur ein Zeichen empfangen, die DCF77-Sekundenmarke. Bei 50 Baud führt das
offenbar zu einer Verzögerung von etwa 800 msec bis 1 s vom Empfang des Zeichens durch die Hardware
bis zur Übergabe an die Software des seriellen Treibers.
Für die unverzügliche
Übergabe des Zeichens an den seriellen Treiber muss die FIFO-Funktion der seriellen Schnittstelle
abgeschaltet sein.
Eine weitere Frage ist die nach der Fehlertoleranz.
Anscheinend begnügen sich
Software-Entwickler im Open-Source-Bereich
damit, die DCF77-Empfangsdaten anhand der Minutenmarke, der Startmarke und der drei Paritätsbits
zu prüfen und für den Plausibilitätstest einfach die beim Zeitvergleich festgestellte Zeitabweichung
heranzuziehen. Diese Vorgehensweise kann bei ungünstigen Empfangsbedingungen dazu führen, dass alle Daten
verworfen werden und dass überhaupt keine Zeitvergleiche bzw. -korrekturen durchgeführt werden.
Hier haben wir Software, die auch bei Empfangsstörungen gültige Daten erkennt und benutzt.
Um nun die Genauigkeit der Zeitmessung in den Bereich von Millisekunden zu bringen, sind noch
eine Reihe weiterer Dinge zu prüfen, z.B. der Einfluss des Task Schedulers auf das Timing. Ein
Standardwert für die Zuteilung des Prozessors unter Windows NT beträgt z.B. 20 msec. Bleibt der
Scheduler unbeachtet, wird man höchstens eine Genauigkeit in dieser Größenordnung erreichen. Unsere
Software stellt das Eingreifen des Schedulers gegebenenfalls fest und korrigiert die dadurch
entstandene Latenz beim Setzen der Systemzeit.
Wir haben auch untersucht, wie sich Zeitsprünge bei der Resynchronisation der
Systemuhr reduzieren lassen. Win32 enthält dafür Mechanismen, die eine feine Steuerung
der Ganggeschwindigkeit der Systemuhr erlauben. Diese Funktionen benutzen z.B. W2K Time Services,
um Uhren durch gleichmäßige Beschleunigung über einen Zeitraum von 20 Minuten zu synchronisieren.
Dieselbe Methode benutzen wir ebenfalls, um auch zwischen stündlichen Zeitvergleichen immer eine
Ganggenauigkeit von 2 msec einzuhalten.
Wir haben als DCF77-Empfänger für diese Untersuchungen übrigens eine handelsübliche,
batteriebetriebene Funkuhr mit eigenem Display benutzt.
Diese schaltet ihren Empfangsteil in den ersten zwei Minuten jeder Stunde ein,
um den Zeitvergleich vorzunehmen. Wir haben diese Uhr so erweitert, dass Sie die DCF77-Sekundenmarken
an eine serielle Schnittstelle sendet. RS-232 kompatible Spannungspegel lassen sich dabei besonders
effektiv
mithilfe von Ausgängen derselben seriellen Schnittstelle erzeugen. Die gesamte Schnittstelle zwischen
Funkuhr und Rechner besteht aus zwei Widerständen, zwei Dioden und einem Transistor, sowie einem
Kabel mit Steckern. Die vorgeschlagene Beschaltung ermöglicht übrigens die Kalibration der
Durchlaufzeit der seriellen Schnittstelle zur Feststellung der oben beschriebenen FIFO-Problematik.
Einige der dargestellten Aspekte sind auch bei der Synchronisation mit einem
GPS-Empfänger oder einem NTP-Server interessant, wenn man tatsächlich die optimale Genauigkeit im Bereich
von Millisekunden erreichen möchte. |