Projekt: Tischuhr

Diese Uhr ist als praktische Zeitanzeige für den Schreibtisch gedacht und bietet einige nützliche Zusatzfunktionen. So wird auf einem großen grafischen LCD die Zeit in Form einer Analoguhr und einer Digitaluhr angezeigt. Über 3 unabhängige Alarme kann man sich an wichtige Termine erinnern lassen, wobei einmalige, tägliche, wöchentliche oder monatliche Alarme programmiert werden können. Weiterhin erinnert die Uhr an bevorstehende Geburtstage und bietet Platz für 115 Einträge. Ein USB-Anschluss ermöglicht die Kommunikation mit einem PC und kann zum Update der Software über einen Bootloader verwendet werden. Selbstverständlich wird die Uhr mit dem DCF77-Signal synchronisiert. Als zentrales Bauteil dient hier ein ATmega128.

Letzte Bearbeitung: 21.02.2010

Downloads

Schaltplan tischuhr-sch.pdf
Stückliste mit Empfehlungen zur Bauteilbestellung tischuhr-stkl.htm
Software für ATmega128 mit komplettem Quelltext in C tischuhr-atmega128-v1001.zip vom 27.01.2010
Bootloader für ATmega128 UART1 Bootloader ATmega128 UART1 v2.9B
Homepage von Chip45 (aktuelle Bootloader-Versionen) http://www.chip45.com/info/chip45boot2.html

Inhaltsverzeichnis

Beschreibung Allgemeine Informationen über die Tischuhr
Schaltung Beschreibung der Schaltung und der Schaltungsoptionen
Hardware Bilder und Hinweise zum Aufbau der Uhr
Software Kurze Beschreibung der Uhrensoftware
Inbetriebnahme Inbetriebnahme der Uhr und Installation der Software
Bedienung Bedienungsanleitung und komplette Beschreibung aller Funktionen
Kommunikation Beschreibung der PC-Kommunikation über den USB-Anschluss
Sonstiges Einige Hintergrundinformationen zur Entwicklung der Uhr

Beschreibung

Die Motivation zur Entwicklung dieser Uhr war, dass zwar im ganzen Haus Uhren verteilt sind, an meinem Schreibtisch jedoch eine übersichtliche Zeitanzeige fehlt. Außerdem habe ich gelegentlich Termine wie z.B. eBay-Auktionen versemmelt, also musste unbedingt eine weitere Uhr mit einer Alarmfunktion her. Diese Uhr unterscheidet sich von allen anderen Uhren auf dieser Seite durch die Verwendung eines großen grafischen LCDs. Damit entfällt die Beschränkung auf wenige Anzeigestellen, die man sonst bei Siebensegment-Anzeigen hat und kann eine sehr flexible Anzeige realisieren. So bietet das verwendete LCD mit 240x128 Pixeln die Möglichkeit, folgende Informationen gleichzeitig anzuzeigen:

Die Bedienung der Uhr erfolgt über einen Drehimpulsgeber (mit integriertem Taster) sowie einen weiteren einzelnen Taster. Hiermit können weitere Funktionen aufgerufen werden, wie z.B. eine vollständige Geburtstagsliste mit bis zu 115 Einträgen, eine Seite mit zusätzlichen Informationen sowie mehrere Einstellungs-Seiten für die Konfiguration der Uhr. Die Uhr synchronisiert sich automatisch über einen Empfänger mit dem DCF77-Signal, kann aber auch manuell gestellt werden. Bei Auslösung eines Alarms ertönt eine von 10 Melodien, wobei ein Verstärker und ein Lautsprecher für eine ausreichende Lautstärke sorgt. Über einen optionalen USB-Anschluss kann die Uhr mit einem PC kommunizieren und ein Software-Update durchführen, sofern ein Bootloader installiert wurde. Eine weitere Besonderheit dieses Projektes ist die Software, die komplett in C geschrieben wurde.

Schaltung

Das zentrale Bauteil dieser Uhr ist der Mikrocontroller IC1 (ATmega128), welcher mit einer Taktfrequenz von 14,7456 MHz betrieben wird. Diese scheinbar krumme Frequenz wurde bewusst gewählt, weil sich daraus genaue Taktraten für die serielle Schnittstelle ableiten lassen, die für die Kommunikation über USB erforderlich sind. 12 Portleitungen des Controllers führen zum Display IC2, 8 Datenleitungen sind an den Ports PA0-PA7 angeschlossen und 4 Steuerleitungen an den Ports PC0-PC3. Die beiden Ports PB0 und PB7 steuern weitere Display-Funktionen. So lässt sich über PB0 sowie R4 und T2 das Display ein- und ausschalten. Diese Funktion habe ich eingebaut, weil viele Displays und die dazugehörigen Inverter den DCF77-Empfänger so stören, dass kein Empfang des Zeitsignals möglich ist. In einem solchen Fall kann die Uhr so eingestellt werden, dass zwischen 3:00 Uhr und 3:30 Uhr das Display komplett abgeschaltet wird, um wenigstens einmal täglich eine Synchronisierung zu ermöglichen.

PB7 kann über R1, R2 und T1 die Hintergrundbeleuchtung schalten und mittels PWM-Signal auch dimmen. Die Uhr lässt sich so einstellen, dass die Beleuchtung in einem wählbaren Zeitraum (z.B. über die Nachtstunden) ausgeschaltet wird oder mit geringerer Helligkeit aktiv ist. Für T1 habe ich den angegebenen Typ IRFD110 verwendet, welcher für Ströme bis 300mA geeignet ist. Bei höheren Strömen empfehle ich den IRL540, sonst werden die Verluste durch den Innenwiderstand zu groß. R18 ist abhängig vom verwendeten Display und muss mithilfe des Datenblattes ermittelt werden. Er liegt üblicherweise zwischen 5Ω und 20Ω. Einige Displays haben den Vorwiderstand bereits integriert, so dass in diesem Fall R18 entfallen kann. Dies sollte man aber unbedingt genau prüfen (Datenblatt) - ganz ohne Vorwiderstand wird die Beleuchtung mit Sicherheit Schaden nehmen. D1 wird nur benötigt, wenn ein Display mit CCFL oder EL verwendet wird und kann bei einer LED-Beleuchtung weggelassen werden.

Eine Eigenart der größeren grafischen Displays ist, dass sie eine zusätzliche Spannung von ungefähr -13V benötigen. Diese Spannung speist den LCD-Treiber und muss einstellbar sein, da sie den Kontrast des Displays bestimmt. Bei dem von mir verwendeten Display muss diese Spannung von einer zusätzlichen Schaltung erzeugt werden. Diese besteht aus dem Schaltregler IC4 und einigen weiteren Bauteilen. Der hier verwendete TL497A ist zwar schon etwas älter, erfüllt aber seinen Zweck. Über R8 stellt man den Kontrast des Displays ein, die angegebenen -13V sind nur ein Richtwert und können durchaus stark abweichen. Ein weiteres geeignetes IC für die Spannungserzeugung ist übrigens der ICL7662. Leider habe ich diesen erst entdeckt als die Schaltung schon fertig war.

An dieser Stelle noch ein Hinweis: Es ist wichtig, dass man vor dem Anschluss des Displays die LCD-Spannung kontrolliert. Das Display kann Schaden nehmen, wenn diese Spannung fehlt oder zu stark abweicht. Falls der Controller IC1 noch nicht bestückt ist, muss man zum Test die linke Seite von R4 an Masse legen, damit T2 durchschaltet und die Spannung für das Display und IC4 freigibt.

Viele Displays (insbesondere die teureren Modelle) haben bereits eine Schaltung integriert, die die benötigte LCD-Spannung erzeugt. Bei diesen Displays kann die umrahmte Schaltung mit IC4 komplett entfallen und es sind nur 2 Bauteile wie im nebenstehenden Bild nötig. Der Display-Kontrast wird dann über R19 eingestellt. In diesem Fall kann man die Spannung natürlich nur messen, wenn das Display eingeschaltet ist.

Für die Synchronisierung mit dem DCF77-Signal sorgt das DCF-Modul IC5. Die Betriebsspannung wird mit R13 und C22 etwas gefiltert, um Störungen von den anderen Komponenten und vom Netzteil zu reduzieren. Das Ausgangssignal des Empfängers gelangt über PE2 in den Controller. Ich habe hier ein Modul von Pollin verwendet, es kann aber praktisch jedes beliebige DCF77-Modul verwendet werden. Es spielt keine Rolle, ob der Ausgang invertiert ist oder einen Pull-Up-Widerstand benötigt - das kann später in den Einstellungen der Uhr angepasst werden.

Für die akustischen Funktionen ist der NF-Verstärker IC6 zuständig. Dieser kommt mit einer sehr sparsamen Außenbeschaltung aus und besitzt einen Steuereingang für die Lautstärke. Das Tonsignal wird vom Mikrocontroller über die Leitung PE3 ausgegeben und über R12 und R15 auf einen für IC6 verträglichen Pegel reduziert. An PB6 generiert der Controller ein PWM-Signal, welches durch R14 und C23 in eine äquivalente Gleichspannung gewandelt wird. Damit lässt sich IC6 über den gesamten Lautstärkebereich steuern. Ich nutze das in der Software nicht nur zur Einstellung der Lautstärke, sondern auch zur einfachen Hüllkurvensteuerung - es lassen sich damit ausklingende Töne erzeugen.

Wie schon erwähnt, kann die Uhr über USB mit einem PC verbunden werden und für diese Aufgabe ist IC7 zuständig. Dieser Chip aus dem Hause FTDI ist über PD2 und PD3 mit dem UART1 des Controllers verbunden und ermöglicht die Kommunikation über eine virtuelle COM-Schnittstelle mit hoher Geschwindigkeit, wobei die Uhr hier mit 921600 Bit/s arbeitet. Wenn ein Bootloader auf dem Controller installiert wurde, dann kann jederzeit ein Software-Update über den USB-Anschluss durchgeführt werden, ohne das Gehäuse der Uhr öffnen zu müssen. Wenn die USB-Funktionalität nicht benötigt wird, dann kann der umrahmte Schaltungsteil mit IC7 komplett entfallen.

Die Bedienung der Uhr erfolgt über den Drehimpulsgeber mit Taster S1, der über die Portleitungen PC4-PC6 an den Controller angeschlossen ist. Mit dem Impulsgeber wird durch Drehen die gewünschte Funktion ausgewählt und durch Drücken ausgeführt. Über einen weiteren Taster S2, der an PC7 angeschlossen ist, kann zur übergeordneten Menü-Ebene zurückgekehrt oder eine Eingabe abgebrochen werden. Ein dritter Taster S3 ist mit der Reset-Leitung des Controllers verbunden. Er ist für den normalen Betrieb der Uhr nicht notwendig und wird nur zum Starten des Bootloaders benötigt.
Die Jumper JP1-JP3 sind an den Ports PB2-PB4 angeschlossen und werden zur Konfiguration des Drehimpulsgebers benötigt. Hier wird festgelegt, welcher Geber-Typ verwendet wird und wie sich die Drehrichtung auf die Menü-Zeiger und Eingabewerte auswirken soll. Eine genaue Beschreibung ist am Ende des Abschnitts Inbetriebnahme zu finden.

Ein kleines, aber wichtiges Detail ist die an PD4 angeschlossene LED D3. Diese wird bei Auslösung eines Alarms aktiviert und blinkt dann mit 2 Hz. Weiterhin kann die LED das empfangene DCF77-Signal anzeigen. Ich habe für D3 eine ultrahelle orange LED verwendet und wegen der extremen Helligkeit nachträglich den Widerstand R10 auf 1,5kΩ vergrößert.

Zu den Anschlüssen: An K1 muss eine stabile Spannung von +5V zugeführt werden. Die heute üblichen Stecker-Schaltnetzteile liefern eine stabile Spannung, so dass man auf einen weiteren Spannungsregler in der Uhr verzichten kann. Allerdings muss man darauf achten, dass immer das richtige Netzteil angeschlossen wird - eine höhere oder falsch gepolte Spannung an K1 wird die Uhr mit Sicherheit beschädigen! Die Stromaufnahme der Uhr liegt auch bei voller Helligkeit der Hintergrundbeleuchtung weit unter 500mA und dürfte diesen Wert auch bei einer LED-Hintergrundbeleuchtung nicht überschreiten. Oft findet sich irgendwo ein ungenutztes Handy-Ladegerät mit 5V/500mA, welches man für die Uhr sehr gut verwenden kann.

K2 ist der ISP-Anschluss für den Mikrocontroller. Über diesen kann die Software in den Controller programmiert werden. Alternativ kann man auch einen Bootloader programmieren, das ermöglicht die Verwendung des USB-Anschlusses für das Programmieren der Software. Der Anschluss K3 war bei der Entwicklung der Software sehr hilfreich, für den Betrieb der Uhr ist jedoch nicht erforderlich und kann weggelassen werden. K4 ist der bereits beschriebene USB-Anschluss. Als Standard scheint sich Mini-USB durchzusetzen, trotzdem habe ich mich hier für eine Standard USB-B Buchse entschieden, weil sich diese besser auf einer Lochrasterplatine installieren lässt.

In dieser Stückliste sind alle benötigten Bauteile aufgeführt. Zusätzlich gibt es noch einige Empfehlungen für die Bestellung.

Hardware

Bis auf das Display und die beiden Bedienelemente finden alle Bauteile auf einer Lochrasterplatine Platz. Im mittleren Bereich befinden sich 2 Pfostenbuchsen, in die später eine Adapterplatine (Headerboard) mit einem ATmega128 (IC1) gesteckt wird. Auf der linken Seite sind alle für das Display nötigen Bauteile untergebracht: oben ein 20-poliger Steckverbinder für das Display, darunter der Spannungsregler IC4 für die LCD-Spannung mit der benötigten Außenbeschaltung sowie T2.

Unten links ist der Reset-Taster S3, ein 4-poliger Steckverbinder für den DCF77-Empfänger und das Trimmpoti R8 zu sehen. Rechts daneben geht es weiter mit dem ISP-Anschluss K2, dem JTAG-Anschluss K3 und den Jumpern JP1-JP3.

Rechts oben ist ein Inverter-Modul für eine CCFL-Hintergrundbeleuchtung zu sehen. Ursprünglich war mein Display mit einer solchen ausgestattet, später habe ich jedoch eine LED-Beleuchtung eingebaut, so dass dieses Inverter-Modul (ehemals IC3) nicht mehr vorhanden ist. Darunter kommt der NF-Verstärker IC6 mit seiner Außenbeschaltung und darunter der USB-Chip IC7, der USB-Anschluss K4 sowie der Stromanschluss K1. Um den beiden Buchsen K1 und K4 etwas mehr Stabilität zu geben, wurden sie zusätzlich mit Zweikomponenten-Kleber befestigt.

IC7 ist leider nur in SMD-Bauformen erhältlich, was die Verarbeitung nicht gerade einfach macht. Ich habe die Herausforderung angenommen und das IC direkt verdrahtet. Das ist allerdings eine sehr knifflige Angelegenheit bei einem Pin-Abstand von 0,65mm und wer dies scheut, sollte besser eine passende Adapterplatine verwenden.

Dieses Bild zeigt die Platine von unten. Es sieht nicht unbedingt schön aus und man sieht einige verzinnte Lötaugen ohne Funktion, die von verschiedenen Testschaltungen stammen. All das sieht man aber nicht mehr, wenn die Platine im Gehäuse eingebaut ist.

Die Leitungen für Masse und +5V wurden mit 0,5 mm Draht verlegt, für alle anderen Verbindungen wurde 0,2 mm Kupferlackdraht verwendet. Alle Leitungen sollten nicht länger als unbedingt nötig sein, insbesondere Q1, C13 und C14 sollten nah an IC1 angeordnet werden. Auch die vielen 100 nF Kondensatoren sollten sich immer nah an den ICs und den VCC/GND Anschlüssen befinden.

Die beiden Bedienelemente S1 und S2 habe ich auf einer separaten Platine untergebracht. Über ein 5-poliges Flachbandkabel wird diese später an die Hauptplatine angeschlossen.

Für die Montage des Displays und anderer Komponenten habe ich aus Aluminium-Blechstreifen zwei Halterungen gebogen und an die Platine geschraubt. Weiterhin wurde ein Holzstab mit Zweikomponenten-Kleber an den Display-Halterungen befestigt, er ist für die DCF77-Antenne vorgesehen, die sich nicht unbedingt in der Nähe von Metallteilen befinden sollte.

Auf diesem Bild steckt bereits das Headerboard mit dem Mikrocontroller auf den dafür vorgesehenen Steckverbindern. Ich habe hier ein Headerboard von SIPHEC verwendet, dieses hat bereits den Quarz Q1, sowie die Kondensatoren C3, C9, C12, C13, C14 und auch noch einen größeren Elektrolyt-Kondensator an Bord. Der bereits bestückte 16-MHz-Quarz musste allerdings ausgetauscht werden.

Hier wurde die kleine Platine mit dem Drehimpulsgeber S1 und dem Taster S2 an der rechten Halterung angeschraubt. Der Knopf des Drehimpulsgebers wird später ca. 10 mm aus dem Gehäuse ragen, damit man ihn gut greifen kann. Der darunter angeordnete Taster schließt bündig mit dem Gehäuse ab.

Ursprünglich sollten die beiden Bedienelemente unterhalb des Displays angeordnet werden, ungefähr so wie beim Anzeigemodul 2 des Temperaturmesssystems. Ich habe mich dann aber doch für seitliche Montage entschieden, damit das Gehäuse kompakter wird. Die Uhr lässt sich trotzdem gut bedienen.

Der Lautsprecher für diese Uhr konnte komplett mit Halterung aus einem alten PC recycled werden. Die Halterung kommt etwas anders als ursprünglich vorgesehen zum Einsatz, deshalb musste noch ein 3 mm Schraubenloch gebohrt werden - passt aber am Ende sehr gut und sitzt fest.

Auf diesem Bild ist die Tischuhr von hinten zu sehen. Das Display wurde montiert und über ein 20-poliges Kabel mit Pfostenbuchsen angeschlossen. Der DCF77-Empfänger wurde in die vorgesehene 4-polige Buchsenleiste gesteckt und die Antenne mit 2 Kabelbindern sowie 2 Puffern aus Silikon am Holzstab befestigt.

Ein Blick auf die rechte Seite zeigt, wie das Display an der Halterung befestigt ist. Auf der Display-Platine sind einige ungenutzte Lötaugen, die vermutlich für den Anschluss einer LED-Hintergrundbeleuchtung vorgesehen sind. Dort habe ich einfach die LED D3 eingelötet. Vorher wurde die Spitze etwas abgeschliffen, damit die LED die gleiche Höhe hat wie das Display. So lässt sich das komplette Modul später problemlos ins Gehäuse einschieben. Auch wird das Licht der LED dadurch etwas gestreut.

Ich habe mich für ein Gehäuse aus weißem Plastik-Material mit einer Stärke von 1,5 mm entschieden. Dies passt sehr gut zum blau-weißen Display und lässt sich auch recht gut verarbeiten. Das Gehäuse wurde (bis auf die rechte Seitenwand) zu einem Teil zusammengeklebt und das komplette Uhrenmodul wird später seitlich in das Gehäuse geschoben. Zum Kleben habe ich übrigens UHU plast verwendet.

Bevor das Uhrenmodul ins Gehäuse kommt, wird das rechten Seitenteil über angeklebte Halterungen am Uhrenmodul festgeschraubt und erst dann das komplette Modul in das Gehäuse geschoben. So sind von außen keine Schrauben sichtbar.

Auf diesem Bild ist die fertig zusammengebaute Uhr von vorn zu sehen.

Und so sieht die Uhr von hinten aus. Wichtig sind die Löcher für den Stromanschluss, den USB-Anschluss, den Reset-Taster und den Lautsprecher. Leider ist doch noch eine Schraube auf der linken Seite sichtbar, aber irgendwie muss ja das Modul im Gehäuse halten. Durch die Perspektive beim Fotografieren wirkt die Rückseite etwas verzogen. Ich versichere aber, dass die Rückwand rechteckig ist :-)

So sollte das Display aussehen, wenn sich die Uhr mit dem DCF77-Signal synchronisiert hat. Das weiße Gehäuse passt sehr gut zur blau/weißen Darstellung des Displays.

Software

Die Software für diese Uhr wurde komplett in C geschrieben. Der Quelltext besteht aus mehreren Dateien:

tischuhr.c enthält das eigentliche Programm
charset.h enthält Zeichensätze für die Schrift und für die Großziffern sowie Symbole
strings.h enthält eine Stringliste in deutscher und englischer Sprache
circle.h enthält eine Koordinaten-Tabelle mit Kreisdaten für die Zeiger-Darstellung
clock.h enthält eine Bitmap für das Ziffernblatt
sound.h enthält eine Tonhöhen-Tabelle und Musikdaten

Im Vergleich zum Anzeigemodul 2, welches vor der Tischuhr entwickelt wurde, sind einige Parallelen zu erkennen. So ist nicht nur der Schaltungskern sehr ähnlich - auch die Software hat vieles vom Anzeigemodul 2 geerbt. Trotzdem sind die Funktionen nicht vergleichbar und auch die Bedienung und die Menüstruktur ist bei der Tischuhr völlig anders. Ebenfalls völlig anders ist die verwendete Programmiersprache, die Tischuhr ist das erste Projekt, welches ich komplett in C realisiert habe.

Einige Worte zum Programm: Dieses gliedert sich in mehrere Abschnitte:

Der grundsätzliche Ablauf ist folgender: Nach der Initialisierung, die nur einmal nach dem Programmstart ausgeführt wird, läuft das gesamte Programm in einer Endlosschleife ab. Als erstes wird die Anzeige aktualisiert, wobei die Daten zunächst im Speicher vorbereitet und im nächsten Schritt als Datenblock in den Anzeigespeicher transferiert werden. Wegen des recht großen Speicherbedarfs des gesamten Displays wird das Bild in zwei Teilen bearbeitet, zuerst ist die Analoguhr dran und danach folgt die restliche Anzeige. Ist das erledigt, wird geprüft, ob der Drehimpulsgeber S1 oder der Taster S2 gedrückt wurde und falls ja, dann wird je nach gerade aktiver Menü-Ebene in eine entsprechende Aktion verzweigt. Ähnliches passiert, wenn am Impulsgeber gedreht wurde. Hier wird entweder die Menü-Position oder ein Eingabewert geändert.

Anschließend wird geprüft, ob ein vollständiger DCF77-Datensatz vorliegt und dieser dekodiert. Wenn die Daten fehlerfrei sind, werden sie zusätzlich mit den beiden vorherigen Datensätzen verglichen und erst wenn alles stimmt, wird die Zeit übernommen. Im weiteren Ablauf werden einige Zähler geprüft und Folgeaktionen gesteuert, z.B. wenn 24 h keine DCF-Zeit empfangen oder 2 min kein Taster betätigt wurde. Danach werden Zeiten verglichen, die Nachtschaltung gesteuert, Alarme geprüft und ausgelöst, die LED und die tägliche Reorganisation der Alarme und Geburtstage gesteuert.

Im Hintergrund wird alle 78,125 µs der Interrupt vom Timer 1 aktiv und der macht in abgestuften Intervallen folgendes: Es wird der Status des Drehimpulsgebers gelesen, entprellt und ein Positionswert ermittelt. Dann kommt der DCF77-Empfängers an die Reihe und beim Erkennen eines Impulses wird dessen Wert in einer Tabelle abgelegt. Die beiden Taster (vom Drehimpulsgeber und der Einzeltaster) werden ebenfalls gelesen, entprellt und der aktuelle Zustand gespeichert. Anschließend erfolgt die Zeitzählung für die Uhr und es werden noch einige Timeout-Zähler bearbeitet. Zum Schluss kommt noch die Steuerung der Soundausgabe, diese wird, nachdem sie vom Hauptprogramm angestoßen wurde, komplett von der Interruptroutine abgearbeitet.

Inbetriebnahme

Für die Inbetriebnahme der Tischuhr wird die aktuelle Software v1.001 vom 27.01.2010 für den ATmega128 benötigt. In diesem Paket befindet sich der komplette kommentierte Quelltext in C und das fertig compilierte HEX-File. Im einfachsten Fall nimmt man einfach den Programmieradapter seiner Wahl und schreibt das HEX-File über den ISP-Anschluss K2 direkt in den Mikrocontroller. Diese Option sollte man bei der ersten Inbetriebnahme der Uhr wählen, damit man sofort alle Funktionen überprüfen kann. Falls man die Uhr ohne den USB-Anschluss aufbauen möchte, dann bleibt diese Option auch zukünftig die einzige für ein Update der Software. In diesem Fall muss man allerdings das Gehäuse öffnen oder die Uhr so aufbauen, dass der ISP-Anschluss von außen zugänglich ist.

Die bessere Alternative ist, einen Bootloader in den Mikrocontroller zu programmieren und dann diesen für das Installieren der Software zu verwenden. Das ist natürlich nur sinnvoll, wenn der USB-Anschluss vorhanden ist, denn der Bootloader kommuniziert über diesen Anschluss. Der große Vorteil des Bootloaders ist, dass man jederzeit die Software aktualisieren kann, ohne das Gehäuse der Uhr öffnen zu müssen.

Direkte Installation der Software über ISP: Bei dieser Variante wird die Software in gewohnter Weise mit einem Programmiergerät (AVR-Programmierung) in den Mikrocontroller übertragen. Anschließend müssen noch einige Fuse-Bits gesetzt werden.

Bei Verwendung des AVR-Studios muss die Einstellung wie im linken Bild aussehen.

Wer noch mit PonyProg arbeitet, findet im nebenstehenden Bild die richtige Einstellung.

Unabhängig von der verwendeten Software sollte nach dem Übertragen des HEX-Files und der Einstellung der Fuse-Bits die Uhrensoftware starten.

Installation eines Bootloaders: Für diese Variante wird noch eine zusätzliche Software benötigt - der Bootloader. Dieser wird einmalig in einem Bereich am Ende des Flash-Speichers installiert und eine besondere Einstellung der Fuse-Bits bewirkt, dass sich dieser nach einem Systemstart oder einem Reset immer zu erst aktiviert. Der Bootloader initialisiert dann die serielle Schnittstelle des Mikrocontrollers (in diesem Fall den UART1, welcher mit dem USB-Chip verbunden ist) und wartet kurze Zeit auf eine bestimmte Zeichenfolge. Im normalen Betrieb bleibt diese Zeichenfolge aus und es wird anschließend die normale Software auf Adresse 0 gestartet. Empfängt der Bootloader die erwartete Sequenz, dann bleibt er aktiv und wartet auf weitere Kommandos. Eines dieser Kommandos ist der Empfang eines HEX-Files und das Ablegen der Daten im Flash-Speicher, also die Installation einer Software. Nachdem die Übertragung erfolgreich abgeschlossen wurde, kann der Bootloader beendet und die Software gestartet werden.

So ein Bootloader hat zwar im Prinzip nicht viel zu tun, trotzdem steckt viel Arbeit in einem solchen Programm. Glücklicherweise haben sich bereits einige Experten damit beschäftigt, so dass ich auf ein fertiges Produkt zurückgreifen konnte. Im Anzeigemodul 2 des Temperaturmesssystems habe ich bereits einen Bootloader von Pascal Stang verwendet, der an dieser Stelle auch hervorragend funktioniert. Leider habe ich bei der Tischuhr keine guten Erfahrungen damit gemacht. So blieb die Uhr gelegentlich beim Start im Bootloader hängen und ich konnte keine Lösung für dieses Problem finden. Also habe ich weiter gesucht und bin bei der Firma Chip45 fündig geworden. Hier kann man ein Paket mit fertigen Bootloadern für alle möglichen AVR-Controller downloaden, die sich durch folgende Eigenschaften auszeichnen:

Einen kleinen Nachteil möchte ich dennoch nicht verschweigen: Die Installation einer Software über den Bootloader dauert relativ lange. Damit kann man aber leben, zumal so ein Software-Update nicht all zu häufig durchgeführt wird.

Die Installation des Bootloaders funktioniert genauso wie die direkte Installation der Uhrensoftware über den ISP-Anschluss. Nur wird hier nicht die Software der Uhr in den Mikrocontroller übertragen, sondern der Bootloader. Hier kann die beim Schreiben des Textes aktuelle Version des Chip45 Bootloader ATmega128 UART1 v2.9A geladen werden. Ich empfehle aber, die Homepage Chip45 aufzusuchen und dort das aktuelle Paket zu laden. Nach dem Transfer des HEX-Files müssen auch hier die Fuse-Bits angepasst werden.

Bei Verwendung des AVR-Studios muss die Einstellung wie im linken Bild aussehen.

Wer noch mit PonyProg arbeitet, findet im nebenstehenden Bild die richtige Einstellung.

Nicht wundern: Nach der Übertragung des Bootloaders und der Einstellung der Fuse-Bits passiert auf dem Uhrendisplay nichts. Das ist vollkommen normal, denn die Uhrensoftware ist noch nicht installiert und der Bootloader greift nicht auf das Display zu.

Installation der Software über den Bootloader: Für diese Aktion muss zunächst die Uhr über ein USB-Kabel (A-Stecker auf B-Stecker) mit einem PC verbunden werden. Falls bisher noch kein USB-Gerät mit einem Chip aus der FT232-Serie angeschlossen war, verlangt Windows nach einem Treiber. Dieser kann von der FTDI Homepage geladen werden. Nach der erfolgreichen Installation des Treibers wird dem USB-Gerät ein virtueller COM-Port zugeordnet. Über diesen wird zukünftig die Kommunikation zwischen PC und Tischuhr stattfinden und deshalb sollte man sich die Nummer des Ports merken.

Als nächstes müssen wir eine Verbindung zum Bootloader der Uhr herstellen. Obwohl bei dem hier verwendeten Bootloader ein Terminalprogramm auf dem PC genügen würde, empfehle ich die Nutzung des vom Hersteller angebotenen GUI-Programmes. Es steht auf der bereits erwähnten Chip45 Homepage als Datei chip45boot2 GUI V1.9 (oder neuer) zum Download zur Verfügung.

Nach der Installation zeigt sich dieses Bild. Im Prinzip erklärt sich alles selbst: Auf der linken Seite wird der COM-Port eingestellt, welcher der Uhr zugeordnet wurde (in meinem Fall COM4). Gleich daneben wird die Baudrate eingestellt, hier empfiehlt sich die höchste Geschwindigkeit 230400. Zum Schluss wird noch über den Button Select Flash Hexfile die HEX-Datei mit der Uhrensoftware ausgewählt.

Jetzt ist gutes Timing erforderlich, denn man hat nur zwei Sekunden für die folgende Aktion zur Verfügung: Es muss gleichzeitig der Bootloader der Uhr gestartet und der Button Connect to Bootloader geklickt werden. Ich mache es immer so, dass ich zunächst den Reset-Taster der Uhr (S3) gedrückt halte und dann gleichzeitig mit dem Anklicken des Connect-Buttons wieder loslasse. Danach sollte das Status-Feld rechts unten grün aufleuchten und die Verbindung steht. Keine Panik, wenn es vielleicht nicht sofort klappt, man kann diesen Vorgang jederzeit wiederholen.

Falls sich hier kein Erfolg einstellt, dann empfehle ich, die Uhrensoftware über den ISP-Anschluss zu installieren und im Abschnitt Kommunikation weiterzulesen. Hier wird u.a. beschrieben, wie man die USB-Funktion prüfen kann.

Wenn der Verbindungsaufbau erfolgreich war, dann kann jetzt auf den Button Program Flash geklickt werden und der Transfer beginnt. Während dieser Aktion, die gut eine Minute dauert, leuchtet das Status-Feld gelb und ein blauer Balken zeigt den Fortschritt an. Nach erfolgreicher Übertragung wird das Status-Feld wieder grün. Jetzt noch auf den Button Start Application klicken und fertig. Anschließend sollte nach einer kurzen Pause die Uhr starten.

Nach dem kompletten Aufbau der Hardware und der Installation der Software ist die Tischuhr grundsätzlich funktionsfähig. Die Anzeige auf dem Display sollte so aussehen wie im linken Bild, möglicherweise sind alle Pixel invertiert. Deswegen braucht man sich jedoch keine Sorgen zu machen - das lässt sich alles konfigurieren.

Zunächst sind noch Einstellungen an der Hardware durchzuführen: Mit dem Trimmpoti R8 bzw. R19 (je nach Display-Version) wird der optimale Display-Kontrast eingestellt. Weiterhin sind noch die Jumper 1-3 zu beachten. Diese sind zur Konfiguration des Drehimpulsgebers vorgesehen und werden in der folgenden Tabelle beschrieben:

Jumper 1 offen Der verwendete Drehimpulsgeber arbeitet mit 2 Zustandsänderungen pro Drehschritt
Jumper 1 geschlossen Der verwendete Drehimpulsgeber arbeitet mit 4 Zustandsänderungen pro Drehschritt
Jumper 2 offen Rechtsdrehung des Drehimpulsgebers bewegt die Menü-Markierung nach unten
Jumper 2 geschlossen Rechtsdrehung des Drehimpulsgebers bewegt die Menü-Markierung nach oben
Jumper 3 offen Rechtsdrehung des Drehimpulsgebers vergrößert einen Wert
Jumper 3 geschlossen Rechtsdrehung des Drehimpulsgebers verkleinert einen Wert

Zur Erklärung: Es gibt 2 unterschiedliche Typen von Drehimpulsgebern, die sich in der Anzahl der ausgegebenen Zustandsänderungen bei jedem Drehschritt unterscheiden. Der von mir verwendete STEC12E08 gibt beispielsweise 4 Änderungen pro Drehschritt aus. In diesem Fall muss also der Jumper 1 geschlossen sein. Bei dem im Anzeigemodul 2 benutzten Typ EVQWTA-S20-15B sind es beispielsweise nur 2 Zustandsänderungen pro Drehschritt. Falls man einen solchen Impulsgeber verwendet, muss Jumper 1 geöffnet sein.

Der Drehimpulsgeber wird bei der Tischuhr in 2 Modi betrieben: Im Menü-Modus wird eine Markierung zur Funktionsauswahl bewegt und im Editor-Modus ein Wert geändert. Für beide Modi kann unabhängig voneinander die Bewegungsrichtung umgekehrt werden. Das ist sinnvoll, wenn sich der Drehimpulsgeber nicht vorn, sondern seitlich oder an der Oberseite befindet. Ich habe den Drehimpulsgeber an der rechten Seite und hier erscheint es logisch, die Richtung im Menü-Modus umzukehren. Aus diesem Grund ist bei meiner Uhr der Jumper 2 geschlossen.

