AVR-DCF-Clock

AVR-DCF-Clock

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 DCF77-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 DCF77-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! Und wer eher am Computer designen kann als seine Ideen handwerklich umzusetzen, kann sein GehĂ€usedesign sogar professionell herstellen lassen. Mithilfe einer gelieferten CAD-Datei kann man seine Frontplatte und sein GehĂ€use als EinzelstĂŒck fertigen lassen. Dann muss man seine Elektronik nur noch dort einbauen. Es gibt also viele Möglichkeiten, um sich ein solches Uhren-Unikat herzustellen!

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.

Leider sind die FlĂ€chenleuchtelemente recht schwer erhĂ€ltlich. Die einzige Bezugsquelle, die ich kenne ist die Firma TME . Dort kosten die Elemente ab 0,31€.

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

Hinweise zum Löten

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: