Projekt: Tischuhr

Tischuhr-Bild 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. Zusätzlich lässt sich zur vollen Stunde ein Gong aktivieren. 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: 20.11.2013

Symbol Downloads
Schaltplan
Stückliste mit Empfehlungen zur Bauteilbestellung
Software für ATmega128 mit komplettem Quelltext in C vom 06.07.2013tischuhr-atmega128-v1100.zip
Platinen-Layout Version 1tischuhr-layout1.zip
Platinen-Layout Version 2tischuhr-layout2.zip
Platinen-Layout Version 3tischuhr-layout3.zip
Bootloader für ATmega128 USART1 (für Originalschaltung)Bootloader ATmega128 UART1 v2.9i
Bootloader für ATmega128 USART0 (für Crumb128, ist normalerweise vorinstalliert)Bootloader ATmega128 UART0 v2.9i
Homepage von Chip45 (aktuelle Bootloader-Versionen, bitte Hinweise im Abschnitt Inbetriebnahme beachten) https://www.chip45.com/categories/chip45boot2_avr_atmega_xmega_uart_bootloader_frei_kostenlos_hexfiles.php
Tischuhr-Manager, Kommunikations-Software für Windows XP und Windows 7 vom 18.11.2013Tischuhr-Manager v2.00
Symbol Inhaltsverzeichnis
BeschreibungAllgemeine Informationen über die Tischuhr
SchaltungBeschreibung der Schaltung und der Schaltungsoptionen
HardwareBilder und Hinweise zum Aufbau der Uhr
SoftwareKurze Beschreibung der Uhrensoftware
InbetriebnahmeInbetriebnahme der Uhr und Installation der Software
BedienungBedienungsanleitung und komplette Beschreibung aller Funktionen
KommunikationBeschreibung der PC-Kommunikation über den USB-Anschluss
SonstigesEinige Hintergrundinformationen zur Entwicklung der Uhr
Symbol 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 darzustellen:

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 13 Melodien bzw. Tonfolgen, 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.

Symbol Schaltung

Schaltung1

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 alle LCD-Spannungen kontrolliert. Das Display kann Schaden nehmen, wenn eine 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.

Schaltung2 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.
Weiterhin gibt es Displays, die mehrere negative Spannungen benötigen, z.B. feste -15V und zusätzlich noch ca. -13V für die Einstellung des Kontrastes. Es sollte auf jeden Fall vor dem Aufbau der Uhr das Datenblatt des Displays studiert werden, damit die Schaltung gegebenenfalls angepasst werden kann.

Noch einige Worte zum Display: Bei der Auswahl sollte man immer das Datenblatt zu Rate ziehen. Viele aktuelle Typen haben z.B. die unangenehme Eigenschaft, dass die Pixel nicht quadratisch sind. Das hat zur Folge, dass das normalerweise kreisförmige Zifferblatt in der Breite gestaucht und somit zum Ei wird. Grundsätzlich wäre es zwar möglich, durch Änderung der Software die Höhe ebenfalls zu stauchen, aber das ist wegen des hohen Aufwandes und der daraus resultierenden schlechteren Darstellung nicht vorgesehen.
Gelegentlich werden Displays mit einem SAP1024 Controller angeboten. Der SAP1024 ist mit dem T6963C kompatibel, somit können solche Displays für die Tischuhr verwendet werden. Einige Displays haben einen "MD"-Anschluss, dieser muss an die +5V des Displays angeschlossen werden (Knotenpunkt T2/C4/C5).

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.

Schaltung3 Nachtrag: Die aktuellen DCF77-Module von Pollin dürfen nur mit maximal 3,3V betrieben werden. In diesem Fall müssen noch die beiden zusätzlichen Bauteile R21 und D4 wie im nebenstehenden Bild eingefügt 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 USART1 (Universal Synchronous/Asynchronous Receiver Transmitter) des Controllers verbunden und ermöglicht die serielle 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.
Der Aufbau der USB-Schaltung auf einer Lochraster-Platine ist übrigens sehr knifflig. Wer sich das nicht zutraut, aber dennoch nicht auf den USB-Anschluss verzichten möchte, dem empfehle ich den Aufbau der Uhr mit einem Crumb128-Modul (v4.0 oder v5.0) von www.chip45.com. Hier erhält man ein fertiges Mikrocontroller-Board mit Quarz, ISP- und USB-Anschluss, so dass man die USB-Schaltung um IC7 weglassen kann. Zwar wird hier ein anderer USB-Chip verwendet und auch eine andere Schnittstelle am Controller, aber das ist kein Problem, da die Uhren-Software damit umgehen kann.

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. 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 Installieren und Updaten der Software. Der Anschluss K3 war bei der Entwicklung der Software sehr hilfreich, für den Betrieb der Uhr ist er jedoch nicht erforderlich und kann weggelassen werden. K4 ist der bereits beschriebene USB-Anschluss. Obwohl sich der Micro-USB-Anschluss als Standard durchzusetzen scheint, habe ich mich hier für eine Standard-USB-B-Buchse entschieden. Diese ist zum einen robuster und zum anderen lässt sich diese besser auf einer Lochrasterplatine montieren.

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

Symbol Hardware

Platine1 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 dem 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.

Platine2 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 oder das weiter oben empfohlene Crumb128-Modul.

Platine3 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,25 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.

Platine4 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.

Platine5 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.

Platine6 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 oder Anzeigemodul 2a des Temperaturmesssystems. Ich habe mich dann aber doch für die seitliche Montage entschieden, damit das Gehäuse kompakter wird. Die Uhr lässt sich trotzdem gut bedienen.

Platine7 Der Lautsprecher für die 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.

Platine8 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.

Platine9 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.

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

Platine11 Bevor das Uhrenmodul ins Gehäuse kommt, wird das rechte 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 an Front und Seitenteilen sichtbar.

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

Platine13 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 :-)

Platine14 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.

Wer die Möglichkeit hat, selbst Platinen anzufertigen, der kann die folgenden Layouts verwenden, die von den freundlichen Bastlerkollegen Lothar Jasper und DL5AKW bereitgestellt wurden:

Platinen-Layout Version 1tischuhr-layout1.zip
Platinen-Layout Version 2tischuhr-layout2.zip
Platinen-Layout Version 3tischuhr-layout3.zip
Symbol Software

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

tischuhr.centhält das eigentliche Programm
charset.henthält Zeichensätze für die Schrift und für die Großziffern sowie Symbole
strings.henthält eine Stringliste in deutscher und englischer Sprache
circle.henthält eine Koordinaten-Tabelle mit Kreisdaten für die Zeiger-Darstellung
clock.henthält eine Bitmap für das Ziffernblatt
sound.henthält eine Tonhöhen-Tabelle und die 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 anders ist die verwendete Programmiersprache, die Tischuhr ist das erste Projekt, welches ich komplett in C realisiert habe.

Das Programm 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 des Controllers vorbereitet und im nächsten Schritt als Datenblock in den Speicher des Displays 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 über 24 Stunden keine DCF-Zeit empfangen oder 2 Minuten lang 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änger 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 Sound-Ausgabe, diese wird, nachdem sie vom Hauptprogramm angestoßen wurde, komplett von der Interrupt-Routine abgearbeitet.

Ebenfalls im Hintergrund läuft ein Teil der USB-Kommunikation. So wird jedes empfangene Zeichen über eine Interrupt-Routine eingelesen und in einem Puffer abgelegt. Das Hauptprogramm prüft zyklisch den Inhalt des Puffers und beim Erkennen eines vollständigen Kommandos wird dieses in einen weiteren Puffer kopiert und bearbeitet. Die zu sendenden Daten werden ebenfalls in einen Puffer geschrieben und eine Interrupt-Routine kümmert sich um das Senden der Daten.

Symbol Inbetriebnahme

Für die Inbetriebnahme der Tischuhr wird die aktuelle Software v1.100 vom 06.07.2013 für den ATmega128 benötigt. In diesem Paket befindet sich der komplette kommentierte Quelltext in C und das fertig compilierte HEX-File, zu finden im Verzeichnis Tischuhr\Tischuhr\Release. 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.

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

Andere Programmiersoftware bietet oft nicht so einen übersichtlichen Dialog an. Hier werden stattdessen die Werte für die 3 Fusebit-Register erwartet und direkt geschrieben (z.B. bei AVRDUDE oder myAVR-ProgTool). In diesem Fall kann man die 3 benötigten Werte aus dem unteren Teil des Bildes entnehmen:

EXTENDED = 0xFF
HIGH = 0x91
LOW = 0xBF

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

Nach der Übertragung des HEX-Files und der Einstellung der Fuse-Bits sollte die Uhrensoftware starten. Wenn die Analog- und Digitaluhr im richtigen Takt losläuft, dann hat man höchstwahrscheinlich alles richtig gemacht.

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 der Bootloader nach einem Systemstart oder Reset immer zu erst aktiviert. Der Bootloader initialisiert dann die serielle Schnittstelle des Mikrocontrollers 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 die Übertragung 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. Die Firma Chip45 bietet ein kostenloses Paket mit fertigen Bootloadern für eine große Anzahl von AVR-Controllern an, 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 (im Falle der Tischuhr ungefähr eine Minute). Damit kann man aber leben, zumal so ein Software-Update nicht all zu häufig durchgeführt werden muss.

Die Installation des Bootloaders wird genauso wie die direkte Installation der Uhrensoftware über den ISP-Anschluss K2 durchgeführt. Nur wird hier nicht die Software der Tischuhr in den Mikrocontroller übertragen, sondern die Bootloader-Software. Die benötigte Software kann von der Chip45-Homepage geladen werden. Alternativ kann man den Bootloader auch über die folgende Tabelle laden:

Chip45 Bootloader ATmega128 UART1 v2.9i Diese Version ist erforderlich, wenn die Tischuhr in der Originalschaltung aufgebaut wurde und der USB-Anschluss K4 verwendet wird. Die Kommunikation mit dem Controller erfolgt hier über USART1.
Chip45 Bootloader ATmega128 UART0 v2.9i Diese Version ist erforderlich, wenn die Tischuhr mit einem Crumb128-Modul (v4.0 oder v5.0) aufgebaut wurde und dessen USB-Anschluss verwendet wird. Die Kommunikation mit dem Controller erfolgt hier über USART0. Man kann übrigens das Crumb128-Modul gleich mit installiertem Bootloader bestellen, so dass man sich diesen Schritt sparen kann.

Hinweis: Die in der oben stehenden Tabelle angebotenen Versionen sind nicht aktuell. Ich empfehle trotzdem, diese zu verwenden. Alle nachfolgenden Versionen bis zur v2.9m haben das Problem, dass die Uhr nach einem Stromausfall unter Umständen nicht startet. Ich habe die Entwickler auf dieses Problem hingewiesen, aber leider keine Antwort erhalten. Ansonsten gibt es auf der Chip45-Homepage immer das aktuelle Paket. Wichtig ist, dass der Bootloader für den ATmega128 verwendet wird.

Nach dem Transfer des Bootloader-HEX-Files müssen auch hier die Fuse-Bits noch angepasst werden.

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

Verlangt die Programmiersoftware direkt die Werte der 3 Fusebit-Register, dann kann man diese aus dem unteren Teil des Bildes entnehmen:

EXTENDED = 0xFF
HIGH = 0x94
LOW = 0xBF

Fuses4 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.

Hinweis: Wird ein Crumb128 v4.0 oder v5.0 und dessen USB-Anschluss verwendet, dann ist ein USB-Kabel mit Mini-B-Stecker erforderlich. Außerdem wird hier ein anderer USB-Chip (CP2102) verwendet, welcher einen anderen Treiber benötigt.

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.13 (oder neuer) zum Download zur Verfügung.

BootGUI1 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 COM7). 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 muss eine Verbindung zum Bootloader der Tischuhr hergestellt werden. Dazu wird auf den Button Connect to Bootloader geklickt und chip45boot2 GUI wartet ungefähr 15 Sekunden lang auf eine Meldung des Bootloaders. Durch einen Druck auf den Reset-Taster S3 wird der Bootloader der Tischuhr aktiviert und die Verbindung hergestellt. Den erfolgreichen Aufbau der Verbindung erkennt man am grünen Aufleuchten des Status-Feldes rechts unten. Es ist nicht schlimm, wenn der Verbindungsaufbau nicht beim ersten Versuch klappt. Man kann die Prozedur jederzeit wiederholen.

Falls sich hier kein Erfolg einstellt, dann empfehle ich, die Uhrensoftware über den ISP-Anschluss zu installieren und im Abschnitt Kommunikation weiterzulesen. Vermutlich gibt es ein Problem mit der USB-Kommunikation und in diesem Abschnitt wird beschrieben, wie man mit einem Terminalprogramm die Kommunikation testen kann.