Wenn man nicht sicher ist, dann kann man die richtige Einstellung auch durch Probieren ermitteln. Alle Jumper können bei laufender Uhr umgesteckt werden und die Änderungen werden sofort wirksam. Stellt man beispielsweise fest, dass bei jedem Drehschritt eine Menü-Position übersprungen wird, so hat man offensichtlich einen Geber mit 4 Zustandsänderungen und muss J1 schließen. Ähnlich kann man bei den Jumpern 2 und 3 die optimale Drehrichtung herausfinden.

Für die richtige Funktion sind noch weitere Einstellungen erforderlich. Das betrifft z.B. den DCF77-Empfänger. Da diese Einstellungen über die Menü-Dialoge der Uhr erfolgen, habe ich diese im folgenden Abschnitt Bedienung beschrieben.

Bedienung

In diesem Abschnitt werden alle Funktionen der Tischuhr und die Bedienung beschrieben. Für die erste Einstellung der Uhr empfehle ich, zunächst den folgenden Abschnitt mit den allgemeinen Informationen zu lesen. Bei der anschließenden Beschreibung der Untermenüs sollte bei den Einstellungen 1 fortgefahren werden, damit die Uhr in einen definierten Grundzustand gebracht werden kann.

Grundsätzliches: Die Tischuhr wird über eine Menü-Steuerung bedient. Das heißt, über das Display und die beiden Bedienelemente (Drehimpulsgeber S1 und Einzeltaster S2) wird ein Menü-Dialog aufgerufen, dort die gewünschte Funktion ausgewählt und dann die entsprechende Einstellung geändert. Dieses Prinzip gilt für alle Einstellungen an der Uhr. Um die folgende Beschreibung etwas zu vereinfachen, habe ich die beiden Tasterfunktionen folgendermaßen benannt:

OK Taster des Drehimpulsgebers S1
Zurück Einzeltaster S2

Im normalen Betrieb der Tischuhr sieht die Anzeige ungefähr so aus wie im nebenstehenden Bild. Den größten Teil der Anzeige (128 x 128 Pixel) nimmt eine Analoguhr ein. Auf dem restlichen Teil (112 x 128 Pixel) werden weitere Informationen angezeigt: eine Digitaluhr mit Datum und Wochentag, 3 Alarme und die nächsten 3 Geburtstage. Außerdem wird dieser Bereich für die Menü-Dialoge verwendet.

Ein Druck auf OK schaltet die Uhr in den Menü-Modus. Diesen Modus erkennt man daran, dass im Informationsbereich eine Umrahmung sichtbar wird, welche die gerade ausgewählte Option markiert. Außerdem werden im unteren Bereich anstatt der Geburtstage weitere Optionen eingeblendet. Durch Drehen am Impulsgeber kann die Markierung auf die gewünschte Option bewegt werden und ein Druck auf OK ruft diese Funktion auf.

Drückt man hingegen auf Zurück, dann wird der Menü-Modus wieder verlassen und die normale Uhrenanzeige ist wieder aktiv.

Hier wurde die im vorherigen Bild markierte Option ausgewählt und diese führt zum Untermenü Uhr einstellen. Auch in diesem sowie jedem anderen Untermenü kann durch Drehen am Impulsgeber die Umrahmung auf die gewünschte Option bewegt werden - in diesem Bild wurde der Tag markiert.

Ein Druck auf Zurück führt bei dieser Anzeige wieder zurück ins Hauptmenü.

Drückt man jetzt auf OK, dann wird der gewählte Wert invertiert dargestellt und die Uhr befindet sich nun im Editor-Modus. Ein Drehen am Impulsgeber führt in diesem Modus zu einer Änderung des gewählten Wertes entsprechend der Drehrichtung. Ist man mit dem neuen Wert zufrieden, dann wird durch einen weiteren Druck auf OK der Editor-Modus wieder verlassen und der neue Wert übernommen.

Drückt man während des Editor-Modus auf Zurück, dann wird der Editor-Modus ebenfalls verlassen, allerdings wird die Änderung verworfen und der ursprüngliche Wert wieder angezeigt.

Noch ein Hinweis: Wird ein Menü aufgerufen und über einen Zeitraum von 2 min kein Taster betätigt, dann kehrt die Anzeige in die normale Uhrenfunktion zurück. Falls gerade im Editor-Modus ein Wert bearbeitet wurde, dann geht dieser verloren. Auch werden z.B. beim Bearbeiten eines Alarms nicht alle Daten gespeichert. Es wird empfohlen, nach Änderungen in einem Untermenü dieses über den Taster Zurück wieder zu verlassen. So wird das Speichern der Daten sichergestellt. Bis auf wenige Ausnahmen werden alle Daten dauerhaft im EEPROM des Mikrocontrollers gespeichert.

Und hier noch einige Hinweise zum Drehimpulsgeber: Dieser verhält sich im Menü-Modus anders als im Editor-Modus. Im Menü-Modus kann die Markierung bis zur ersten bzw. letzten Menü-Option bewegt werden. Wird trotzdem weiter gedreht, dann bleibt die Markierung bei der ersten bzw. letzten Menü-Option stehen. Anders sieht das im Editor-Modus aus, hier kann über die Endwerte hinaus gedreht werden. Wird also nach dem größten möglichen Wert weitergedreht, dann wird der Wert zurückgesetzt und wieder von vorn begonnen. Die entgegengesetzte Drehrichtung funktioniert ebenso. Somit ist es oft möglich, den gewünschten Wert schneller zu erreichen. Eine weitere Besonderheit ist, dass ein schnelles Drehen von der Software erkannt wird und zu größeren Wert-Änderungen führt. Damit können große Wertebereiche, z.B. bei der Zeit-Eingabe sehr schnell durchlaufen werden.

Display: Das Display der Tischuhr ist (wie bereits erwähnt) in eine Analoguhr und einen Informationsbereich für die Digitaluhr, 3 Alarme, 3 Geburtstage und die Menü-Dialoge unterteilt. Die Analoguhr zeigt ständig die Uhrzeit mit 3 Zeigern an. Der Sekundenzeiger wird hier im Sekundentakt gesetzt, während Stunden- und Minutenzeiger kontinuierlich bewegt werden. Um die Analoguhr herum sind einige Symbole zu sehen, die den Status einiger Uhrenfunktionen anzeigen. Diese haben folgende Bedeutung:

[oben links] Die Uhr hat keine gültige Zeit. Keine Einstellung der Alarme und Geburtstage möglich und keine Alarm-Signalisierung!
[oben links] Kein DCF77-Empfang innerhalb der vergangenen 24 Stunden.
[oben links] Die Uhr wurde in den vergangenen 24 Stunden mit dem DCF77-Signal synchronisiert.
[oben rechts] Die Uhr zeigt die Normalzeit (Winterzeit) an.
[oben rechts] Die Uhr zeigt die Sommerzeit an.
[unten links] Die Sound-Ausgabe ist ausgeschaltet (stumm). Alarme werden nur über die LED signalisiert.
[unten links] Die Sound-Ausgabe ist eingeschaltet.
[unten rechts]  Die USB-Kommunikation ist aktiv.

Alarme: Bei der Tischuhr können 4 unabhängige Alarme eingestellt werden, wobei ein Alarm für die Geburtstage reserviert ist. Jedem Alarm kann eine von 10 Melodien sowie ein Lautstärkewert in 10 Stufen zugeordnet werden. Bei Auslösung eines Alarms wird eine Minute lang die eingestellte Melodie abgespielt, gleichzeitig blinkt die LED mit einer Frequenz von 2 Hz. Außerdem blinkt ein Symbol auf dem Display und weist auf den aktiven Alarm hin. Durch Drücken von OK oder Zurück kann das Alarmsignal vorzeitig beendet werden. Ansonsten blinken die LED und das Alarmsymbol solange, bis der ausgelöste Alarm durch Drücken von OK oder Zurück bestätigt wird.

Bei den 3 frei programmierbaren Alarmen können folgende Symbole angezeigt werden:

Der Alarm ist deaktiviert. Das Datum, die Uhrzeit und der Wochentag des letzten Alarms wird angezeigt.
Der Alarm wird einmal ausgelöst. Das Datum, die Uhrzeit und der Wochentag des Alarms wird angezeigt.
Der Alarm wird wiederholt ausgelöst. Das Datum, die Uhrzeit und der Wochentag des nächsten Alarms wird angezeigt.

Die Alarme werden beim Tageswechsel reorganisiert. Das bedeutet, dass z.B. ein einmaliger Alarm vom Vortag durch Wechsel des Symbols deaktiviert wird. Weiterhin wird bei wiederholenden Alarmen der nächste Alarmzeitpunkt ermittelt und die Anzeige entsprechend aktualisiert.

Geburtstage: Die Tischuhr kann insgesamt 115 Geburtstagstermine verwalten. Dabei wird das vollständige Datum sowie der Vor- und Nachname mit jeweils 15 Zeichen gespeichert. Auch hier wird wie bei den Alarmen beim Tageswechsel eine Reorganisation durchgeführt und gegebenenfalls die Liste neu geordnet. In der normalen Anzeige erscheinen dann immer die ersten 3 Einträge dieser Liste. Die Einträge werden übrigens nicht im EEPROM umsortiert - dort behalten sie ihre Position bei. Es wird eine sortierte Index-Liste im RAM erstellt und auf diese zugegriffen. Nur die ersten 3 Einträge dieser Liste werden nach der Reorganisation zusätzlich im EEPROM gespeichert, damit sie nach einem Neustart sofort wieder angezeigt werden können.

Wenn ein Geburtstag aktiv ist, dann wird dies mit einem kleinen blinkenden Dreieck-Symbol angezeigt. Im nebenstehenden Bild trifft dies auf Michael Richter zu, der 62 Jahre alt geworden ist. Bei den anderen Geburtstagen steht das Datum in Mini-Ziffern vor dem Namen. Der nächste wäre hier Ralf Rabe am 06.01.

Übrigens, die Namen und Geburtsdaten habe ich frei erfunden, Ähnlichkeiten mit realen Personen sind nicht beabsichtigt und daher rein zufällig.

Wie schon erwähnt, kann der Vor- und Nachname jeweils bis zu 15 Zeichen lang sein. Leider ist der verfügbare Platz in der Uhrenanzeige recht knapp, so dass viele Namen im Anzeigefeld gekürzt werden müssen. Die Software macht dies automatisch und das sieht nicht immer gut aus. In Extremfällen muss man selbst Hand anlegen und einen der Namen abkürzen.

Für alle Geburtstage kann ein Alarm programmiert werden: hier kann man die Uhrzeit, eine von 10 Melodien und einen Lautstärkewert festlegen. Wie bei den anderen Alarmen auch, ertönt dieser eine Minute lang und die LED blinkt. Im Gegensatz zu den 3 anderen Alarmen blinkt das Symbol den gesamten Tag. Generell werden alle Geburtstage am entsprechenden Tag signalisiert. Die einzige Ausnahme sind Geburtstage am 29.02., diese werden in Nicht-Schaltjahren erst am 01.03. signalisiert.

Hauptmenü

Das Hauptmenü wird durch Drücken des Tasters OK aufgerufen. Dabei stehen 9 Elemente zur Auswahl, die in der folgenden Übersicht grün dargestellt werden. Drückt man nach Auswahl eines dieser Elemente auf OK, dann erreicht man das Untermenü, welches rechts neben dem Element orange dargestellt wird.

