DCF77 Uhr

Wenn es im Laden nichts gibt, was den eigenen Ansprüchen genügt, ist selbst entwickeln eine Lösung. Das Wesentliche an der Uhr sind die LED Anzeigen, DCF Empfang (die Kombination gibt es nur selten zu kaufen) und mehrere Weckzeiten, die auch bei Stromausfall erhalten bleiben. Eine käufliche Uhr mit allen drei Eigenschaften ist mir nicht bekannt. Da noch Speicher im Controller frei war, gibt es einige mehr oder weniger nützliche Zusatzfeatures.

Features

  • DCF77 Funkempfang
  • ATmega16 Controller mit 4MHZ
  • 4 Stellige 7-Segment LED Anzeige
  • 8 Status LEDs
  • 10 Weckzeiten
  • RS232 Schnittstelle
  • Infrarot Schnittstelle
  • 4 Taster zum Anzeigen der nächsten Weckzeit oder des Datums
  • bis zu 4 freie Analogeingänge zum Anschluss von externen Sensoren, z.B. Temperaturmessung
  • Eingangsspannung 7-14V (mit großem Kühlkörper bis 30V)
  • Stromverbrauch < 70mA, (kurzzeitig höher)
  • 5V Ausgangsspannung
  • Aufzeichnungs Funktion für ein bis zwei A/D Wandler
  • Extra Features
    • Berechnung der Schaltjahre bei fehlerhafter DCF Synchronisation
    • Berechnung des Wochentages bei manueller Eingabe des Datums
    • Reboot Counter
    • Uptime Counter
    • Einfache Helligkeitsregelung der LEDs

Bilder

Da die Ziffern nacheinander angesteuert werden, sehen diese auf den Bildern unterschiedlich hell aus (je nachdem welches Segment zur Zeit der Aufnahme gerade angesteuert wurde). Für einen Menschen leuchten jedoch alle Ziffern gleich hell.

Funktionsweise der DCF77 Auswertung

Zunächst wird der empfangene Wert "geglättet". Dies bedeutet, dass  innerhalb von 31,25 Millisekunden der Pin an dem der DCF Empfänger hängt acht mal abgefragt wird. Waren 5 oder mehr Messungen logisch eins, so wird dies als logische Eins weitergegeben, ansonsten wird der DCF Pin als logisch Null angesehen. Aus dem geglättetem Signal dekodiert der Controller das DCF Signal und sorgt für eine nötige Fehlererkennung. Die Fehlererkennung besteht zum einem aus dem Überprüfen der Parity Bits. Zum Zweiten aus einer logischen Prüfung der empfangenen Daten (so wäre z.B. ein 0.1.2004 ungültig). Als drittes müssen zwei Datensätze nacheinander empfangen werden, bei dem der zweite einen um eins erhöhen Minuten Wert besitzt, ansonsten dürfen sich beide Datensätze nicht unterscheiden. Ist der erste Datensatz in der 59 Minuten einer Stunde und der zweite in der ersten Minute der nächsten Stunde empfangen worden, so dauert die Synchronisation eine Minute länger. Informationen über eine mögliche Schaltsekunde, den Wechsel zwischen Sommer und Winterzeit und welche Antenne das DCF Signal aussendet werden ignoriert. Der Wechsel zwischen Sommer und Winterzeit erfolgt erst bei der nächsten Synchronisation, also sobald das DCF Signal zwei Minuten ohne Störungen anliegt. Ohne DCF Signal zählt die Uhr selbstständig weiter, auch lassen sich Uhrzeit/Datum per RS232 setzen. Ohne Synchronisation werden Schaltjahre korrekt beachtet, der Wechsel zwischen Sommer und Winterzeit muss jedoch von Hand erfolgen.
Hier wird beschrieben wie die Uhr bei fehlender DCF77 Synchronisation Schaltjahre und Wochentage berechnet.

Die Weckzeiten

Alle paar Sekunden berechnet der Controller die verbleibende Zeit der Wecker bis zu ihrem Auslösen, Ist diese bei Null Minuten angekommen, wird der Wecker aktiviert. Dann wird von dem Controller ein Pin in jeder Sekunde für 273ms auf high gesetzt. Pro Sekunde werden es 20ms mehr, bis der Pin durchgängig an ist. Das Berühren einer beliebigen Taste deaktiviert den Wecker. Der Pin steuert über einen Transistor einen Piezo-Intervall-Signalgeber. Jeder Wecker enthält neben der Uhrzeit auch noch Informationen darüber, an welchen Wochentagen er klingeln soll. Beispielsweise kann Wecker eins nur Montags, Wecker zwei Dienstags und Donnerstags und Wecker drei Mittwochs und Freitags aktiv sein. Selbstverständlich sind die Wochentage für jeden Wecker frei einstellbar. Zum Schluss kann noch eingestellt werden ob ein Wecker nur einmalig oder beim nächsten Mal (z.B. in einer Woche) wieder klingeln soll.

RS232 Kommunikation

Der Wecker lässt sich mit einem beliebigem Terminal-Programm für den seriellen Port steuern. Die Kommunikation erfolgt mit 9600Bit/s, 8 Bit, keiner Parität, keine Flusskontrolle. Der Controller besitzt nur die RXD und TXD Leitungen. Nach dem Senden einer im Quelltext eingestellten Zahl und bestätigen mit Return, sendet der Controller ein Menü. Mit Eingabe der angezeigten Ziffern gelangt man in die entsprechenden Untermenüs. Werden andere Zeichen als 0..9 gesendet, so werden diese ignoriert. Auf Wunsch kann die Uhr so eingestellt werden, dass sie eine Kopie jedes empfangenen Zeichens sendet (Echo). Während der RS232 Kommunikation ist kein DCF Empfang möglich.

IR Kommunikation

Mit dem Infrarot LCD lassen sich auch ohne laufendem PC die Weckzeiten einstellen und A/D Wandler abfragen. Das IR Signal wird durch die Software kodiert. ACHTUNG: Sollte der Controller während des IR Sendens hängen bleiben und damit die IR LED nicht mehr ausschalten, so kann IR LED zerstört werden, da diese die hohen Ströme, die zum Senden gebraucht werden, nur kurzzeitig verkraftet. Da das  IR Signal nicht mit den normalen Infrarot Schnittstellen kompatibel ist, ist die IR Schnittstelle ohne das IR-LCD praktisch nutzlos. Auch während der IR Kommunikation ist kein DCF Empfang möglich.

LED Ansteuerung

Die Ansteuerung der LED Anzeige erfolgt per Multiplex-Verfahren (die 7-Segment-Anzeigen werden schnell nacheinander angesteuert). Die Anzeige wird 64 mal pro Sekunde aktualisiert. Sollen die LEDs nachts dunkler sein, so werden die LEDs nur die halbe Zeit eingeschaltet (ab Programmversion 07). Da die LEDs jedoch immer noch zu hell waren und die Schaltung nicht verändert werden sollte, werden die Controller Pins als Eingang definiert und die Transistoren für die LEDs nur durch Ein- und Ausschalten der internen Pull-Up Widerstände gesteuert. So schalten die Transistoren nicht voll durch und die LEDs bleiben dunkler. Einzig die LEDs für die Punkte zwischen der Stunden und Minuten Anzeige werden direkt vom Controller angesteuert.

Die Taster