BootGUI2 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 Balken zeigt den Fortschritt an, siehe Bild links. 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.

Display1 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 1offenDer verwendete Drehimpulsgeber arbeitet mit 2 Zustandsänderungen pro Drehschritt
geschlossenDer verwendete Drehimpulsgeber arbeitet mit 4 Zustandsänderungen pro Drehschritt
Jumper 2offenRechtsdrehung des Drehimpulsgebers bewegt die Menü-Markierung nach unten
geschlossenRechtsdrehung des Drehimpulsgebers bewegt die Menü-Markierung nach oben
Jumper 3offenRechtsdrehung des Drehimpulsgebers vergrößert einen Wert
geschlossenRechtsdrehung 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 Zustandsä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 (Umrahmung) 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 untergebracht 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 der Uhr 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.

Symbol 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:

OKTaster des Drehimpulsgebers S1
ZurückEinzeltaster S2

Display2 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.

Display3 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 des Impulsgebers 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.

Display4 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 des Impulsgebers 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ü.

Display5 Drückt man bei einer markierten Option auf OK, dann wird der gewählte Wert invertiert dargestellt und die Uhr befindet sich nun im Editor-Modus. Ein Drehen des Impulsgebers 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 Minuten 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 und dann wird einfach nach dem letzten Wert wieder von vorn begonnen und umgekehrt. So ist es oft möglich, den gewünschten Wert durch Drehen in die entgegengesetzte Richtung schneller zu erreichen. Eine weitere Besonderheit ist, dass ein schnelles Drehen von der Software erkannt wird und zu größeren Werte-Ä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 mit Digitaluhr, 3 Alarmen, 3 Geburtstagen 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:

Symbol[oben links]Die Uhr hat keine gültige Zeit. Keine Einstellung der Alarme und Geburtstage möglich und keine Alarm-Signalisierung!
Symbol[oben links]Kein DCF77-Empfang innerhalb der vergangenen 24 Stunden.
Symbol[oben links]Die Uhr wurde in den vergangenen 24 Stunden mit dem DCF77-Signal synchronisiert oder über USB gestellt.
Symbol[oben rechts]Die Uhr zeigt die Normalzeit (Winterzeit) an.
Symbol[oben rechts]Die Uhr zeigt die Sommerzeit an.
Symbol[unten links]Die Sound-Ausgabe ist ausgeschaltet (stumm). Alarme werden nur über die LED signalisiert.
Symbol[unten links]Die Sound-Ausgabe ist eingeschaltet.
Symbol[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 13 Melodien bzw. Tonfolgen 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:

SymbolDer Alarm ist deaktiviert. Das Datum, die Uhrzeit und der Wochentag des letzten Alarms werden angezeigt.
SymbolDer Alarm wird einmal ausgelöst. Das Datum, die Uhrzeit und der Wochentag des Alarms werden angezeigt.
SymbolDer Alarm wird wiederholt ausgelöst. Das Datum, die Uhrzeit und der Wochentag des nächsten Alarms werden 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.

Display2 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 passend abkürzen. Es ist übrigens auch möglich, nur den Vor- oder den Nachnamen einzugeben.

Für alle Geburtstage kann ein Alarm programmiert werden: hier kann man die Uhrzeit, eine von 13 Melodien bzw. Tonfolgen 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.

Symbol Menü Hauptmenü

Das Hauptmenü wird durch Drücken des Tasters OK aufgerufen. Dabei stehen 9 Elemente zur Auswahl, die in der folgenden Übersicht hellblau dargestellt werden. Drückt man nach Auswahl eines dieser Elemente nochmals auf OK, dann erreicht man das rechts daneben dargestellte Untermenü.

Hauptmenü
Pfeil
UhrzeitPfeilUhr einstellen (Zeit und Datum)
Pfeil
Alarm 1Pfeil Alarm einstellen (1) (Alarm-Modus, Zeit, Datum, Wochenprogramm, Melodie, Lautstärke)
Pfeil
Alarm 2Pfeil Alarm einstellen (2) (Alarm-Modus, Zeit, Datum, Wochenprogramm, Melodie, Lautstärke)
Pfeil
Alarm 3Pfeil Alarm einstellen (3) (Alarm-Modus, Zeit, Datum, Wochenprogramm, Melodie, Lautstärke)
Pfeil
GeburtstagePfeil Geburtstagsliste 1 (8 Einträge pro Seite) - Geburtstagsliste 2 (4 Einträge pro Seite) - Geburtstag eingeben (Datum, Vorname, Nachname)
Pfeil
InformationenPfeil Informationen (Software-Version, Zeit der letzten DCF77-Synchronisierung, Anzahl der Geburtstags-Einträge)
Pfeil
Einstellungen 1Pfeil Einstellungen 1 (Allgemeine Einstellungen)
Pfeil
Einstellungen 2Pfeil Einstellungen 2 (Einstellungen für DCF77-Empfänger und Geburtstags-Anzeige)
Pfeil
Einstellungen 3Pfeil Einstellungen 3 (Einstellungen für Stunden-Gong)

Im folgenden Abschnitt werden alle Untermenüs beschrieben.

Symbol Menü Uhrzeit Pfeil Uhr einstellen

Display3 Display6 Ü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 empfiehlt sich folgende Vorgehensweise: 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. Die Uhr übernimmt dann die eingestellte Zeit und wechselt zur normalen Anzeige. 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ü:

Zeit00:00 - 23:59Hier 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.
Tag1 - 31Über diese Funktion wird der Kalendertag eingestellt.
MonatJanuar - DezemberÜber diese Funktion wird der Monat im Klartext eingestellt.
Jahr13 - 99Hier 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 die Tischuhr 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.

Symbol Menü Alarm 1 Pfeil Alarm einstellen (1)
Symbol Menü Alarm 2 Pfeil Alarm einstellen (2)
Symbol Menü Alarm 3 Pfeil Alarm einstellen (3)

Display7 Display8 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)AusDer Alarm ist ausgeschaltet. Weitere Parameter werden zwar angezeigt, können aber nicht ausgewählt oder verändert werden.
EinmalDer 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äglichDer Alarm ist eingeschaltet und wird täglich ausgelöst. Bei diesem Alarmtyp ist nur die Uhrzeit relevant.
WöchentlichDer 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.
MonatlichDer 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.
Zeit00:00 - 23:59Hier wird die Uhrzeit für die Alarmauslösung eingestellt. Diese Zeit gilt bei wiederholenden Alarmen für alle nachfolgenden Alarme gleichermaßen.
Tag1 - 31Hier 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.
MonatJanuar - DezemberHier 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.
Jahraktuell - 2099Hier 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-SoHier werden die Tage für wöchentliche Alarmauslösungen ausgewählt.
SymbolÜber dieses Symbol kann eine von 13 Melodien bzw. Tonfolgen für den akustischen Alarm ausgewählt werden.