Hauptmenü
Uhrzeit Uhr einstellen (Zeit und Datum)
Alarm 1 Alarm einstellen (1) (Alarm-Modus, Zeit, Datum, Wochenprogramm, Melodie, Lautstärke)
Alarm 2 Alarm einstellen (2) (Alarm-Modus, Zeit, Datum, Wochenprogramm, Melodie, Lautstärke)
Alarm 3 Alarm einstellen (3) (Alarm-Modus, Zeit, Datum, Wochenprogramm, Melodie, Lautstärke)
Geburtstage Geburtstagsliste 1 (8 Einträge) - Geburtstagsliste 2 (4 Einträge) - Geburtstag eingeben (Datum, Vorname, Nachname)
Informationen Informationen (Software-Version, Zeit der letzten DCF77-Synchronisierung, Anzahl der Geburtstags-Einträge)
Einstellungen 1 Einstellungen 1 (Allgemeine Einstellungen)
Einstellungen 2 Einstellungen 2 (Einstellungen für DCF77-Empfänger und Geburtstags-Anzeige)
Einstellungen 3 Einstellungen 3 (Sound-Einstellungen)

Im folgenden Abschnitt werden alle Untermenüs beschrieben.

Uhrzeit Uhr einstellen

Über dieses Untermenü kann die Uhr manuell gestellt werden und es wird im Hauptmenü durch Auswahl der Uhrzeit erreicht. Normalerweise ist es nicht notwendig, die Uhr zu stellen, da sie sich die Zeit über das DCF77-Signal holt. Diese Option ist aber trotzdem nützlich, wenn man nicht auf die DCF77-Synchronisierung warten will oder wenn Probleme beim DCF77-Empfang auftreten. Grundsätzlich kann man die Uhr sogar ohne DCF77-Empfänger betreiben. Ich rate jedoch davon ab, da der Oszillator des Mikrocontrollers in dieser Schaltung nicht abgeglichen werden kann und somit Abweichungen von einigen Sekunden pro Tag möglich sind.

Zum Stellen der Uhr wird folgendermaßen vorgegangen: Zunächst wird die Zeit und das Datum der nächsten (oder übernächsten) Minute eingestellt. Danach wird die Menü-Markierung auf die Option Zeit übernehmen gesetzt und beim Erreichen des gewählten Zeitpunktes sekundengenau auf OK gedrückt. Das Untermenü wird dann verlassen und zur normalen Anzeige gewechselt. Auch hier gilt: wird länger als 2 Minuten gewartet, dann springt die Uhr in die normale Anzeige zurück, ohne die Zeit zu ändern.

Beim manuellen Einstellen der Uhr sollte beachtet werden, dass anschließend keine Symbole für den DCF77-Empfang und die Normal- bzw. Sommerzeit mehr angezeigt werden. Es erfolgt auch keine automatische Umstellung der Uhrzeit auf Sommerzeit und zurück. Falls im weiteren Betrieb irgendwann eine DCF77-Synchronisierung erfolgt, dann erscheinen die Symbole natürlich wieder.

Hier folgt die Beschreibung der Funktionen in diesem Untermenü:

Zeit 00:00 - 23:59 Hier wird die Uhrzeit eingestellt. Wie bereits weiter oben erwähnt, gibt es keine Grenzen und so kann man beispielsweise auf kurzem Weg von 23:30 Uhr über 0:00 auf 0:20 Uhr drehen. Auch kann man hier die Beschleunigung beim schnellen Drehen gut anwenden.
Tag 1 - 31 Über diese Funktion wird der Kalendertag eingestellt.
Monat Januar - Dezember Über diese Funktion wird der Monat im Klartext eingestellt.
Jahr 10 - 99 Hier kann das Jahr zweistellig eingegeben werden. Das Jahrhundert ist fest auf 20 eingestellt und lässt sich auch nicht ändern. Ich glaube einfach nicht, dass eine solche Uhr das Jahr 2100 erleben wird :-)
Zeit übernehmen   Wird diese Funktion ausgeführt, dann prüft die Software zunächst die Plausibilität der eingegeben Daten. Wenn alles passt, dann wird die Uhr gestellt und die Anzeige wechselt in den normalen Modus. Der Wochentag wird hier übrigens mit einer so genannten Wochentagsformel berechnet und automatisch gesetzt. Tritt beim Plausibilitätstest ein Fehler auf, dann wird automatisch die Menü-Markierung auf den Tag gesetzt und der Editor-Modus mit dem maximal möglichen Tageswert des gewählten Monats voreingestellt. Erst wenn der Fehler korrigiert wird, lässt sich die Zeit übernehmen.
DCF77-Sync starten   Die Uhr empfängt und verarbeitet ständig im Hintergrund das DCF77-Signal, so dass man sich normalerweise nicht um die Synchronisierung kümmern muss. Durch den kompakten Aufbau der Uhr wirken allerdings auch viele Störsignale der Uhrenkomponenten auf den DCF77-Empfang, was im Extremfall dazu führt, dass gar kein Signal mehr empfangen wird. Für solche Fälle ist diese Funktion gedacht. Sie schaltet das Display und die Hintergrundbeleuchtung aus und somit auch die größten Störquellen. Danach wird eine halbe Stunde lang auf ein gültiges DCF77-Signal gewartet und während dieser Zeit werden die empfangenen Impulse durch kurzes Aufblitzen der LED angezeigt. Sobald die Uhr über 3 aufeinander folgende Minuten ein fehlerfreies Signal empfangen hat, wird das Display wieder eingeschaltet und die normale Anzeige erscheint wieder.

Alarm 1 Alarm einstellen (1)
Alarm 2 Alarm einstellen (2)
Alarm 3 Alarm einstellen (3)

Diese Untermenüs werden durch Auswahl des entsprechenden Alarms im Hauptmenü aufgerufen. Im nebenstehenden Bild wurde der Alarm 1 ausgewählt.

Zur Einstellung eines Alarms sollte zuerst über die Option Alarm der gewünschte Alarmtyp ausgewählt werden. Danach aktiviert die Software die für den Alarmtyp relevanten Datenfelder. Außerdem werden einige Felder mit aktuellen Daten vorausgefüllt. Ändert man nachträglich den Alarmtyp, dann kann es passieren, dass einige Werte durch neue Voreinstellungen ersetzt werden. Das betrifft den Tag, den Monat, das Jahr und das Wochen-Progr. (Wochen-Programm). Weitere Einstellungen wie die Zeit und die Sound-Einstellungen werden nicht automatisch verändert.

Alarm (Alarmtyp) Aus Der Alarm ist ausgeschaltet. Weitere Parameter werden zwar angezeigt, können aber nicht ausgewählt oder verändert werden.
Einmal Der Alarm ist eingeschaltet und wird genau einmal ausgelöst. Nach Auswahl dieser Einstellung zeigen die Datenfelder als Voreinstellung das aktuelle Datum an. Bei diesem Alarmtyp ist die Uhrzeit und das komplette Datum relevant.
Täglich Der Alarm ist eingeschaltet und wird täglich ausgelöst. Bei diesem Alarmtyp ist nur die Uhrzeit relevant.
Wöchentlich Der Alarm ist eingeschaltet und wird entsprechend des eingestellten Wochen-Programms ausgelöst. Nach Auswahl dieser Einstellung wird das Wochen-Programm auf den aktuellen Wochentag voreingestellt. Bei diesem Alarmtyp ist die Uhrzeit und das Wochen-Programm relevant. Es sind hier neben den einzelnen Wochentagen auch Gruppen wie Mo-Fr, Mo-Sa und Sa-So möglich.
Monatlich Der Alarm ist eingeschaltet und wird am festgelegten Tag im Monat ausgelöst. Nach Auswahl dieser Einstellung wird der heutige Tag voreingestellt. Hier ist neben der Zeit nur der Tag relevant. Es gibt noch eine Besonderheit: Wird ein Tag zwischen 28 und 31 eingestellt, dann setzt die Software die Alarm-Auslösung immer auf den letzten Tag des Monats.
Zeit 00:00 - 23:59 Hier wird die Uhrzeit für die Alarmauslösung eingestellt. Diese Zeit gilt bei wiederholenden Alarmen für alle nachfolgenden Alarme gleichermaßen.
Tag 1 - 31 Hier wird der Kalendertag für die Alarmauslösung eingestellt. Diese Angabe lässt sich nur bei einmaligen und monatlichen Alarmen auswählen und verändern.
Monat Januar - Dezember Hier wird der Monat für die Alarmauslösung eingestellt. Diese Angabe wird nur bei einmaligen Alarmen benötigt und kann deshalb auch nur bei diesem Alarmtyp ausgewählt und verändert werden.
Jahr aktuell - 2099 Hier wird das Jahr für die Alarmauslösung eingestellt. Auch diese Angabe gilt nur für einmalige Alarme. Einstellbar ist das Jahr im Bereich vom aktuellen Jahr bis 2099.
Wochen-Progr. (Wochen-Programm) Mo, Di, Mi, Do, Fr, Sa, So, Mo-Fr, Mo-Sa, Sa-So Hier werden die Tage für wöchentliche Alarmauslösungen ausgewählt.

Über dieses Symbol kann eine von 10 Melodien für den akustischen Alarm ausgewählt werden.

Die folgenden Melodien stehen zur Auswahl. Diese sind entweder sehr kurz oder gegenüber dem Original stark gekürzt worden. Ich hoffe, es ist für jeden etwas dabei:

  1. Buzzer - ein typisches Weckersignal, bestehend aus 4 kurzen Tönen
  2. Close Encounters (of the third kind) bzw. Unheimliche Begegnung der dritten Art - die bekannte Tonfolge aus dem gleichnamigen Film
  3. Westminster - die bekannten Glockenschläge aus London
  4. Crockett's Theme (Jan Hammer) - bekannt aus der Serie Miami Vice
  5. Axel F. (Harold Faltermeyer) - bekannt aus dem Film Beverly Hills Cop
  6. Popcorn (Hot Butter)
  7. Blue Peter (Mike Oldfield)
  8. Around The World (ATC)
  9. Für Elise (Ludwig van Beethoven)
  10. Happy Birthday (Mildred J. & Patty Smith Hill)

Über dieses Symbol kann die Lautstärke im Bereich von 0 - 10 eingestellt werden. Beim Wert 0 bleibt der Lautsprecher stumm und es erfolgt nur eine optische Signalisierung über die LED.

Über dieses Symbol kann die Soundausgabe getestet werden. Die gewählte Melodie wird einmal mit der gewählten Lautstärke-Einstellung abgespielt.

Während des Abspielens blinkt das kleinere Symbol neben dem Lautsprecher. Ein Druck auf OK beendet das Abspielen vorzeitig.

Geburtstage Geburtstagsliste 1 Geburtstagsliste 2 Geburtstag eingeben

Für die Verwaltung der Geburtstage wurden die Menü-Seiten mehrstufig angelegt. Das mag auf den ersten Blick etwas verwirrend sein, ist es aber eigentlich nicht, da man sich geradlinig mit einer Auswahl und OK in die nächste Seite bewegt und mit Zurück wieder zur vorherigen Seite. Auf dem nebenstehenden Bild wurde über die Hauptmenü-Option Geburtstage die Geburtstagsliste 1 aufgerufen. Diese Liste dient zur Übersicht und zeigt die nächsten 8 Geburtstagseinträge an. Das Anzeigeformat ist hier identisch mit denen in der normalen Uhrenanzeige.