Um Verschleiß oder Knack-Geräusch beim Drücken zu vermeiden, wurde auf mechanischen Taster verzichtet. Stattdessen werden zwei nahe aneinander liegende Metallstifte verwendet. Der Eine liegt über einen Widerstand an Plus, der andere an der Basis eines NPN Transistors. Der Ausgang des Transistors ist mit dem Eingang eines A/D Pins des Controllers verbunden. Werden beide Metallköpfe mit einem elektrisch leitendem Gegenstand (Finger) verbunden, so ändert sich die Spannung am Controller Pin und kann als Eingabe gewertet werden.
Der erste Taster zeigt auf dem LED-Display die Uhrzeit des nächsten klingelnden Weckers an. Der zweite das Datum. Der dritte beendet eine eventuell laufende Infrarot oder RS232 Kommunikation. Der Vierte kombiniert mit dem Ersten deaktiviert den nächsten Wecker. Der Vierte alleine hebt diese Deaktivierung des Weckers wieder auf.

Die Status LEDs

Die Uhr besitzt acht Status LEDs. Die erste zeigt eine aktive RS232 Kommunikation an, die zweite eine aktive Infrarot Kommunikation und die dritte einen aktiven DCF Empfänger. Die vierte LED zeigt an, dass der DCF Empfang momentan gestört ist, blinkt die LED ist dies schon mehrere Minuten der Fall. Leuchtet die fünfte LED, so zeigt das Display gerade das Datum und nicht die Uhrzeit, bei der sechsten LED wird die nächste Weckzeit angezeigt. Wenn die siebte LED leuchtet, so klingelt innerhalb der nächsten 24 Stunden ein Wecker. Leuchtet LED acht, so klingelt ein Wecker innerhalb von 2Stunden. Blinkt eine oder beide der letzten LEDs, so wurde der nächste Wecker deaktiviert.

Die Aufzeichnungsmöglichkeit der A/D Wandler

Zwei der vier nicht belegten A/D Wandler wurden als Anschlüsse herausgeführt. An diese lassen sich externe Bauteile wie Temperatur- oder Helligkeitssensoren anschließen. Die A/D Werte der Pins lassen sich per RS232 oder IR abfragen. Es lässt sich eine Aufzeichnungsmöglichkeit aktivieren, durch die ein oder beide Werte in bestimmten Abständen im internen EEPROM gespeichert werden. Beispielsweise kann die Uhr angewiesen jede Minute die A/D Pins abzufragen, so den Durchschnittswert der vergangenen 10 Minuten zu errechnen und diesen dann im EEPROM abzuspeichern. Bei Bedarf kann per RS232 eine Liste aller aufgezeichneten Werte abgefragt werden. Werden diese Daten dann in eine Tabellenkalkulation kopiert, lässt sich so beispielsweise den Temperaturverlauf der vergangenen 24 Stunden darstellen.
Der verfügbare Speicher ergibt sich aus der Größe des im Controller vorhandenem EEPROM abzüglich des Speichers für die Weckzeiten und der Konfiguration. So sind bei einem ATmega16 512Byte EEPROM vorhanden, zehn Wecker benötigen 40Byte und weitere 9Byte verwendet die Konfiguration. Für die A/D Aufzeichnung stehen somit 463Byte zur Verfügung. Wird ein Kanal aufgezeichnet, so benötigt jede Messung zwei Byte. Bei der Aufzeichnung von beiden A/D Wandlern benötigt jede Messung drei Byte. Wir als Beispiel ein Pin alle 10 Minuten aufgezeichnet, so ergibt dies eine Aufzeichnungsdauer von 463Byte/2Byte*10Minuten = 2310Minuten (38,5Stunden). Bei einer Verwendung eines ATmega32 anstelle eines ATmegaMEGA16 stünden zusätzliche 512Byte EEPROM zur Verfügung.

Die Fusebits des ATMEGA16

Standardmäßig ist im ATMEGA16 ein interner Schwingkreis aktiv. Die Fusebits müssen so gesetzt werden, dass ein externer 4MHZ Quarz verwendet wird (Low Fusebyte). Das JTAG Interface muss deaktiviert werden (High Fusebyte) und zusätzlich wird der Brown Out Detektor mit einer Schwelle bei 2,7V aktiviert (High Fusebyte). Low Fusebyte original: 11100001 Low Fusebyte nachher: 10111111. High Fusebyte original: 10011001 High Fusebyte nachher: 11011001. Die Fusebits sollten nur sorgfältig und mit Hilfe des Datenblatts des Controllers geändert werden.