Die folgenden Melodien und Tonfolgen 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)
  11. Gong 1 - einfacher Gongschlag
  12. Gong 2 - Gongschlag mit 2 Tönen
  13. Gong 3 - Gongschlag mit 3 Tönen
SymbolÜ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.
SymbolÜber dieses Symbol kann die Sound-Ausgabe 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.

Symbol Menü Geburtstage Pfeil Geburtstagsliste 1 Pfeil Geburtstagsliste 2 Pfeil Geburtstag eingeben

Display9 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 dem in der normalen Uhrenanzeige.

Display10 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.

Display11 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.

Display12 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.

Display13 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:

Tag1 - 31Hier wird der Kalendertag des Geburtstages eingestellt.
LöschenWählt man diese Einstellung aus (liegt hinter 31 bzw. vor 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.
MonatJanuar - DezemberHier wird der Geburtsmonat im Klartext eingestellt.
Jahr0 - aktuellHier 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.
UnbekanntDiese Einstellung (liegt hinter dem aktuellen Jahr bzw. vor 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.

Display14 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.

Display15 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.

Display16 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 der eingegebene Name wird verworfen.

Display17 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 aktuelle Position geschrieben 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.

Display18 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.

Display19 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.

Display20 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.

Display21 Irgendwann ist der Name komplett und wenn man mit dem Ergebnis zufrieden ist, wird der Impulsgeber auf das im nebenstehenden Bild sichtbare OK-Zeichen 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.

Display22 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:

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

Die folgende Übersicht fasst noch einmal die Besonderheiten zusammen:

Symbol Menü Informationen Pfeil Informationen

Display23 Zu diesem Untermenü gibt es nicht viel zu sagen. Im oberen Bereich wird die vollständige Software-Version angezeigt. 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ü.

Symbol Menü Einstellungen 1 Pfeil Einstellungen 1

Display24 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:

SpracheDeutschAlle Texte werden in deutscher Sprache ausgegeben.
EnglischAlle Texte werden in englischer Sprache ausgegeben.
 Hinweis: Die Namen der Melodien bei der Alarm-Einstellung werden immer in der Originalsprache ausgegeben.
Analog-UhrLinksDie Analoguhr wird auf der linken Display-Seite angezeigt.
RechtsDie Analoguhr wird auf der rechten Display-Seite angezeigt.
DisplayNormalDie Pixel werden normal in den Display-Speicher geschrieben.
InversDie 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-SyncAusDas Display bleibt ständig eingeschaltet.
EinDas 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.
Weiterhin wird 2 Minuten nach Einschalten oder Reset der Uhr das Display für maximal 30 Minuten zur DCF77-Synchronisierung ausgeschaltet. Durch Drücken einer der Taster kann dieser Vorgang jedoch jederzeit abgebrochen werden.
Nacht-ModusAusDie Hintergrundbeleuchtung des Displays bleibt ständig mit voller Helligkeit eingeschaltet. Die 3 folgenden Optionen auf dieser Seite haben keine Wirkung.
EinDas 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 auch ein beliebiger Zeitraum am Tag einstellbar.
Nacht-Helligkeit0 - 255Hier 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 von00:00 - 23:59Diese Einstellung bestimmt den Zeitpunkt zur Abschaltung bzw. Dimmung der Hintergrundbeleuchtung.
Nacht bis00:00 - 23:59Diese Einstellung bestimmt den Zeitpunkt zur Rückschaltung auf die volle Helligkeit.

Symbol Menü Einstellungen 2 Pfeil Einstellungen 2

Display25 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 in diesem Menü:

DCF-SignalNormalDiese Einstellung muss gewählt werden, wenn der DCF77-Empfänger Low-Impulse ausgibt.
InversDiese Einstellung muss gewählt werden, wenn der DCF77-Empfänger High-Impulse ausgibt.
DCF-Pull-upAusDiese Einstellung muss gewählt werden, wenn der DCF77-Empfänger einen Ausgang hat, der sowohl Low- als auch High-Pegel ausgeben kann.
EinDiese 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 091610 - 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 im Menü Uhrzeit Pfeil Uhr einstellen die Option 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)
DatumDie 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.
VornameDie 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.
NachnameDie 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-NamenVor/NachDie Anzeige der Geburtstage erfolgt in der Reihenfolge Vorname Nachname.
Nach/VorDie Anzeige der Geburtstage erfolgt in der Reihenfolge Nachname Vorname.
Geb-AlterAusEs erfolgt keine Anzeige des Alters bei den Geburtstags-Einträgen (außer in der ausführlichen Geburtstagsliste 2).
EinBei 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-Alarm00:00 - 23:59Bei einem anstehenden Geburtstag wird zur eingestellten Zeit ein Alarm ausgelöst. Dabei wird eine Minute lang eine Melodie bzw. Tonfolge abgespielt und die LED blinkt mit einer Frequenz von 2 Hz. Durch Druck auf einen der beiden Taster kann die akustische Signalisierung vorzeitig beenden werden.
AusAnstehende Geburtstage werden nicht signalisiert. Diese Einstellung befindet sich zwischen 23:59 und 00:00
SymbolÜber dieses Symbol kann eine von 13 Melodien bzw. Tonfolgen für den Geburtstagsalarm festgelegt werden. Es steht hier die gleiche Auswahl wie bei den Alarmen 1-3 zur Verfügung
SymbolÜ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.
SymbolÜber dieses Symbol kann die Sound-Ausgabe getestet werden. Die gewählte Melodie bzw. Tonfolge wird einmal mit der gewählten Lautstärke-Einstellung abgespielt. Ein Druck auf OK beendet das Abspielen vorzeitig.

Symbol Menü Einstellungen 3 Pfeil Einstellungen 3

Display26 Dieses Untermenü ist das letzte der 3 Einstellungs-Menüs und hier sind Optionen für die Sound-Ausgabe und den Stunden-Gong zu finden. Diese werden im Folgenden beschrieben:

SoundAusBei dieser Einstellung ist die Sound-Ausgabe komplett 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).
EinBei dieser Einstellung ist die Sound-Ausgabe eingeschaltet, alle Alarme werden optisch und akustisch signalisiert.
GongAusDer Stunden-Gong ist ausgeschaltet. Die folgenden 4 Optionen auf dieser Seite haben keine Wirkung.
EinDer Stunden-Gong ist eingeschaltet und ertönt einmal zu jeder vollen Stunde innerhalb des über die folgenden Optionen eingestellten Zeitraumes.
Hinweis: Steht einer der 3 Alarme oder ein Geburtstagsalarm zeitgleich mit dem Stunden-Gong an, dann wird der Gong unterdrückt.
Gong von00:00 - 23:00Beginn des Zeitraumes für den Stunden-Gong. Es ist nur der Stundenwert einstellbar, der Minutenwert ist auf 00 festgelegt.
Gong bis00:00 - 23:00Ende des Zeitraumes für den Stunden-Gong. Es ist nur der Stundenwert einstellbar, der Minutenwert ist auf 00 festgelegt.
SymbolÜber dieses Symbol kann eine von 13 Melodien bzw. Tonfolgen für den Stunden-Gong festgelegt werden. Empfohlen wird hier Gong 1, Gong 2 oder Gong 3.
SymbolÜber dieses Symbol kann die Lautstärke im Bereich von 0 - 10 eingestellt werden. Beim Wert 0 bleibt der Lautsprecher stumm.
SymbolÜber dieses Symbol kann die Sound-Ausgabe getestet werden. Die gewählte Melodie bzw. Tonfolge wird einmal mit der gewählten Lautstärke-Einstellung abgespielt. Ein Druck auf OK beendet das Abspielen vorzeitig.
Symbol Kommunikation

