Schaltungsidee und Ziel:

Nachdem seit einer Weile Uhren auf dem Markt sind, die die aktuelle Zeit binär codiert anzeigen, dachte ich mir warum so einfach, wenn es auch noch viel komplizierter geht! Aus diesem Grund wollte ich eine Funkuhr bauen, die die Uhrzeit kodiert über die Anzahl der eingeschalteten LEDs anzeigt (und die sehr gut aussieht!). Dabei wird jeder der sechs Ziffern der Uhrzeit (hh:mm:ss) ein LED-Feld zugeordnet. Da die Zehnerstelle für die Minuten und Sekunden nur bis maximal 6 hochläuft bestehen die Felder für die Zehnerstellen aus 6 LEDs. Die Felder für Einerstellen werden aus 9 Leds gebildet.

Um die Darstellung der Uhrzeit etwas abwechslungsreicher zu gestalten, werden die LEDs in einem Feld nicht nach einem bestimmten Muster hochgezählt  (also eingeschaltet), sondern zufällig (Random-Mode). In der neusten Firmware V1.2 sind inzwischen noch zwei weitere Anzeigemodi eingebaut. Bei dem Random-Mode mit Rebuild wird jede Sekunde die gesamte Anzeige zu fällig neu aufgebaut. Diese Version ist also etwas für Leute, die es gerne etwas nervöser mögen. Außerdem gibt es jetzt einen Static-Mode, bei dem die Darstellung der Zahlen immer gleich aussieht und nicht mehr zufällig erzeugt wird.  

Anstatt langer Erklärungen hier einfach mal ein Bild der fertigen Uhr:


Und? Wie spät ist es auf dem Foto? Richtig! Es ist 13:33:38.

Für den Fall, dass noch nicht klar ist, wie die Uhr arbeitet, hier das ganze noch mal als kleiner Film:

 

Nachdem die Funktionsweise der Uhr jetzt klar sein sollte folgen jetzt die technischen Details  zum Aufbau und der Funktionsweise der Uhr.

Schaltungsbeschreibung:

Die Schaltung der Uhr ist eigentlich sehr einfach aufgebaut. Den Kern der Schaltung bildet ein ATMega8-Controller von Atmel, der mit einem Quarztakt von 8MHz betrieben wird. Die meisten I/O-Pins des Controllers werden für die Ansteuerung der LEDs benötigt. Ein Pin wird für das Einlesen der Daten des DCF-Empfangsmoduls benutzt.  Zusätzlich wurden die I/O-Pins der UART über einen RS232-Pegelwandler auf eine Steckleiste (ST4) geführt, um darüber z.B. Debug-Meldungen an einen PC senden zu können. Über den Stecker SV1 erfolgt die Programmierung des Flashspeichers. Zwei noch freie AD-Wandler Eingänge  würden für einen optionalen Helligkeitssensor für die Umgebungshelligkeit auf den Stecker ST2 geführt. (Dieser Sensor wird aber in der aktuellen Version der Software nicht abgefragt.)

Die Ansteuerung der LEDs erfolgt in einer Matrix, die aus fünf Spalten und neun Reihen besteht.   Die Ansteuerung erfolgt in einem Zeit-Multiplex -Verfahren, bei dem jeweils eine Spalte eingeschaltet ist. Wenn in dieser Spalte die LEDs aller neun Reihen einschaltet sind ergibt sich bei 20mA pro LED ein maximaler Spaltenstrom von 180mA. Da dieser Strom zu hoch ist für die Outputpins des AVR wird ein ULN2003 als Spaltentreiber eingesetzt. Als Treiberschaltung für die Reihenansteuerung wird pro Reihe jeweils ein PNP-Transistor eingesetzt.

Jede Zelle des Feldes besteht aus einer Hochleistungs-SMD-LED im 1206-Gehäuse. Die Helligkeit der LEDs beträgt je nach Farbe zwischen 200 und 600mcd. Die Vorwiderstände für die einzelnen Farben sind jeweils in dem Reihenzweig geschaltet.

Für die Spannungsregelung wird ein LowDrop-Spannungsregler vom Typ LF50CDT eingesetzt, der maximal 1A Strom liefern kann. Die Eingangsspannung der Schaltung mit diesem Spannungsregler darf zwischen 6V ... 12V= liegen. Leider ist dieser Spannungsregler inzwischen nur noch schwer erhältlich. Alternativ kann z.B. der KIA78M05F eingesetzt werden, der leider kein LowDrop-Typ ist. Deshalb liegt der Eingangsspannungsbereich bei diesem Typen im Bereich von 7.5V...12V. Als Netzteil empfehle ich grundsätzlich keine Schaltnetzteile einzusetzen, weil viele der billigen Steckerschaltnetzteile den DCF-Empfang stören. Es gibt gute Schaltnetzteile, die keine Probleme machen z.B. altes Netzteil von einem Siemens S25, aber viele Netzteile stören leider.

Als DCF-Empfänger wird ein fertiges DCF-Empfängermodul von Conrad verwendet. Das Modul wird in einem externen Gehäuse untergebracht und über ein ca. 40cm langes Kabel angeschlossen. Durch diese Maßnahme verbessert sich der Empfang der DCF-Nachrichten erheblich.

Die gesamte Schaltung ist in SMD-Bauweise aufgebaut. Auf der Oberseite der Platine sind fast nur die LEDs untergebracht. Die Unterseite enthält die Bestückung der restlichen Komponenten.

 


Unterseite der Uhrenplatine

 


Oberseite der Platine

 

Funktion der Software:

Die Software im AVR empfängt, überprüft und dekodiert das DCF-Signal. Wurde ein gültiges DCF-Telegramm empfangen wird die Uhrzeit von der Software entsprechend auf der LED-Matrix ausgegeben.

Für Einzelheiten zum Aufbau des DCF-Telegramms und der Kodierung der DCF-Signale sei auf den einen Artikel von Wolfgang Back und die Webside www.dcf77.com verwiesen.

Bei dieser Uhr wird der externe Interrupt 0 für das Einlesen der DCF-Signale verwendet. Die steigende Flanke des DCF-Signals startet die Messung der Pulsdauer. Bei der fallenden Flanke des DCF-Signal wird die Messung gestoppt und kontrolliert, ob eine Null oder eine Eins empfangen wurde. Das Ergebnis wird über einen Bitzähler an die entsprechende Position in einem Bytearray abgelegt. Sind 58-Bits empfangen worden wird das DCF -Telegramm dekodiert und wenn die Dekodierung erfolgreich war als Zeitwert zwischengespeichert.

Sind seit dem letzten Impuls mehr als 1.7Sekunden vergangen handelt es sich um das Synchronisationsbit. Wenn das vorher empfangene DCF-Telegramm erfolgreich dekodiert werden konnte wird jetzt der Zeitwert auf der LED-Matrix ausgegeben und der interne Sekundentakt mit dem DCF-Takt synchronisiert. Konnte das vorherige DCF-Telegramm nicht dekodiert werden, wird nur der Bitzähler zurückgesetzt.

Da der Empfang des DCF-Signals sehr leicht gestört wird, ist es nicht sinnvoll den Sekundenzähler direkt über das DCF-Signal abzuleiten. Stattdessen wird der Sekundentakt der Uhr über den internen 16-Bit Timer1 des AVR erzeigt. Ist der Empfang des DCF-Signals länger gestört sorgt dieser Takt dafür, dass die Uhr richtig weiterläuft. Da dieses Frequenz direkt von dem 8MHz Quarz abgeleitet wird ist die Ganggenauigkeit dieser Uhr sehr genau.