Spannungsversorgung und Sicherheit

Die Uhr wird durch ein externes Netzgerät betrieben. Am Eingang der Uhr befindet sich zunächst eine Diode gegen Verpolung, eine Sicherung und eine Supressordiode gegen zu hohe Spannungen. Dann folgt ein L7805 Spannungsregler. Die Eingangsspannung darf maximal 18V (Wert der Supressordiode) betragen, jedoch ist dann ein entsprechender Kühlkörper nötig (Leerlaufspannung der Netzgeräte beachten). Hinter dem L7805 sitzt nochmal eine Supressordiode (mit entsprechend niedrigerer Spannung). Der Controller selbst besitzt einen Watchdog und einen Brown-Out Detektor.

Der Stromverbrauch:

Ein Teil des Stroms verbrauchen die LEDs der 7-Segment Anzeigen. Daher schwankt der Stromverbrauch in Abhängigkeit der Ziffern, die die Uhr anzeigt.
Einige Daten zu Stromverbrauch
Die 7-Segment Anzeigen zeigen: ungefährer Stromverbrauch (der kompletten Uhr)
Vier Bindestriche, Display LEDs gedimmt 42mA
Vier Bindestriche, Display LEDs hell 46mA
Uhrzeit: 1:11, Display LEDs gedimmt 47mA
Uhrzeit: 18:58, Display LEDs hell 56mA
IR LED sendet 160-180mA (Die IR LED verbraucht kurzzeitig bis zu 0,5A)

Probleme

  • Der Controller kann immer nur eines zur Zeit: DCF77 Empfang oder RS232 Kommunikation oder Infrarot Kommunikation.
  • Da die Modulation des Infrarot Signals durch die Software erfolgt, dies Zeitkritisch ist und eine Menge Rechenleistung erfordert, werden die 7-Segment Anzeigen während des Infrarot Senders nicht optimal aktualisiert (flackern).
  • Ohne DCF Synchronisation kann die Uhr bereits nach mehreren Minuten einige Sekunden falsch gehen. Die IR/RS232 Kommunikation beendet sich daher nach 15min von selbst.
  • Der DCF77 Empfänger ist recht empfindlich gegen Störungen. Innerhalb des gewählten Gehäuse ist leider kein störungsfreier Empfang möglich. So musste die Empfangsantenne an der Seite außerhalb des Gehäuses befestigt werden.
  • Die 7-Segment Anzeigen sind für meinen Geschmack etwas zu hell, nachts beleuchten sie das halbe Zimmer.
  • Der DCF Empfang funktioniert nur mit einem "klassischem" Netzteil. Schaltnetzteile erzeugen zu starke Störungen.

Störungen im DCF Empfang

Da die Uhr jede kleinen DCF Empfangsfehler per LED anzeigt, fiel schnell auf welche Ereignisse Empfangsfehler verursachen. So reicht bereits das ungünstige Einschalten der Zimmerbeleuchtung oder einer Steckdosenleiste um einen Empfangsfehler zu produzieren. Der relativ hohe Stromverbrauch(50mA) des Piezo führt ebenfalls "zuverlässig" zu einem Abbruch der DCF Synchronisation. Auch Gewitter produzieren Fehler. Eine falsche Anzeige wurde in den über 10 Jahren Betrieb sehr selten beobachtet.

Eventuelle Fragen

Wie zuverlässig ist die Uhr?
100% Zuverlässigkeit gibt es nicht. Die Software lief ohne größere Fehler mehr als 13 Wochen ohne Unterbrechung. Inzwischen sind bei rund 8Std/Tag Betrieb und über 12Jahren Benutzung rund 35000Stunden zusammen gekommen.
Wie genau ist die Uhr ohne DCF Empfang?
Rechnerisch könnten bereits nach wenigen Minuten einige Sekunden Abweichung auftreten. Nach einem 24 Std. Test ohne DCF Signal lag die Abweichung bei 15 Sekunden. Die genaue Abweichung ist von dem Quarz und der Temperatur abhängig. Bei einem "schlechten" Quarz sind 2-3Minuten Abweichung pro Tag möglich.
Stellt sich die Uhr beim Wechsel zwischen Sommer und Winterzeit automatisch richtig?
Wenn ein fehlerfreies DCF77 Signal vorhanden ist, stellt sie sich 2 Minuten verspätet automatisch auf die richtige Zeit ein, ansonsten sobald der DCF Empfang wieder zwei bis vier Minuten lang fehlerfrei möglich ist.
Wann stellt sich die Uhr richtig ein?
Sobald das DCF77 Signal 2-4 Minuten fehlerfrei empfangen wurde.

Verbesserungsmöglichkeiten

  • Von Anfang an einen ATmega16 nehmen.
  • Die Vorwiderstände der 7-Segment Anzeigen höher auslegen. Dies verhindert, dass die LEDs nachts nicht zu hell sind und spart gleichzeitig Strom, was die negativen Einflüsse auf den DCF Empfang reduzieren würde.
  • Ein größeres Gehäuse wählen, in dem der Empfänger genug Abstand zu den restlichen Bauteilen hat um nicht gestört zu werden.
  • Für die Punkte zwischen den Stunden und Minuten Anzeigen, plane statt abgerundeter LEDs verwenden.
  • Anstelle eines Quarzes einen Quarzoszillator verwenden, da diese eine höhere Frequenzstabilität aufweisen sollen.
  • Erst das Gehäuse anstreichen/lackieren  - danach die Schaltung einbauen.
  • Farbe verwenden die nicht abfärbt...
  • Eventuell die Software so schreiben, dass mehrere Tasks unabhängig voneinander ausgeführt werden können.
  • Eventuell die Schaltung auf einer geätzten Platine mit SMD Bauteilen bauen.
  • Eventuell blaue LED Anzeigen verwenden
Einige dieser Punkte wurden in dem Prototyp für ein neueres Modell umgesetzt: Solar Uhr.

Wichtige Hinweise

Wie immer, Verwendung auf eigenes Risiko und ohne Gewähr.
Viele Netzgeräte dürfen laut mitgelieferter Bedienungsanleitung nicht unbeaufsichtigt betrieben werden.
Insbesondere beim unbeaufsichtigten Betrieb muss sichergestellt werden, dass eine Fehlfunktion keine Brände oder andere schwere Schäden verursachen kann. Es muss sichergestellt werden, dass an der Schaltung niemals zu hohe Spannungen anliegen, da die Schaltung keinen Berührungsschutz bietet.

Downloads

uhr1-schaltplan.png Schaltplan
uhr-os05.c Eine Programmversion für den zuerst verwendeten AT90S8535 Controller. Die Version müsste für einen ATMEGA16 an einigen Stellen angepasst werden. Der Speicher des Controllers wird vollständig benutzt.
uhr-os07-2.c
Version für einen ATmega16. Mehr Features und Fehlerkorrekturen.

Nach mehreren Jahren Betrieb...

Inzwischen sind ca. 13 Jahre vergangen und die Uhr funktioniert weiterhin problemlos. In in den ersten vier Jahren wurden eine falsche Zeitangabe beobachtet, die Fehlererkennung bietet folglich noch Verbesserungspotential. Insbesondere wäre es problematisch wenn diese ausgerechnet zu dem Zeitpunkt passiert zu dem ein Wecker klingeln sollte. Aber eine falsche Zeitangabe haben auch manche im Laden kaufbare DCF Uhren gelegentlich. Eine neuere Uhr ist in Planung und ein Prototyp fertig: Solar Uhr.