Dieser Abschnitt beschäftigt sich mit dem USB-Anschluss der Tischuhr und den Kommunikationsmöglichkeiten mit einem PC. Eine dieser Möglichkeiten ist das Installieren der Uhren-Software über einen Bootloader, welche bereits im Abschnitt Inbetriebnahme ausführlich beschrieben wurde. Weiterhin wurde ein umfangreiches Kommando-Interface eingebaut, mit dem die Uhr komplett fernbedient werden kann. Damit können alle Einstellungen aus der Uhr ausgelesen und auch wieder zur Uhr gesendet werden.

Zunächst ist es erforderlich, die Uhr über den USB-Anschluss mit dem PC zu verbinden. Dazu wird ein übliches USB-Kabel mit A-Stecker auf der PC-Seite und auf B-Stecker auf der Uhrenseite benötigt. Falls die Uhr mit dem USB-Anschluss eines Crumb128-Moduls verbunden wird, dann ist hier ein Mini-USB-B-Stecker erforderlich. Bei der ersten Verbindung ist die Installation eines Treibers erforderlich (siehe auch den Abschnitt Inbetriebnahme). Nach erfolgreicher Treiber-Installation sollte man im Windows-Gerätemanager einen neuen Anschluss USB Serial Port (COMx) vorfinden, wobei die Nummer des COM-Ports für die weitere Arbeit wichtig ist.

Anschließend kann z.B. der Tischuhr-Manager v2.00 von Andreas Hickmann und Daniel Mollnau installiert und gestartet werden. Diese Software wird über das Setup-Programm im Download-Paket installiert und läuft unter Windows XP und Windows 7. Das Programm ist weitgehend selbsterklärend und bietet folgende Funktionen:

Vielen Dank an die beiden Software-Entwickler. Für diejenigen, die alles genau wissen wollen, habe ich im folgenden Abschnitt alle Details der Tischuhr-Kommunikation beschrieben.

Terminal1 Zum Testen der Kommunikation wird ein Terminal-Programm benötigt, ich verwende hier das kostenlose Tera Term Pro. Das nebenstehende Bild zeigt die Einstellungen der seriellen Schnittstelle. Bei der Einstellung Port: muss der COM-Port eingetragen werden, über den die USB-Verbindung zur Tischuhr hergestellt wurde. Dieser kann (wie bereits erwähnt) über den Windows-Gerätemanager ermittelt werden. In meinem System ist das COM7. Alle anderen Einstellungen können unverändert übernommen werden.

Terminal2 Auf diesem Bild sind weitere Einstellungen für das Terminal zu sehen. Wichtig ist an dieser Stelle nur die Einstellung Lokales Echo. Diese bewirkt, dass die Eingaben am PC im Terminalfenster mitgeschrieben werden. Ohne diese Einstellung müsste man alle Kommandos blind eintippen.

Terminal3 Nun ist alles vorbereitet und im Terminalfenster kann das erste Kommando gesendet werden. Dafür eignet sich am besten die Versionsabfrage v? und ein abschließendes Enter. Wenn alles richtig funktioniert, dann erscheint die Versionsnummer der Tischuhr so wie im nebenstehenden Bild.

Symbol Bei jedem Kommando, welches von der Tischuhr bearbeitet wird, erscheint das nebenstehende Symbol im Bereich der Analoguhr (unten rechts). Ungefähr 5 Sekunden nach der Ausführung des letzen Kommandos verschwindet das Symbol wieder.

Die Tischuhr arbeitet bei der USB-Kommunikation immer als Slave, die Kommunikation muss also immer von einem Master (PC) über ein Kommando gestartet werden und die Uhr gibt dann eine entsprechende Antwort zurück. Jedes Kommando beginnt mit einem Buchstaben, welcher den Kommando-Typ festlegt. Das zweite Zeichen hängt davon ab, ob man Daten aus der Uhr auslesen oder Daten in die Uhr schreiben möchte. Im ersten Fall wird ein Fragezeichen verwendet und das Kommando durch ein Carriage Return (Enter, ASCII 13) abgeschlossen. Beim Schreiben von Daten muss als zweites Zeichen ein Doppelpunkt verwendet werden, daran schließen sich die zu schreibenden Daten an und auch hier wird das Kommando durch ein Carriage Return abgeschlossen.