Der 8-Bit Timer2 des AVR wird als Reload-Timer betrieben. Dieser Timer löst jede Millisekunde einen Interrupt aus. In der Interrupt-Service-Routine erfolgt dann die Umschaltung der Outputpins für die gemultiplexte LED-Matix. Zusätzlich wird durch diese Routine auch noch eine Timervariable hochgezählt, die für das Ausmessen der DCF-Pulsbreiten benutzt wird.

Die Funktion zur Umsetzung der Uhrzeit für die Darstellung im Random-Modus in den Bit-Fehlern arbeitet eigentlich sehr einfach. Bei jedem Aufruf wird die Differenz zwischen den bereits aktiven LEDs und der Anzahl der LEDs, die an sein sollen, ermittelt. Entsprechend werden genau soviele zusätzliche LEDs eingeschaltet . Welche LED genau angeschaltet wird wird durch eine Modulo-Operation auf den Inhalt des Zählerregisters von Timer1 bestimmt. Damit ist die Auswahl der LED hinreichend zufällig. Ist die angewählte LED bereits aktiv, wird solange das Bit nach rechts verschoben bis ein "freies" Plätzchen gefunden ist.

Im Random-Modus mit Rebuild wird zusätzlich der Speicher der Bit-Felder vor der Aktualisierung des Displays gelöscht, so dass sich das ganze LED-Muster der Bit-Feldes jede Sekunde zufällig neu erzeugt wird.

Bei dem Static-Mode wird statt eines Zufallswertes ein festes Bit-Muster, das in der set_bitfield-Funktion in dem Array led_mask definiert ist ausgegeben.

Der Displaymodus wird in der Firmware über Defines in dem File "define.h" festgelegt. Zur Laufzeit des Programms kann der Moduls also nicht umgeschaltet werden.

Als zusätzliche Funktion gibt die Uhr über die RS232-Schnittstelle die aktuelle Uhrzeit im Klartext im ASCII-Format aus. Außerdem wird der Wert jedes empfangenen DCF-Bits ausgegeben und eine Statusmeldung ("I"), wenn das Synchronisationsbit empfangen wurde. Diese Funktion ist ganz nett, wenn aufgrund von schlechten Empfangsverhältnissen keine Synchronisation der Uhr stattfindet. (Durch die Ausgabe der DCF-Bits leuchtet die LED1 auf der Rückseite im Sekundenrhythmus, wenn der Empfang okay ist.)

Die Software ist in C geschrieben und wurde ürsprünglich mit WinAVR im AVR Studio 4 compiliert. Das ZIP-Archiv der Firmware V1.0 enthält den vollständigen Sourcecode und zwei Hex-Files mit dem compilierten Programm. Das Hex-File "dcf-clock.hex" ist für DCF-Empfängermodule gedacht, die einen nicht invertierten Ausgang besitzen. Die Variante "dcf-clock_inverted.hex" ist für Module mit invertierten Ausgang vorgesehen.

Die aktuelle Firmware V1.2 ist mit dem Atmel Studio 6 compiliert worden. Das ZIP-File dieser Version enthält neben dem Sourcecode auch compilierte HEX bzw. ELF-Files für jeden Displaymodus für DCF-Module mit invertiertem Ausgang.

 

Hier noch die Fuse-Einstellung des ATMega's für den externen Quarz (PonyProg2000):

Und hier nochmal die Fuse-Einstellungen für das Atmel Studio 6:

Fusesettings des Atmega8

 

Lockbits des Atmega8

 

Nachdem der Aufbau der Uhr bis zu dieser Stelle recht einfach war, kommt jetzt der experimentelle Teil, ....

 

Der Entwurf und die Realisierung der Mechanik und "Optik":

Ohne eine "Optik" wirkt die Uhr im Betrieb ziemlich langweilig, weil die LEDs nur als einzelne Leuchtpunkte erscheinen. Es sollten aber die LEDs einzelne Quadrate möglichst gleichmäßig ausleuchten, um einen geometrischen Zusammenhang zwischen den einzelnen Leuchtfeldern zu erzeugen.


Platine im Betrieb ohne weitere "Optik"

 

Um einen möglichst starken Kontrast zwischen den einzelnen Feldern zu erreichen sind lichtundurchlässige Trenngitter zwischen den einzelnen LEDs notwendig. Als Material für dieses Gitter wird lichtgraue Photokarton benutzt, das fast lichtdicht ist, aber nicht soviel Licht absorbiert. Weißes Photokarton ist leider noch lichtdurchlässig. Optimal ist eine dünne Pappe, die beidseitig mit Alufolie beklebt ist. Solchen Alukarton bekommt man z.B. bei Modulor in Bastlermengen.

Um das Gitter zu stabilisieren wurde es auf eine Basisplatte aus Photokarton geklebt. In dieser Basisplatte sind Löcher für die LEDs und Lötpunkte ausgeschnitten worden.


Bild der Basisplatte

 


Ein Gitterelement

 


Fertiges Gitter bereits auf die Basisplatte geklebt

 

Auf die Oberseite des Gitters wird eine Frontblende geklebt, durch die das Gitter weiter verstärkt wird. Zusätzlich werden durch die Blende die Stege zwischen den LED-Feldern stärker betont.


Frontblende vor dem Aufkleben

 


Platine mit "Optik"

 

Wie man im letzten Bild schon recht gut erkennt, werden die Felder jetzt bereits sehr schon gleichmäßig ausgeleuchtet. Allerdings ist der Leuchtpunkt der LED immer noch sehr hell. Um eine noch bessere Lichtverteilung zu erreichen wurde über der "Optik" noch ein Stück gelbes Transparentpapier befestigt. Dadurch wird das Licht der LEDs noch diffuser. Das Ergebnis ist dann im ersten Bild oben auf der Seite zu sehen.

Eingebaut wurde die Uhr dann ein Gehäuse aus Acrylglas. Fertig!

Für den Fall, dass jemand diesen Teil auch nachbauen möchte hier die "Bastelbögen" für das Gitter usw. als PDF.

Das Plexiglas-Gehäuse ist vom Design her recht einfach. Wer mehr Wert auf ein edles Design legt und trotzdem ein günstiges und schönes Gehäuse sucht , kann die Uhr z.B. auch in eine tiefen Bilderrahmen einbauen. Dann sieht die Uhr wirklich absolut genial aus!


Designer-Version der Uhr in schwarzen Bilderrahmen

 

Alternativer Ansatz für die Optik:

Für jeden, dessen Kernkompetenz nicht gerade das Basteln mit Pappe ist, gibt es hier noch einen  anderen Weg um entsprechende Leuchtfelder zu basteln. Es gibt von der Firma Mentor unter der Herstellerbestellnr. 2366.1000  10x10mm große Flächenleuchtsysteme, die auch auf dieser Platine eingesetzt werden können.

 

Flächenelemente 2366.1000

Leider  habe ich auf der Platine keine Bohrungen für diese Elemente vorgesehen, deshalb müssen die Haltestifte der Elemente abgeschnitten werden. Die Elemente können in Gruppen von 3x3 bzw. 3x2 mit z.B. Uhu Hart verklebt werden. Diese Gruppenelemente werden dann auf die Platine geklebt.

Erhältlich sind diese Flächenleuchtelemente z.B. bei TN-Electronics unter der Bestellnr. 120185 ab 0,41€ pro Element.

AVR-DCF-Clock mit Flächenleuchtelementen 

Wenn Interesse am Nachbau der AVR-DCF-Uhr besteht einfach melden. Ich habe noch ein paar unbestückte Platinen übrig, die ich gerne los werden würde.

 

Creative Commons License

 

Für den Fall, dass jemand "Angst" vor dem Löten von SMD-Bauteilen hat, hier noch ein paar Links zu Anleitungen mit dem Thema: