DCF77 Uhr

(<-- links kein Menü? Hier klicken)
Da ich mit meinem alten Wecker unzufrieden war und ich im Laden keine Uhr fand, die meinen Ansprüchen genügt hätte beschloss ich selber eine Funkuhr zu bauen. 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 (alles Drei kombiniert habe ich noch nie zu kaufen gesehen). Da ich noch Speicher im Controller frei hatte, kamen mir immer weitere Ideen für mehr oder weniger nützliche Zusatzfeatures, die ich in die Uhr integriert habe.

Momentaner Status:

Die Schaltung und das Gehäuse sind soweit komplett. Die Software besitzt alle gewünschten Features, allerdings wird sich in der Praxis wohl leider noch der eine oder andere kleine Bug zeigen.

Features:

Eher nebensächliche Features der Software:

Funktionsweise des DCF77 Empfangs:

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.
Wie die Uhr bei fehlender DCF77 Synchronisation Schaltjahre und Wochentage berechnet habe ich mal hier beschrieben.

Funktionsweise der Wecker:

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 (Pin wird auf low gesetzt). 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 klingeln. 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.

Funktionsweise der 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, Xon/Xoff Protokoll. Der Controller besitzt nur die RXD und TXD Leitungen. Nach 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 empfangenem Zeichens sendet (Echo). Während der RS232 Kommunikation ist kein DCF Empfang möglich.

Funktionsweise der IR-Kommunikation:

Mit meinem IR-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.

Das Ansteuerungs-Verfahren der LEDs:

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 mir die LEDs jedoch immer noch zu hell waren und ich keine neuen Vorwiderstände einbauen wollte, kam ich auf die Idee, die Controller Pins als Eingänge zu definieren und die Transistoren für die LEDs nur durch Ein- und Ausschalten der internen Pull-Up Widerstände zu steuern. 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:

Da ich kleine mechanischen Taster haben wollte (Verschleiß, Knack-Geräusch beim Drücken) verwende ich zwei nahe aneinander liegende Metallstifte (bei mir die Köpfe von Nägeln). 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 (der Finger geht auch) verbunden, so ändert sich die Spannung am Controller Pin.
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 IR oder RS232 Kommunikation. Der Vierte kombiniert mit dem Ersten sorgt dafür, das der nächste Wecker nicht klingelt (beispielsweise wenn man schon vorher aufgewacht ist). 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 IR 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 länger (z.B. 10 Minuten) der Fall, wie lang genau lässt sich im Quelltext einstellen. 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 steht das Klingeln kurz bevor, die genaue Zeitspanne für die LED lässt sich im Quelltext einstellen (z.B. zwei Stunden). 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 habe ich 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. Ab Programmversion 07: Per RS232 ist einstellbar, dass ein oder beide Pins nach bestimmten Abständen abgefragt wird und der Wert im internem EEProm gespeichert wird. 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 EEProms abzüglich des Speichers für die Weckzeiten und der Konfiguration. So sind bei einem ATMEGA16 512 Byte EEProm vorhanden, zehn Wecker benötigen 40 Byte und weitere 9 Byte verwendet die Konfiguration. Für die A/D Aufzeichnung stehen also noch 463 Byte 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 (nicht vier Byte). Wir als Beispiel ein Pin alle 10 Minuten aufgezeichnet, so würde es 463Byte/2Byte*10Minuten = 2310 Minuten (38,5 Stunden) dauern bis der Speicher voll wäre. Bei einer Verwendung eines ATMEGA32 anstelle eines ATMEGA16 stünden zusätzliche 512 Byte EEProm zur Verfügung.

Die Fusebits des ATMEGA16:

Standardmäßig ist im ATMEGA16 ein interner Schwinger 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.
Bei dem AT90S8535 mussten keine Fusebits verändert werden (der Brown Out Detektor war so jedoch nicht aktiv).

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
42 mA
Vier Bindestriche, Display LEDs hell
46 mA
Uhrzeit: 1:11, Display LEDs gedimmt
47 mA
Uhrzeit: 18:58, Display LEDs hell
56 mA
IR LED sendet
160-180 mA (Die IR LED verbraucht kurzzeitig bis zu 0,5A)

Probleme:

Störungen im DCF Empfang:

Da die Uhr jede kleinen DCF Empfangsfehler per LED anzeigt, fiel mir 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. Mehr als 10 Minuten ohne fehlerfreien Empfang habe ich jedoch bisher nur beobachtet als der Piezo einmal mehr als 10 Minuten versucht hat mich zu wecken und einmal bei einem besonders schwerem Gewitter. Keiner der Empfangsfehler führte zu einem falschen Anzeigen der Zeit, da die Fehler schließlich erkannt wurden.

Bilder:

Auf die Bilder klicken, um eine Großansicht zu erhalten. Da die Ziffern nacheinander angesteuert werden, sehen sie auf den Bildern unterschiedlich hell aus (je nachdem welches Segment zur Zeit der Aufnahme gerade angesteuert wurde).
Sicht von vorne, noch nicht komplett zusammengebaut
Innenansicht
IR-LCD, welches die Einstellungen des ersten Weckers zeigt
Uhrzeit: 12:36 Sicht auf die Platiene links: Lausprecher (für den Alarm), rechts: Wecker, unten: IR-LCD
Sicht von vorne mit Gehäuse ohne Farbe
   Sicht von hinten ohne Farbe 
Sicht auf DCF Empfänger Antenne
Gehäuse geschlossen, Sicht von vorne Rückseite mit eingestecktem Stromanschluss und seriellem Kabel links: Deckel, mitte Ferritantenne, rechts: Uhr
Sicht von vorne mit Farbe und Schutzfolie
  Sicht von hinten mit Farbe  
Die fertige Uhr
Oben die 7 Segment Anzeige, darunter die vier Taster und unten links die IR LED Power Stecker, RS232 Stecker, 5V Ausgang, A/D Wandler Eingänge Sicht von schräg Vorne

Eventuelle Fragen:

Wie zuverlässig ist die Uhr?
100% Zuverlässigkeit gibt es nicht. Ich persönlich lasse mich aber inzwischen nur noch von meiner selbst gebauten Uhr wecken (außer bei den Abiturprüfungen, da hab ich noch einen anderen Wecker zusätzlich gestellt) und bisher habe ich wegen ihr noch nicht verschlafen. Die Software uhr-os05.c lief ohne größere Fehler mehr als 6 Wochen am Stück (Uptime: 65931 Minuten) bis ich sie abgeschaltet habe um den AT90S8535 Controller durch einen ATMEGA16 zu ersetzen. Die Software uhr-os07.c mit einem ATMEGA16 wurde inzwischen über 13 Wochen und 5 Tage ununterbrochen betrieben, beendet von einem kurzen Stadtteil-weitem Stromausfall. Mit Unterbrechungen ist die Uhr mit der Softwareversion inzwischen mehr als 500 Tage in Betrieb.
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 mir bei 15 Sekunden. Wenn man Glück hat bekommt man einen Quarz, bei dem die Uhr kaum falsch geht, wenn man Pech hat erhält man einen, bei dem die Uhr 2-3 Minuten pro Tag falsch geht. Die Temperatur spielt auch noch eine gewisse Rolle.
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.
Wie lange hält die Uhr?
Genau weiß ich dies natürlich nicht, ich kann nur grob schätzen wie lange die einzelnen Teile wohl halten dürften. Der Datenerhalt von Flash und EEProm Speicher wird meist mit 10 bis 100 Jahre angegeben. Bei LEDs wird meist eine Leuchtdauer von 100000 Stunden genannt, dies entspräche ungefähr 11 Jahre. Hinzu kommt, dass die LEDs nicht durchgängig an sind und auch nicht an ihrer Leistungsgrenze betrieben werden. Von Elektrolytkondensatoren ist bekannt, dass ihre Lebensdauer bei hohen Temperaturen nur wenige tausend Stunden beträgt. In meiner Schaltung haben sie jedoch nahezu Zimmertemperatur und müssten somit deutlich länger halten. Bei allen anderen Komponenten sind mir mögliche Grenzen bezüglich der Lebensdauer nicht bekannt.

Wenn ich die Uhr noch mal bauen würde, würde ich folgendes besser machen:


WICHTIGE HINWEISE:

Nachbau der Schaltung auf eigene Gefahr, es ich garantiere nicht, dass die Schaltpläne/Programmierbeispiele fehlerfrei sind, bz. funktionieren.
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.
Hierbei muss auch darauf geachtet werden, dass die Spannungen gegenüber der Erde nicht zu hoch sein dürfen. Lägen beispielsweise 100V an Minus und 105V an Plus gegenüber der Erde an,  würde der Controller und die Suppressordioden nur 5V "sehen" und kein Anzeichen für einen Fehler geben. Beim Anfassen würde man jedoch 100-105 V berühren, dies wäre lebensgefährlich!
Beachten Sie, dass durch das serielle Kabel zum PC eine elektrische Verbindung mit diesem hergestellt wird.
Denken Sie immer daran, dass es keine 100% Sicherheit gibt (man denkt die Schaltung ist fehlerfrei, aber irgendwas übersieht man immer).


Hier gibt es den Schaltplan

Programmierbeispiele:

Der Inhalt der .c und der .htm Dateien ist der Gleiche, jedoch werden die .htm Dateien mit Syntax Hervorhebung angezeigt.
uhr-os05.c
uhr-os05.htm
Eine Programmversion für den zuerst verwendeten AT90S8535 Controller. Die Version müsste für einen ATMEGA16 an einigen Stellen angepasst werden (nicht nur die Registernamen). Der freie Flash beträgt 0 Byte.
uhr-os07.c
uhr-os07.htm
Eine Programmversion für einen ATMEGA16 Controller. Die Programmversion beinhaltet die Funktionen von Version 05 (zum Teil verbessert) und neue Features. Das Programm benötigt ungefähr 12 KB Flash.
uhr-os07-2.c
Der Quellcode ist der gleiche wie in Version7. Jedoch wurden in der Praxis bekannt gewordenen Probleme/Bugs hinzugefügt (jedoch nicht behoben) und einige Kommentare aktualisiert.

Nach mehreren Jahren Betrieb...

Inzwischen sind ca 4 Jahre seit Fertigstellung der Uhr vergangen und sie funktioniert weiterhin problemlos. In dieser Zeit habe ich drei mal eine falsche Zeitangabe beobachtet, meine Fehlererkennung könnte also noch besser sein. 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. Nebenbei bin ich am überlegen nicht irgendwann eine neue Uhr zu bauen die insbesondere im Hinblick auf Energiesparsamkeit optimiert ist.


Zur Startseite

Zuletzt aktualisiert: 26.12.2008