Wenn die Tischuhr einen gültigen Kommando-Typ und sowie ein Fragezeichen oder einen Doppelpunkt als zweites Zeichen empfängt, dann wird das Kommando von der Uhr bearbeitet und eine Antwort gesendet. Im Falle eines Lese-Kommandos enthält die Antwort die gewünschten Daten. Bei einem Schreib-Kommando besteht die Anwort immer aus 2 Zeichen: dem Kommando-Typ und einer anschließenden 0 oder 1, welche folgende Bedeutung hat:

0   Das Kommando wurde erfolgreich bearbeitet.
1   Das Kommando wurde nicht bearbeitet, die empfangenen Daten sind nicht plausibel und wurden verworfen.

Jede Kommando-Antwort der Uhr wird außerdem am Zeilenende mit Carriage Return (ASCII 13) und Line Feed (ASCII 10) abgeschlossen. Wird kein gültiges Kommando erkannt, dann erfolgt keine Antwort und alle empfangenen Zeichen werden verworfen.

Hinweis: Es kann immer nur ein Kommando bearbeitet werden. Empfängt die Tischuhr während der Bearbeitung eines Kommandos ein weiteres, dann wird dieses ignoriert. Ein Kommando kann sowohl über die Schnittstelle USART1 als auch über USART0 empfangen werden (je nach Hardware der Tischuhr). Die Kommando-Antwort wird immer an die Schnittstelle gesendet, von der auch das Kommando empfangen wurde. Die folgende Übersicht beschreibt alle Kommandos der Tischuhr:

Symbol Lesen der Versionsinformation

Kommandov?
Antwortv:vx.xxx, dd.MM.aaaa
Beispielv:v1.100, 06.07.2013
Parameter
x.xxx
Versionsnummer
ddTag (01-31)
MMMonat (01-12)
aaaaJahr (2013-2099)
Über dieses Kommando kann die Versionsnummer und das Erstellungsdatum der Tischuhr-Software abgefragt werden.

Symbol Lesen der Uhrzeit

Kommandot?
Antwortt:hh:mm:ss,aaaa-MM-dd,z
Beispielt:22:05:07,2013-07-14,1
Parameter
hhStunde (00-23)
mmMinute (00-59)
ssSekunde (00-59)
aaaa
Jahr (2013-2099)
MMMonat (01-12)
ddTag (01-31)
zZeitzone, 0-Winterzeit, 1-Sommerzeit
Über dieses Kommando kann die aktuelle Uhrzeit und das Datum aus der Tischuhr ausgelesen werden.

Symbol Schreiben der Uhrzeit

Kommandot:hh:mm:ss,aaaa-MM-dd,z
Beispielt:22:05:07,2013-07-14,1
Antwortt0   Ok
t1   Syntax-Fehler, Daten nicht plausibel
Parameter
hhStunde (00-23)
mmMinute (00-59)
ssSekunde (00-59)
aaaa
Jahr (2013-2099)
MMMonat (01-12)
ddTag (01-31)
zZeitzone, 0-Winterzeit, 1-Sommerzeit
Über dieses Kommando kann die Uhrzeit und das Datum der Tischuhr neu gesetzt werden. Die Uhr verhält sich dabei so, als würde sie die Zeit über das DCF77-Signal empfangen, setzt also die Symbole für DCF77-Empfang und Winter- bzw. Sommerzeit. Die Zeit wird jedoch nicht als letzte Synchronisierung im Menü Informationen registriert.

Symbol Lesen eines Alarms

Kommando1?
Antwort1:t,hh:mm,aaaa-MM-dd,w,p,ss,vv
Beispiel1:1,16:40,2013-07-20,6,5,01,05
Parameter
tAlarm-Typ, 0-aus, 1-Einmal, 2-Täglich, 3-Wöchentlich, 4-Monatlich
hhStunde (00-23)
mmMinute (00-59)
aaaa
Jahr (2013-2099)
MMMonat (01-12)
ddTag (01-31)
wWochentag, 1-Mo, 2-Di, 3-Mi, 4-Do, 5-Fr, 6-Sa, 7-So
pWochentags-Programm, 0-Mo, 1-Di, 2-Mi, 3-Do, 4-Fr, 5-Sa, 6-So, 7-Mo-Fr, 8-Mo-Sa, 9-Sa-So
ssSound-Nummer (00-12)
vvLautstärke (00-10)
Dieses Kommando liest die Einstellungen von Alarm 1 aus der Tischuhr. Zum Lesen der Einstellungen von Alarm 2 und Alarm 3 werden die Kommandos 2? und 3? verwendet. Die Antworten auf diese Kommandos beginnen dann folglich mit 2: und 3:, alle Parameter sind identisch zum Kommando 1?.

Hinweis: Grundsätzlich werden alle Alarm-Daten aus dem Speicher der Tischuhr gelesen. Abhängig vom Alarm-Typ sind deshalb einige Datenfelder nicht relevant. Bei Serien-Alarmen (täglich, wöchentlich, monatlich) werden immer die Daten des nächsten Alarms ausgegeben.

Symbol Schreiben eines Alarms

Kommando1:t,hh:mm,aaaa-MM-dd,w,p,ss,vv
Beispiel1:1,16:40,2013-07-20,6,5,01,05
Antwort10   Ok
11   Syntax-Fehler, Daten nicht plausibel
Parameter
tAlarm-Typ, 0-aus, 1-Einmal, 2-Täglich, 3-Wöchentlich, 4-Monatlich
hhStunde (00-23)
mmMinute (00-59)
aaaa
Jahr (2013-2099)
MMMonat (01-12)
ddTag (01-31)
wWochentag, 1-Mo, 2-Di, 3-Mi, 4-Do, 5-Fr, 6-Sa, 7-So
pWochentags-Programm, 0-Mo, 1-Di, 2-Mi, 3-Do, 4-Fr, 5-Sa, 6-So, 7-Mo-Fr, 8-Mo-Sa, 9-Sa-So
ssSound-Nummer (00-12)
vvLautstärke (00-10)
Dieses Kommando schreibt neue Einstellungen für Alarm 1 in die Tischuhr. Zum Schreiben neuer Einstellungen für Alarm 2 und Alarm 3 werden die Kommandos 2: und 3: verwendet. Die Antworten auf diese Kommandos lauten dann folglich 20 oder 30 bei fehlerfreier Ausführung, anderenfalls 21 oder 31. Auch hier sind alle Parameter identisch zum Kommando 1:.

Hinweis: Grundsätzlich müssen alle Alarm-Daten in der nebenstehenden Form zur Tischuhr gesendet werden. Abhängig vom Alarm-Typ ist es dann erforderlich, nicht relevante Datenfelder mit Dummy-Daten zu füllen. Einige Datenfelder, wie z.B. der Wochentag werden von der Tischuhr automatisch ersetzt.

Symbol Lesen der Geburtstage

Kommandob?
Antwortb:aaaa-MM-dd,Vorname,Nachname
b:Geburtstagsliste ist leer
Beispielb:1949-01-08,Anna,Richter
Parameter
aaaaJahr (0000-aktuelles Jahr)
MMMonat (01-12)
ddTag (01-31)
VornameVorname (0-15 Zeichen)
Nachname
Nachname (0-15 Zeichen)
Bei diesem Kommando gibt es die Besonderheit, dass die Antwort aus mehreren Zeilen bestehen kann. Es werden grundsätzlich alle Geburtstage gelesen und in Form einer Liste ausgegeben, wobei jede Zeile das nebenstehende Format hat. Bei Geburtstagen ohne Jahreszahl wird anstelle des Jahres ???? ausgegeben. Ist nur der Vor- oder Nachname eines Geburtstages gespeichert, dann wird der fehlende Namensteil einfach weggelassen. Die Trennzeichen (Kommata) werden aber trotzdem ausgegeben.

Ist die Geburtsliste leer, dann sendet die Tischuhr einen leeren Eintrag als Antwort: b:

Symbol Schreiben eines Geburtstages

Kommandob:aaaa-MM-dd,Vorname,Nachname
Beispielb:1949-01-08,Anna,Richter
Antwortb0   Ok
b1   Syntax-Fehler, Daten nicht plausibel, Speicher voll
Parameter
aaaaJahr (0000-aktuelles Jahr)
MMMonat (01-12)
ddTag (01-31)
VornameVorname (0-15 Zeichen)
Nachname
Nachname (0-15 Zeichen)
Mit diesem Kommando kann ein einzelner Geburtstag in die Uhr geschrieben werden. Existiert der Name bereits im Geburtstagsspeicher, dann wird dieser Eintrag mit den neuen Daten überschrieben, anderenfalls wird ein freier Platz gesucht und der neue Geburtstag ergänzt. Falls das Jahr nicht bekannt ist oder nicht erfasst werden soll, dann kann anstelle des Jahres ???? angegeben werden. Soll nur der Vor- oder Nachname eingegeben werden, dann wird der fehlende Namensteil einfach weggelassen. Die Trennzeichen (Kommata) sind aber trotzdem erforderlich. 3 Beispiele sollen die richtige Syntax verdeutlichen:
b:????-01-08,Anna,RichterEingabe ohne Jahr
b:1949-01-08,,Richternur den Nachnamen speichern
b:1949-01-08,Anna,nur den Vornamen speichern

Symbol Löschen eines Geburtstages

Kommandob:aaaa-MM-00,Vorname,Nachname
Beispielb:1949-01-00,Anna,Richter
Antwortb0   Ok
b1   Syntax-Fehler, Daten nicht plausibel, Eintrag nicht gefunden
Parameter
aaaaJahr (0000-aktuelles Jahr)
MMMonat (01-12)
00Tag (00)
VornameVorname (0-15 Zeichen)
Nachname
Nachname (0-15 Zeichen)
Mit diesem Kommando kann ein einzelner Geburtstag aus dem Speicher der Tischuhr gelöscht werden. Die Syntax ist identisch mit dem Kommando Schreiben eines Geburtstages, der einzige Unterschied ist der Tag, der hier auf 00 gesetzt wird. Für das Jahr und den Monat können hier Dummy-Daten verwendet werden, wichtig ist jedoch der vollständige Name, damit der Eintrag im Speicher der Tischuhr gefunden werden kann.

Symbol Lesen der Konfiguration

Kommandoc?
Antwortc:aaa,bb,cc,dd,ee,fff,gg,hh,ii,jj,kk,ll,mm,nn,oo
Beispielc:087,00,22,00,08,010,08,22,11,04,41,00,16,09,05
Parameter
aaa
Konfigurations-Byte 1 (000-255), binär codiert:
- Bit 7:     Sprache, 0-Deutsch, 1-Englisch
- Bit 6:     Display-Invertierung, 0-aus, 1-ein
- Bit 5:     Position der Analog-Uhr, 0-links, 1-rechts
- Bit 4:     DCF77-Invertierung, 0-Low-Impulse vom Empfänger, 1-High-Impulse vom Empfänger
- Bit 3:     DCF77-Pull-Up, 0-aus, 1-ein
- Bit 2:     Nacht-Synchronisierung, 0-aus, 1-ein
- Bit 1:     Nacht-Modus, 0-aus, 1-ein
- Bit 0:     Sound-Ausgabe, 0-aus, 1-ein
bbNacht-Beginn, Minute (00-59)
ccNacht-Beginn, Stunde (00-23)
ddNacht-Ende, Minute (00-59)
eeNacht-Ende, Stunde (00-23)
fffNacht-Helligkeit (000-255)
ggGong-Beginn, Stunde (00-23)
hhGong-Ende, Stunde (00-23)
iiGong, Sound-Nummer (00-12)
jjGong, Lautstärke (00-10)
kk
Konfigurations-Byte 2 (00-63), binär codiert:
- Bit 5:     Gong, 0-aus, 1-ein
- Bit 4:     Geburtstags-Namen, 0-Vorname/Nachname, 1-Nachname/Vorname
- Bit 3:     Geburtstags-Alter, 0-aus, 1-ein
- Bit 2+1: Geburtstags-Sortierung, 00-Datum, 01-Vorname, 10-Nachname
- Bit 0:     Geburtstags-Alarm, 0-aus, 1-ein
llGeburtstags-Alarm, Minute (00-59)
mmGeburtstags-Alarm, Stunde (00-23)
nnGeburtstags-Alarm, Sound-Nummer (00-12)
ooGeburtstags-Alarm, Lautstärke (00-10)
Mit diesem Kommando wird die gesamte Konfiguration der Tischuhr gelesen, also alle Daten, die über die Menüs Einstellungen 1, Einstellungen 2 und Einstellungen 3 festgelegt wurden.

Symbol Schreiben der Konfiguration

Kommandoc:aaa,bb,cc,dd,ee,fff,gg,hh,ii,jj,kk,ll,mm,nn,oo
Beispielc:087,00,22,00,08,010,08,22,11,04,41,00,16,09,05
Antwortc0   Ok
c1   Syntax-Fehler, Daten nicht plausibel
Parameter
aaa
Konfigurations-Byte 1 (000-255), binär codiert:
- Bit 7:     Sprache, 0-Deutsch, 1-Englisch
- Bit 6:     Display-Invertierung, 0-aus, 1-ein
- Bit 5:     Position der Analog-Uhr, 0-links, 1-rechts
- Bit 4:     DCF77-Invertierung, 0-Low-Impulse vom Empfänger, 1-High-Impulse vom Empfänger
- Bit 3:     DCF77-Pull-Up, 0-aus, 1-ein
- Bit 2:     Nacht-Synchronisierung, 0-aus, 1-ein
- Bit 1:     Nacht-Modus, 0-aus, 1-ein
- Bit 0:     Sound-Ausgabe, 0-aus, 1-ein
bbNacht-Beginn, Minute (00-59)
ccNacht-Beginn, Stunde (00-23)
ddNacht-Ende, Minute (00-59)
eeNacht-Ende, Stunde (00-23)
fffNacht-Helligkeit (000-255)
ggGong-Beginn, Stunde (00-23)
hhGong-Ende, Stunde (00-23)
iiGong, Sound-Nummer (00-12)
jjGong, Lautstärke (00-10)
kk
Konfigurations-Byte 2 (00-63), binär codiert:
- Bit 5:     Gong, 0-aus, 1-ein
- Bit 4:     Geburtstags-Namen, 0-Vorname/Nachname, 1-Nachname/Vorname
- Bit 3:     Geburtstags-Alter, 0-aus, 1-ein
- Bit 2+1: Geburtstags-Sortierung, 00-Datum, 01-Vorname, 10-Nachname
- Bit 0:     Geburtstags-Alarm, 0-aus, 1-ein
llGeburtstags-Alarm, Minute (00-59)
mmGeburtstags-Alarm, Stunde (00-23)
nnGeburtstags-Alarm, Sound-Nummer (00-12)
ooGeburtstags-Alarm, Lautstärke (00-10)
Mit diesem Kommando wird eine komplette Konfiguration an die Tischuhr gesendet, also alle Daten, die über die Menüs Einstellungen 1, Einstellungen 2 und Einstellungen 3 festgelegt werden.

Symbol Lesen eines Bildschirmfotos

Kommandos?
Antworts:x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x
Beispiels:88,10,0,0,30,12,16,1,0,16,96,240,0,2,32,76
Parameter
x
binär codierter Wert von 8 nebeneinander liegenden Pixeln,
16 Werte pro Zeile, 256 Zeilen
Über dieses Kommando kann ein Foto (Screenshot) des Tischuhr-Bildschirms gelesen werden. Da die Uhr nicht genug Speicherplatz für den gesamten Bildschirminhalt bietet, erfolgt die Datenübertragung in 2 Teilen: Zunächst werden 128 Zeilen mit jeweils 16 Bytes mit dem Bild der Analog-Uhr, anschließend 128 Zeilen mit jeweils 16 Bytes mit dem Bild des Info-Bereiches übermittelt.
Symbol Sonstiges

The making of (Januar 2010): 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 warteten. 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 oder Smartphone 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 der v1.000 ü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.

Ein hartes Stück Arbeit bei der Programmentwicklung war die Analoguhr. Das Ziffernblatt war relativ schnell gemacht, es wurde von einem 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 zu hören 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 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. 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.

Fortsetzung im Juli 2013: Schon länger wurde für die Tischuhr ein Stunden-Gong gewünscht, außerdem sollte endlich der USB-Anschluss eine sinnvolle Verwendung finden. Also wurde die Arbeit an der Software fortgesetzt. Da das für die bisherige Software verwendete AVR-Studio 4 veraltet ist, wurde für die weitere Arbeit das Atmel Studio 6.1 verwendet. Hier gab es schon erste Probleme, weil der im Atmel Studio 6.1 enthaltene C-Compiler die EEPOM-Daten anders verwaltet. Die Folge war, dass die Tischuhr zwar mit der im neuen Studio 6.1 erzeugten Software funktionierte, aber weder die Einstellungen, noch die Geburtstagsdaten gefunden wurden. So musste die Uhren-Software erst mal so geändert werden, dass die EEPROM-Daten nicht mehr vom Compiler, sondern vom Programmierer verwaltet werden. Damit war die erste Hürde genommen.

Für die Programm-Entwicklung der v1.100 wurden übrigens folgende Komponenten benutzt:

Im weiteren Verlauf wurden zunächst 3 kleinere Fehler beseitigt. Anschließend kam der Stunden-Gong an die Reihe. Für diesen Zweck waren die 10 Melodien nicht so gut geeignet, deshalb wurden diese um 3 einfache Tonfolgen erweitert. Man muss diese aber nicht zwingend benutzen und kann auch eine der Melodien für den Gong verwenden, ebenso wie man die 3 neuen Tonfolgen auch für Alarme oder den Geburtstag verwenden kann. Für die Einstellung der Gong-Parameter hat sich das Menü Einstellungen 3 angeboten, da hier noch ausreichend Platz vorhanden war.

Relativ aufwändig war die Realisierung der USB-Kommunikation. Zunächst wurden für das Senden und Empfangen der Daten jeweils Puffer und Zeiger angelegt und entsprechende Interrupt-Routinen geschrieben. Damit läuft die gesamte Kommunikation praktisch im Hintergrund ab. Weiterhin musste ich berücksichtigen, dass sowohl über USART0 als auch über USART1 kommuniziert werden muss. Normalerweise läuft die Kommunikation über die Schnittstelle USART1 des ATmega128, welche über einen FT232RL (IC7) mit dem USB-Anschluss verbunden ist. Einige Tischuhren wurden jedoch (auf meine Empfehlung hin) mit einem Crumb128-Modul aufgebaut und dessen USB-Anschluss kommuniziert mit USART0. Ich habe die Software also so geschrieben, dass die Tischuhr mit beiden USARTs arbeiten kann. Wird ein Kommando von einem USART empfangen, dann wird dieses bearbeitet und die Antwort auf dem gleichen USART gesendet, auf dem auch empfangen wurde. Für die Kommunikation habe ich mir eine Kommandosprache ausgedacht, die es ermöglicht, alle Daten der Uhr auszulesen und auch wieder zur Uhr zu senden. Somit lässt sich die Uhr komplett von einem PC aus konfigurieren und verwalten.