In dieser Liste kann man sich mit dem Drehimpulsgeber durch die Einträge bewegen und bei Erreichen des oberen oder unteren Eintrages wird die Liste gescrollt. In diesem Bild wurde die Markierung nach unten bewegt und der nächste Schritt des Impulsgebers führte zum Nachrücken der Einträge. Damit man nicht den Überblick verliert, zeigt ein Zähler in der Titelzeile immer die aktuelle Listenposition des markierten Eintrages an (in diesem Fall 9). Die Liste ist hier nach dem Geburtsdatum sortiert, so dass man die anstehenden Geburtstage gut überblicken kann. Es ist aber auch möglich, die Liste nach dem Vor- oder nach dem Nachnamen zu sortieren. Damit lässt sich ein bestimmter Name schneller auffinden. Die Sortierung und weitere Parameter können im Hauptmenü unter Einstellungen 2 festgelegt werden.

Möchte man weitere Information über einen bestimmten Eintrag haben, dann wählt man diesen Eintrag aus (in diesem Fall Eintrag Nummer 4) und gelangt dann mit OK in die Geburtstagsliste 2.

Die Geburtstagsliste 2 zeigt 4 Einträge etwas ausführlicher an. So erscheint hier zusätzlich noch das Geburtsjahr und die Namen werden weitgehend vollständig dargestellt. In der anderen Liste sowie in der normalen Uhrenanzeige werden die Namen gekürzt, wenn sie nicht auf die Zeile passen. Auch in dieser Liste kann mit dem Drehimpulsgeber durch die Liste gescrollt werden und die Titelzeile zeigt auch hier die aktuelle Listenposition an. Aus dieser detaillierten Liste kann man mit Zurück wieder in die vorherige Liste mit 8 Einträgen springen. Drückt man auf OK, dann gelangt man in das Menü Geburtstag eingeben.

In diesem Menü kann ein Geburtstagseintrag editiert werden. Dazu wird mit dem Drehimpulsgeber das gewünschte Datenfeld ausgewählt und mit OK in den Editor-Modus gewechselt. Die folgende Übersicht beschreibt die einzelnen Datenfelder:

Tag 1 - 31 Hier wird der Kalendertag des Geburtstages eingestellt.
Löschen Wählt man diese Einstellung aus (liegt zwischen 31 und 1) und drückt anschließend OK, dann wird der komplette Eintrag unwiederbringlich gelöscht. Gleichzeitig springt die Anzeige in die übergeordnete Geburtstagsliste 2 zurück.
Monat Januar - Dezember Hier wird der Geburtsmonat im Klartext eingestellt.
Jahr 0 - aktuell Hier wird das Geburtsjahr eingestellt. Das Jahr kann vom aktuellen Jahr aus nur in die Vergangenheit geändert werden, wobei man bis zum Jahr 0 zurückgehen kann.
Unbekannt Diese Einstellung (liegt zwischen dem aktuellen Jahr und 0) kann man benutzen, wenn zwar Tag und Monat des Geburtstages bekannt sind, nicht aber das Jahr. Ein solcher Geburtstag wird später immer ohne Altersangabe angezeigt.
Vorname   Hier wird der Vorname eingegeben, der bis zu 15 Zeichen lang sein kann. Für die Eingabe wird ein spezieller Editor-Modus aktiviert, der weiter unten beim Erfassen eines neuen Geburtstages beschrieben wird.
Nachname   Hier wird der Nachname eingegeben, der ebenfalls bis zu 15 Zeichen lang sein kann. Auch hier folgen noch weitere Erklärungen.

Bei der Inbetriebnahme der Uhr sind zunächst alle Geburtstagseinträge leer. Die Geburtstagsliste 1 sieht dann ähnlich aus wie im nebenstehenden Bild, nur sind dann alle 8 sichtbaren Einträge leer - egal an welcher Listenposition man sich gerade befindet.

Wenn man durch Auswahl eines leeren Eintrages in die Geburtstagsliste 2 wechselt, dann sieht das hier ebenso leer aus. Dagegen wollen wir etwas tun und einen neuen Geburtstag in die Liste eintragen. Dazu wählt man einfach einen [Leer]-Eintrag aus und drückt auf OK. Welchen dieser Einträge man nimmt, spielt keine Rolle. Die Software sucht automatisch den nächsten freien Platz im EEPROM des Controllers und schreibt die Daten dann dort hinein. Der Listeneintrag bleibt zunächst an der ausgewählten Position. Nach der Rückkehr ins Hauptmenü bzw. in die normale Uhrenanzeige wird die Liste neu sortiert und der Eintrag an die entsprechende Position verschoben.

Als Beispiel soll hier der Gustav Färber eingetragen werden, der am 23. August 1987 geboren wurde. Im nebenstehenden Bild wurden bereits die Geburtsdaten erfasst. Weiterhin wurde im Feld Vorname auf OK gedrückt. Dabei wird in einen speziellen Editor-Modus geschaltet, der sich zunächst wie in diesem Bild präsentiert. Wichtig: Alle weiteren Eingaben in diesem Modus erfolgen nun über den Drehimpulsgeber und dessen Taster OK. Wird während der Eingabe auf Zurück gedrückt, dann beendet sich der Editor-Modus und die Eingabe wird verworfen.

Der vergrößerte Ausschnitt zeigt einen Cursor mit einem invertierten A, der zum einen die aktuelle Position markiert (links vom Cursor) und zum anderen das Zeichen darstellt, welches beim Druck auf OK an die Position übernommen wird. Die Software setzt bei der Eingabe eines neuen Namens immer den ersten Buchstaben auf ein großes A, damit man nicht lange nach den Großbuchstaben suchen muss. Da wir für unseren Gustav ein G brauchen, drehen wir jetzt einfach solange den Impulsgeber nach rechts, bis ein G erscheint und drücken auf OK.

Danach zeigt sich dieses Bild. Das G wurde jetzt übernommen und die Cursor-Position um eine Stelle nach rechts gerückt. Gleichzeitig hat sich der Cursor in ein a gewandelt. Dies passiert immer an der zweiten Cursor-Position, um auch hier schneller an die Kleinbuchstaben zu kommen. Weitere Zeichenvorschläge erfolgen nicht mehr (außer an der letzten Position, dazu später mehr). Da unser Name mit einem u weitergeht, wird der Impulsgeber nun bis zum u gedreht.

Hier ist nun das zweite Zeichen korrekt ausgewählt und das sollte mit OK bestätigt werden. Und weiter geht es mit dem dritten Zeichen.

Upps, hier ist uns wohl ein kleiner Fehler unterlaufen. Kein Problem - für diesen Fall wird der Impulsgeber einfach weitergedreht, bis das Zeichen im nebenstehenden Bild erscheint. Dieses ist das Löschzeichen und wenn man jetzt auf OK drückt, dann wird das Zeichen links vom Cursor gelöscht.

Irgendwann ist der Name komplett und wenn man mit dem Ergebnis zufrieden ist, wird der Impulsgeber auf das im nebenstehenden Bild sichtbare Zeichen OK gedreht. Drückt man jetzt auf den Taster OK, dann wird der Name gespeichert und der Editor-Modus beendet.

Auf die gleiche Weise wird nun noch der Nachname eingegeben.

Anschließend kann man mit Zurück in die Geburtstagsliste 2 zurückkehren und hier erscheint nun unser soeben eingegebener Geburtstag. Nach der Rückkehr ins Hauptmenü oder in die Uhrenanzeige (über Zurück) wird die Indexliste neu sortiert und nach einem erneuten Aufruf der Geburtstagsliste wird man den Eintrag an der entsprechenden Position wieder finden.

Hier noch einige Informationen zum Editor-Modus für die Datenfelder Vorname und Nachname: Es stehen folgende Zeichen zur Verfügung, die auch genau in dieser Reihenfolge erscheinen:

-.0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZÄÖÜabcdefghijklmnopqrstuvwxyzäöüß

Daran schließen sich noch 2 Symbole an, die folgende Bedeutung haben:

Bei diesem Symbol wird das Zeichen links vom Cursor gelöscht und der Cursor um eine Position nach links gerückt.
Mit diesem Symbol wird die Eingabe beendet und der eingegebene Name gespeichert.

Die folgende Übersicht fasst noch einmal die Besonderheiten zusammen:

Informationen Informationen

Zu diesem Untermenü gibt es nicht viel zu sagen. Im oberen Bereich wird die vollständige Software-Version angezeigt, wobei links im Bild noch eine Vorabversion genutzt wird. Der mittlere Bereich zeigt an, wann die Uhr zum letzten Mal mit dem DCF77-Signal synchronisiert wurde. Ganz unten kann man sich über die Belegung des Geburtstags-Speichers informieren.

Über die Taster OK oder Zurück gelangt man wieder zurück ins Hauptmenü.

Einstellungen 1 Einstellungen 1

Dies ist das erste von 3 Untermenüs, über das die Uhr konfiguriert werden kann. Dieses Menü beinhaltet allgemeine Funktionen, die in der nachfolgenden Tabelle beschrieben werden:

Sprache Deutsch Alle Texte werden in deutscher Sprache ausgegeben.
Englisch Alle Texte werden in englischer Sprache ausgegeben.
  Hinweis: Die Namen der Melodien bei der Alarm-Einstellung werden immer in der Originalsprache ausgegeben.
Analog-Uhr Links Die Analoguhr wird auf der linken Display-Seite angezeigt.
Rechts Die Analoguhr wird auf der rechten Display-Seite angezeigt.
Display Normal Die Pixel werden normal in den Display-Speicher geschrieben.
Invers Die Pixel werden invertiert in den Display-Speicher geschrieben.
  Hinweis: Bei den meisten Displays empfiehlt sich die Einstellung Normal. Bei dem von mir verwendeten Display sieht die Einstellung Invers jedoch besser aus. Die optimale Einstellung sollte man einfach ausprobieren.
Nacht-Sync Aus Das Display bleibt ständig eingeschaltet.
Ein Das Display wird in der Nacht zwischen 3:00 Uhr und 3:30 Uhr ausgeschaltet. Das Display und die dazugehörigen Inverter-Schaltungen können den DCF77-Empfang so stark stören, dass keine Synchronisierung mehr möglich ist. Diese Option ermöglicht in solchen Fällen eine sichere DCF77-Synchronisierung, die auch den Wechsel zwischen Normal- und Sommerzeit zeitnah berücksichtigt. Die Uhr läuft in diesem Zeitraum normal weiter und auch Alarme werden signalisiert, gegebenenfalls wird die Synchronisierung abgebrochen.
Bei dieser Option wird außerdem 2 Minuten nach Einschalten oder Reset der Uhr das Display zur DCF77-Synchronisierung ausgeschaltet. Durch Drücken einer der Taster kann dieser Vorgang jedoch jederzeit abgebrochen werden.
Nacht-Modus Aus Die Hintergrundbeleuchtung des Displays bleibt ständig mit voller Helligkeit eingeschaltet. Die 3 folgenden Optionen auf dieser Seite haben keine Wirkung.
Ein Das Display wird in einem festgelegten Zeitraum ausgeschaltet bzw. auf einen bestimmten Helligkeitswert gedimmt. Die Parameter können über die folgenden 3 Optionen eingestellt werden. Wird während des aktiven Nacht-Modus ein Alarm ausgelöst oder ein Taster betätigt, dann schaltet die Anzeige sofort auf die volle Helligkeit. 2 Minuten nach der Alarmauslösung bzw. nach der letzten Tastenbedienung schaltet die Anzeige wieder in den Nacht-Modus zurück.
  Hinweis: Ich habe den Begriff Nacht-Modus gewählt, weil man diesen im Allgemeinen in der Nacht anwenden wird. Es ist aber ein beliebiger Zeitraum auch am Tag einstellbar.
Nacht-Helligkeit 0 - 255 Hier wird der Helligkeitswert für den Nacht-Modus eingestellt. Dieser wird während des Nacht-Zeitraums (in den folgenden 2 Optionen einstellbar) aktiv. In der restlichen Zeit hat die Hintergrundbeleuchtung immer die volle Helligkeit. Der Wert 0 schaltet die Hintergrundbeleuchtung aus, der Wert 255 entspricht der vollen Helligkeit. Nach der Eingabe eines Wertes (Auswahl und Bestätigung mit OK) wird die Hintergrundbeleuchtung für 1 Sekunde in die gewählte Helligkeitsstufe geschaltet, damit man die Einstellung gleich prüfen kann.

Hinweis: Bei LED-Hintergrundbeleuchtungen kann man uneingeschränkt alle Werte zwischen 0 und 255 verwenden. Bei Beleuchtungen mit CCFL oder EL-Folien ist Vorsicht geboten. Ob sich diese dimmen lassen, hängt vom verwendeten Inverter ab. Im Zweifelsfall sollte man lieber den Wert 0 einstellen und somit in der Nacht die Beleuchtung ganz abschalten.

Nacht von 00:00 - 23:59 Diese Einstellung bestimmt den Zeitpunkt zur Abschaltung bzw. Dimmung der Hintergrundbeleuchtung.
Nacht bis 00:00 - 23:59 Diese Einstellung bestimmt den Zeitpunkt zur Rückschaltung auf die volle Helligkeit.

Einstellungen 2 Einstellungen 2

In diesem Untermenü sind Einstellungen für den DCF77-Empfänger und die Geburtstagsanzeige zu finden. Die beiden DCF77-Optionen sind enorm wichtig - nur bei richtiger Einstellung ist ein Datenempfang und somit das automatische Stellen der Uhr möglich. Die folgende Tabelle beschreibt die möglichen Einstellungen:

DCF-Signal Normal Diese Einstellung muss gewählt werden, wenn der DCF77-Empfänger Low-Impulse ausgibt.
Invers Diese Einstellung muss gewählt werden, wenn der DCF77-Empfänger High-Impulse ausgibt.
DCF-Pull-up Aus Diese Einstellung muss gewählt werden, wenn der DCF77-Empfänger einen Ausgang hat, der sowohl Low- als auch High-Pegel ausgeben kann.
Ein Diese Einstellung muss gewählt werden, wenn der DCF77-Empfänger einen Open-Collector bzw. Open-Drain Ausgang besitzt.
  Einstellung bei Pollin 810054 - DCF-Signal Invers und DCF-Pull-up Aus
Einstellung bei Reichelt DCF77 MODUL - DCF-Signal Invers und DCF-Pull-up Aus
Einstellung bei Conrad 641138 - DCF-Signal Normal/Invers (abhängig vom benutzten Ausgang) und DCF-Pull-up Ein
Einstellung bei ELV 68-352-62 - DCF-Signal Normal und DCF-Pull-up Ein

Hinweis: Wenn man sich nicht sicher ist, dann muss man einfach alle 4 Kombinationen ausprobieren. Sehr hilfreich ist dabei die Option Uhrzeit - Uhr einstellen - DCF77-Sync starten. Bei richtiger Einstellung muss die LED im Sekundentakt kurz aufblitzen. Hat man den Eindruck, die LED ist hauptsächlich an und verlischt kurz im Sekundentakt, dann muss die Einstellung DCF-Signal geändert werden. Ist die LED ständig an oder aus, dann sollte man die Einstellung DCF-Pull-up Aus versuchen.

Noch ein Hinweis zum Pollin-Empfänger: Dieser beginnt erst 2 Minuten nach dem Einschalten mit dem Empfang, gibt dann aber kontinuierlich Impulse aus.

Geb-Sort
(Geburtstage-Sortierung)
Datum Die Geburtstagsliste wird chronologisch nach dem Datum sortiert, an erster Stelle erscheint der nächste fällige Geburtstag. Diese Einstellung wird empfohlen, um beim Aufruf der Geburtstagsliste einen zeitlichen Überblick über die nächsten Geburtstage zu bekommen.
Vorname Die Geburtstagsliste wird alphabetisch nach dem Vornamen sortiert. Um eine möglichst schnelle Sortierung zu erreichen, werden nur die ersten beiden Zeichen des Vornamens ausgewertet. Sind diese gleich, dann entscheidet das erste Zeichen vom Nachnamen über die Reihenfolge. Diese Einstellung ist sinnvoll, wenn man einen bestimmten Eintrag in der Geburtstagliste sucht.
Nachname Die Geburtstagsliste wird alphabetisch nach dem Nachnamen sortiert. Um eine möglichst schnelle Sortierung zu erreichen, werden nur die ersten beiden Zeichen des Nachnamens ausgewertet. Sind diese gleich, dann entscheidet das erste Zeichen vom Vornamen die über Reihenfolge. Auch diese Einstellung ist bei der Suche nach einem bestimmten Eintrag sinnvoll.
  Hinweis: Die 3 Geburtstage, die in der normalen Uhrenanzeige zu sehen sind, werden unabhängig von dieser Einstellung immer chronologisch sortiert - zeigen also die nächsten 3 fälligen Geburtstage an.
Geb-Namen Vor/Nach Die Anzeige der Geburtstage erfolgt in der Reihenfolge Vorname Nachname.
Nach/Vor Die Anzeige der Geburtstage erfolgt in der Reihenfolge Nachname Vorname.
Geb-Alter Aus Es erfolgt keine Anzeige des Alters bei den Geburtstags-Einträgen (außer in der ausführlichen Geburtstagsliste 2).
Ein Bei jedem Geburtstags-Eintrag wird zusätzlich das Alter angezeigt - bezogen auf den kommenden Geburtstag (sofern ein Geburtsjahr eingegeben wurde). Das führt dazu, dass weniger Platz für den Namen zur Verfügung steht und dieser gegebenenfalls gekürzt wird. Abhängig vom benötigten Platz für das Alter werden dann einfach Zeichen weggelassen.
Geb-Alarm aus Anstehende Geburtstage werden nicht signalisiert.
00:00 - 23:59 Bei einem anstehenden Geburtstag wird zur eingestellten Zeit ein Alarm ausgelöst. Dabei wird eine Minute lang eine Melodie abgespielt und die LED blinkt mit einer Frequenz von 2 Hz, bis der Alarm durch Druck auf einen der beiden Taster quittiert wird.

Über dieses Symbol kann eine von 10 Melodien für den Geburtstagsalarm festgelegt werden. Es steht hier die gleiche Auswahl wie bei den Alarmen 1-3 zur Verfügung

Über dieses Symbol kann die Lautstärke im Bereich von 0 - 10 eingestellt werden. Beim Wert 0 bleibt der Lautsprecher stumm und es erfolgt nur eine optische Signalisierung über die LED.

Über dieses Symbol kann die Soundausgabe getestet werden. Die gewählte Melodie wird einmal mit der gewählten Lautstärke-Einstellung abgespielt. Ein Druck auf OK beendet das Abspielen vorzeitig.

Einstellungen 3 Einstellungen 3

Dieses Untermenü ist das letzte der 3 Einstellungs-Menüs und hier ist nur eine Option zu finden. Diese wird im Folgenden beschrieben:

Sound Aus Bei dieser Einstellung ist die Sound-Ausgabe ausgeschaltet. Alarme werden nur noch optisch durch die LED signalisiert. Diese Option kann verwendet werden, wenn man vorübergehend nicht gestört werden möchte (Mute-Funktion).
Ein Bei dieser Einstellung ist die Sound-Ausgabe eingeschaltet, alle Alarme werden optisch und akustisch signalisiert.

Das Lautsprecher-Symbol im Bereich der Analoguhr (links unten) zeigt ständig den Sound-Status an:

Die Sound-Ausgabe ist ausgeschaltet (stumm). Alarme werden nur über die LED signalisiert. Diese Anzeige erfolgt auch, wenn die Uhr noch keine gültige Zeit hat.
Die Sound-Ausgabe ist eingeschaltet.

Kommunikation

Dieser Abschnitt beschäftigt sich mit dem USB-Anschluss der Tischuhr und den Kommunikationsmöglichkeiten mit einem PC. Zurzeit kann man den USB-Anschluss mehr oder weniger nur für das Updaten der Software über einen Bootloader benutzten. Dieser Vorgang wurde bereits im Abschnitt Inbetriebnahme ausführlich beschrieben. Es gibt aber Pläne für eine Software, die eine Konfiguration der Uhr und natürlich eine bequeme Verwaltung der Alarme und Geburtstage ermöglichen soll.

Trotzdem kann man an dieser Stelle schon mal den USB-Anschluss testen. Falls man die Uhren-Software erfolgreich über den Bootloader installiert hat, dann kann man davon ausgehen, dass alles perfekt funktioniert. Wenn jedoch keine Verbindung zum Bootloader aufgebaut werden konnte, dann kann man mit der folgenden Prozedur die USB-Kommunikation testen. In diesem Fall ist es erforderlich, die Uhren-Software auf dem "klassischem" Weg über den ISP-Anschluss in den Controller zu schreiben.

Zuerst muss mit einem üblichen USB-Kabel (A-Stecker auf B-Stecker) eine Verbindung zwischen dem PC und der Tischuhr hergestellt werden. Ich gehe mal davon aus, dass die Installation des Treibers (wie im Abschnitt Inbetriebnahme beschrieben, erfolgreich war. Nun sollte man im Windows-Gerätemanager ein neuen Anschluss USB Serial Port (COMx) vorfinden, wobei die Nummer des COM-Ports für die weiteren Tests wichtig ist.

Als nächstes wird ein Terminal-Programm (z.B. das HyperTerminal) gestartet. Das HyperTerminal fragt zunächst nach einem Namen für die Verbindung, der hier nicht wichtig ist und schlicht Uhr lauten kann.

Im nächsten Fenster Verbinden mit wird nun so wie im nebenstehenden Bild der COM-Port ausgewählt, der weiter oben im Geräte-Manager ermittelt wurde. Auf meinem PC ist das COM4.

Ein weiteres Fenster erscheint und dieses muss so wie im linken Bild ausgefüllt werden. Im Prinzip muss nur die Geschwindigkeit (Bits pro Sekunde) auf 921600 gesetzt und die Flusssteuerung auf Kein eingestellt werden, die anderen Felder sind meist schon richtig voreingestellt. Damit sind alle Vorbereitungen abgeschlossen und nach Bestätigung der Eingaben öffnet sich ein zunächst leeres Terminalfenster.

Wenn die Uhrensoftware irgendwann komplett fertig ist, wird sie eine Reihe von Kommandos kennen. Diese kann man dann im Terminalfenster eingeben und die Uhr wird eine entsprechende Antwort ausgeben. Zurzeit gibt es nur ein experimentelles Kommando, welches schlicht x lautet. Also geben wir einfach mal ein x ein und wenn alles funktioniert, dann flitzen jede Menge 3-stellige Zahlen über den Bildschirm. Während dieser kurzen Zeit erscheint auf dem Display der Uhr das USB-Symbol (im Bereich der Analoguhr unten rechts).

Was hat es mit diesem seltsamen Kommando auf sich? Ich habe dieses Kommando provisorisch implementiert, um die Screenshots für diese Dokumentation zu erzeugen. Die vielen Zahlen enthalten den Inhalt des Bildschirmspeichers der Uhr. Es werden zunächst 2048 Bytes (jeweils als Dezimalzahl) mit den Daten der Analoguhr und anschließend noch einmal 2048 Bytes mit den Daten des restlichen Display-Inhaltes übertragen. Diese Daten kann man beim Empfang in eine Text-Datei schreiben und mit einem kleinen Programm in eine BMP-Datei konvertieren, die dann wiederum in anderen Programmen weiter bearbeitet werden kann.

Falls dieser Test fehlgeschlagen ist, kann man noch prüfen, ob Daten von der Uhr zum PC gesendet werden. Vielleicht ist ja nur eine Übertragungsrichtung von dem Problem betroffen und unser Kommando x ist nicht an der Uhr angekommen. Für die Kontrolle der Richtung von der Uhr zum PC drückt man einfach bei bestehender Terminalverbindung auf den Reset-Taster der Uhr. Beim anschließenden Start der Uhr wird die Versionsnummer der Software über USB ausgegeben und die sollte dann auch im Terminalfenster zu lesen sein.

Sonstiges

The making of: Hier möchte ich einige Worte zur Entstehung der Uhr loswerden. Am Anfang hatte ich es schon erwähnt: Die Motivation für die Tischuhr war zum einen, dass ich immer wieder mal eine eBay-Auktion verpasst habe und zum anderen, dass ich noch zwei schöne grafische Displays hatte, die auf eine Aufgabe warten. Auch fehlte trotz vieler Uhren im Haus noch eine praktische Uhr für den Schreibtisch und so war die Idee für die Tischuhr geboren. Das technische Konzept war dann relativ schnell klar: die Hardware konnte ähnlich realisiert werden wie das einige Jahre zuvor entwickelte Anzeigemodul 2 und auch bei der Software muss nicht alles neu entwickelt werden.

Bei der Gehäuseform waren mehrere Varianten in der engeren Wahl. So war eine flache Form ähnlich wie ein PDA angedacht, was aber wegen der vielen Bauteile eher die Form eines Quaders angenommen hätte. Auch eine Konstruktion wie ein Laptop wurde verworfen. Schließlich wurde eine solide Gehäuseform geplant und die Platine zugeschnitten. Anschließend wurden die Halterungen für das Display hergestellt und alles provisorisch zusammengebaut, um die Bauteile ohne Kollisionen auf der Platine platzieren zu können. So entstand zunächst eine Basis mit Display und die Bedienelemente wurden einfach lose über ein Kabel angeschlossen. Beim Sound hatte ich zu dieser Zeit noch keinen Plan und so wurden diese Bauteile erst mal weggelassen.

Nun begann die Software-Entwicklung. Das ehrgeizige Ziel war: Die gesamte Software sollte in C geschrieben werden. Das war für mich absolutes Neuland, alle bisherigen Projekte waren ausschließlich in AVR-Assembler geschrieben worden. Allerdings bin ich beim Anzeigemodul 2 an die Grenzen gestoßen - hier ist der Code mit über 20000 Programmzeilen so umfangreich geworden, dass man ihn praktisch kaum noch überblicken kann. Also begann ich mit ersten Versuchen in C und war überrascht, wie schnell man hier ein kleines Programm schreiben kann. Auch die Einsicht in den erzeugten Assembler-Code zeigt, dass der Compiler sehr guten Code generiert, den man selbst kaum besser machen kann. Somit war das Vorurteil "C-Programme sind langsam" auch ausgeräumt. Natürlich wird nicht immer perfekter Code erzeugt, manchmal werden bei FOR-Schleifen 16-Bit-Werte verwendet, obwohl es mit 8-Bit-Werten schneller ginge, aber der Controller hat genug Reserven. Oft steckt der Teufel im Detail: So muss man sich erst an die spezielle Art der String-Verwaltung gewöhnen und einiges beim Zugriff auf den Flash- und EEPROM-Bereich des Controllers beachten. Aber es war die richtige Entscheidung, denn mit Assembler hätte die Programm-Entwicklung mit Sicherheit viele Monate länger gedauert.

Ich habe für die Programm-Entwicklung übrigens folgende Komponenten benutzt:

Das AVR-Studio erkennt die Installation von WinAVR und man kann somit im AVR-Studio sowohl Assembler- als auch C-Software schreiben. Der verwendete USB-Programmer (auf den mich ein Bastler-Kollege aufmerksam machte) kann ebenfalls direkt vom AVR-Studio aus verwendet werden und ist zudem noch sehr schnell im Vergleich zu den simplen Adaptern und der Software PonyProg. Letztendlich findet also die gesamte Programmierarbeit ausschließlich im AVR-Studio statt. Am Ende der Seite AVR-Programmierung sind weitere Informationen zum verwendeten Programmer zu finden.

Ein hartes Stück Arbeit bei der Programmentwicklung war die Analoguhr. Das Ziffernblatt war relativ schnell gemacht, dieses hat ein Delphi-Programm gezeichnet und mit einem Grafikprogramm habe ich dieses weiter bearbeitet und mit Zahlen versehen. Das Bild wurde dann ebenfalls mit einem kleinen Delphi-Programm in eine Reihe Zahlen gewandelt, die sich am Format des Display-Speichers orientieren und somit als Bitmap für das Ziffernblatt verwendet werden können. Sehr knifflig waren jedoch die Zeiger. Das Problem dabei ist, dass man einem AVR-Controller keine komplizierten Kreisberechnungen in Echtzeit zumuten kann. Man muss also mit Tabellen arbeiten und hier hatte ich wochenlang verschiedenes probiert. Die endgültige Lösung war dann eine große Sinus-Tabelle, die die Koordinaten eines Viertel-Kreises mit verschiedenen Radien im Raster von 0,5° enthält. Aus dieser Tabelle werden dann für jeden der 3 Zeiger entsprechend der Länge und des augenblicklichen Winkels die Endpunkt-Koordinaten des Zeigers ermittelt. Jetzt wird vom Mittelpunkt aus eine Linie zum ermittelten Endpunkt gezeichnet (Bresenham-Algorithmus) und fertig ist der Zeiger. Naja, nicht ganz - bei dem breiteren Minuten- und Stundenzeiger werden zusätzlich um jeden Bresenham-Punkt weitere Pixel nach einem bestimmten Muster gesetzt.

Im weiteren Verlauf habe ich überlegt, welche Informationen auf dem Hauptbild angezeigt werden sollen und entschied mich dann für 3 Alarme und 3 Geburtstage. Dazu sollte noch die Zeit in großen Ziffern und das Datum erscheinen. Aus den 7 Textzeilen und 2 Trennlinien ergab sich dann der verbleibende Platz für die Großziffern der Digitaluhr. Hier habe ich auch gleich 2 Pixel für den zukünftigen Auswahl-Rahmen eingeplant. Die Bedienung des Anzeigemoduls 2, welches ja als technisches Vorbild dient, ist aus heutiger Sicht nicht unbedingt optimal und so wollte ich bei der Tischuhr einen anderen Weg gehen. Ich bin mit dem Ergebnis sehr zufrieden, aber ich bin ja auch voreingenommen :-)

Nach und nach wurden dann die einzelnen Menüs erstellt. Vieles hat sich im Laufe der Entwicklung auch wieder verändert. So gab es ursprünglich nur ein Menü Einstellungen, was aber irgendwann nicht mehr ausreichte und auf 2 Seiten erweitert werden musste. Bei der Erstellung der Geburtstagslisten und sind mir dann noch weitere Ideen gekommen und so sind es am Ende 3 Seiten für die Einstellungen geworden.

Die Sound-Funktionen sind erst relativ spät hinzugekommen und das betrifft sowohl die Hard- als auch die Software. Zunächst war geplant, die Lautstärke über ein Widerstandsnetzwerk einstellbar zu machen. Das wurde aber wieder verworfen, weil es aufwändig war und immer wieder Störungen hörbar waren. Eher zufällig bin ich dann auf den TDA7052A aufmerksam geworden. Der eignet sich optimal für diese Uhr, weil er mit 5V zufrieden ist, eine ausreichende Ausgangsleistung besitzt, wenig Außenbeschaltung benötigt und vor allem deshalb, weil er einen Steuereingang für die Lautstärke mit einer passenden Kennlinie verfügt. Jetzt mussten noch zwei geeignete Controller-Ausgänge gewählt und Anpassungen durchgeführt werden. Es hat auch hier etwas gedauert, bis das Optimum gefunden wurde, denn es waren auch an der Software einige Änderungen erforderlich. Letztendlich klappte die Lautstärke-Steuerung hervorragend und ich überlegte, ob man nicht gleichzeitig auch die Hüllkurve des Tons damit beeinflussen könnte. Auch hier fanden wieder einige Experimente statt und ich realisierte es letztlich so, dass man mit 3 Bytes eine Tonhöhe (Frequenz), eine Tonlänge und eine Ausklingzeit definieren kann. Aus einer Folge von diesen Dreiergruppen programmierte ich dann insgesamt 10 Melodien - größtenteils mithilfe von Noten, die ich im Netz fand.

Irgendwann war die Software im Prinzip fertig und es wurde mit dem Feinschliff begonnen, der weitere Wochen in Anspruch genommen hat. Auch beim Schreiben dieser Dokumentation sind mir noch einige Punkte aufgefallen, die man verbessern kann. Bei dieser Gelegenheit kam mir auch noch die Idee, auf das aufwändige Fotografieren der einzelnen Bildschirmseiten zu verzichten und stattdessen einfach den Bildschirm-Inhalt des Displays auszulesen. So wurde also noch schnell eine einfache USB-Kommunikation implementiert. Diese ist in der Version 1.000 auch noch enthalten. Das Ziel ist aber eine saubere Kommunikation über Interrupt, die zu einem späteren Zeitpunkt realisiert wird. Nun liegt aber das vorläufige Endergebnis vor und ich bin schon auf die Kritiken gespannt :-)

Einige Wochen nach der Veröffentlichung: Die Hintergrundbeleuchtung meines Displays arbeitete mit einer CCFL. Diese ließ sich zwar prinzipiell in den Nachtstunden gedimmt betreiben, allerdings war immer ein leichtes Surren zu hören und ich hatte irgendwie kein gutes Gefühl dabei. Auch war das Licht nicht ganz gleichmäßig - eine Seite der Röhre leuchtete immer ein wenig heller als die andere. Also wurde beschlossen, eine LED-Beleuchtung zu bauen. Ich entschied mich für ultrahelle weiße 3mm-LEDs mit relativ weitem Abstrahlwinkel und einem separaten 220Ω SMD-Vorwiderstand für jede LED. Entsprechend der Breite des Displays und dem vorgegebenen Lochraster von 5,08mm ergab das genau 27 LEDs. Das Ergebnis hat mich wirklich positiv überrascht und der Stromverbrauch lag mit ca. 250mA auch im grünen Bereich. Allerdings war das Display jetzt viel zu hell, so dass ich zusätzlich noch 47Ω in Reihe geschaltet habe. Im Endergebnis ist das Display immer noch heller als die ursprüngliche CCFL-Variante, sehr gleichmäßig ausgeleuchtet und mit einem Strom von 42mA ein echter Energiesparer. Wenn ich mal etwas Zeit übrig habe, werde ich einige Bilder vom Umbau ergänzen.

Ausblick: Im vorherigen Abschnitt steht bereits, was noch zu tun ist. Es ist außerdem eine PC-Software geplant, mit der die Uhr komfortabel konfiguriert werden kann. Folgende Funktionen sind vorgesehen:

Übrigens, der Programmspeicher des ATmega128 ist noch nicht mal zur Hälfte gefüllt. Es gibt also noch ausreichend Reserven für Erweiterungen.


Allgemeines - Projekt-Überblick - Links, Software - Neuigkeiten - "Klassiker" - Galerie - Impressum
AVR-Programmierung - AVR-Bootloader - Multifunktionsuhr - Tischuhr - Wohnraumuhr - Wecker - Zahnputzuhr - BigBen-Türgong - Fahrtregler - EPROM-Programmiergerät - Temperaturmesssystem - USB-RS232 Interface - Kleine Projekte