Meine selbstgebauten Uhren

Normale Uhren (oder genauer gesagt: Wecker) sind eigentlich ja doch ziemlich primitiv. Unzählige Menschen auf der ganzen Welt finden es völlig selbstverständlich, sich jeden Abend den Wecker zu stellen, wenn sie am nächsten Morgen geweckt werden wollen. Mir kam das aber schon immer viel zu umständlich vor. Im Laufe der Zeit entstanden deshalb mehrere Uhren, die mehr oder weniger von selbst wussten, wann sie mich zu wecken hatten und wann nicht, sodass sich der Bedienungsaufwand auf ein Minimum reduzierte.

Nachdem ich angefangen hatte, mich mit Integrierten Schaltkreisen (zuerst TTL-ICs der 74-er Serie) zu beschäftigen, war mein erstes Projekt meine erste Uhr. Diese war sehr einfach aufgebaut: die 50-Hz-Frequenz der Netzspannung wurde durch 50 geteilt und dem Sekundenzähler zugeführt, die Sekunden wurden durch weiteres Teilen zu Sekundenzehnern, Minuten, Minutenzehnern, Stunden, Stundenzehnern und – ganz wichtig – Wochentagen. Damals benutzte ich noch eine recht primitive Bauweise: die ICs wurden mit der Rückseite auf eine Stück Sperrholz geklebt, und dann wurden die Anschlüsse mit Drahtstücken verlötet. Zur Kennzeichnung bekam jedes IC einen weißen Fleck mit Tipp-Ex auf den Bauch, auf den ich die IC-Nummer schrieb. Über Steckverbindungen in einem Buchsenraster konnte ich die Weckzeit einstellen, die aber je nach Schaltung täglich oder nur an Werktagen ausgeführt wurde. Solange kein Feiertag dazwischen kam oder ich am Wochenende früh aufstehen musste, konnte ich die Uhr wochenlange einfach laufen lassen, ohne sie anfassen zu müssen. Später, nachdem ich mit der Ganggenauigkeit nicht zufrieden war, fügte ich noch einen quarzgesteuerten Taktgenerator hinzu.

Als Wecker diente natürlich ein kleines Radio, das ich mit einer zusätzlichen Elektronik versehen hatte, die dafür sorgt, dass es mich nicht sofort in voller Lautstärke aus dem Schlummer reißt, sondern erst ganz leise anfängt und dann allmählich lauter wird.

Im Jahr 1984 zog ich von der Eichstraße in die Friesenstraße um. Im Gegensatz zur der alten Wohnung war die neue mit einer Gas-Etagenheizung ausgestattet. Nachdem ich herausgefunden hatte, dass der Gasbrenner einen elektrischen Anschluss besaß, über den man ihn ein- und ausschalten konnte, beschloss ich, mir eine neue Uhr zu bauen, die mich nicht nur weckt, sondern vorher auch die Heizung einschaltet, sodass die Wohnung bereits warm ist, wenn ich aufwache.

Meine zweite Uhr wurde von einer Z-80 CPU gesteuert. Besonderes Gimmick war ein Display, auf dem das Datum, der Wochentag und besondere Termine (z.B. Geburtstage von Freunden) angezeigt wurden. Der Wochentag wurde übrigens anhand des Datums automatisch ausgerechnet. Über vier Tasten konnte man die Uhr stellen sowie Schaltzeiten und Termine eingeben. Ein Drehknopf wählte die Betriebsarten aus: Normalbetrieb - Uhrzeit und Datum stellen - Termine eingeben - Schaltzeiten eingeben. Die Hauptbeschäftigung der CPU bestand darin, die sechs Ziffern zu multiplexen (in so schneller Folge nacheinander darzustellen, dass das menschliche Auge wegen seiner Trägheit den Eindruck vermittelt, die Ziffern würden gleichzeitig erscheinen). Das klingt zwar umständlich, erfordert aber weit weniger Bauteile als das permanente Anzeigen aller sechs Ziffern. Zu jeder Sekunde – abgeleitet von der Taktfrequenz des Systems von 4.194.304 Hz – wurde die CPU per Interrupt zu einer Routine geschickt, die die Anzeige um eine Sekunde weiterschaltete.

  oben: Datum mit Geburtstag
Mitte: Uhrzeit stellen
die 2. Zeile beschreibt die 4 Tasten
unten: Gerät 3 wird am kommenden
Sonntag und Montag um 7:25 Uhr
eingeschaltet, anschließend wird
die Schaltzeit gelöscht
Diese Uhr war natürlich schon sehr flexibel. Sie konnte neben dem Radio und der Heizung noch zwei weitere Geräte schalten (auch wenn ich dies nur ganz selten ausnutzte), wobei die Anzahl der Schaltzeiten pro Gerät nur durch den Datenspeicher begrenzt war, und außerdem konnte ich jeder Schaltzeit eine beliebige Kombination von Wochentagen zuordnen, an denen diese Schaltzeit gültig war. Ein zusätzlich programmierbares Lösch-Kennzeichen war dafür vorgesehen, dass Schaltzeiten, die nur ein einziges Mal ausgeführt werden sollten, anschließend automatisch gelöscht wurden und nicht per Hand aus dem Datenspeicher entfernt werden mussten.

Das Programm hatte ich mangels Texteditor und Assembler für meinen MZ-80K allein "zu Fuß" mit einem Hex-Editor erstellt.

Diese Uhr war für mich viele Jahre gut genug, auch wenn sie ein paar Macken hatte: die Stromversorgung für die LED-Anzeige war zu schwach, und die eingebauten Akkus für die Gangreserve bei Stromausfall wurden nicht richtig behandelt, sodass ihre Kapazität schnell nachließ, und nach einigen Jahren funktionierte das automatische Löschen von einmaligen Schaltzeiten aus unerklärlichen Gründen nicht mehr. Nachdem ich tatsächlich einmal verschlafen hatte, weil nachts der Strom ausgefallen war, war die Zeit gekommen, mir eine bessere Uhr zu bauen. Außerdem wollte ich nun endlich das lästige Problem lösen, dass ich immer noch vor jedem Feiertag die Weckzeit wegprogrammieren musste.

Die vier Leuchtdioden (grün/rot) zeigen den
Zustand der vier schaltbaren Geräte an
Mit kleinen, schwachen LED-Ziffern wollte ich mich nun nicht mehr zufrieden geben, ich besorgte mir deshalb ein großes Fluoreszenz-Display. Die LCD-Anzeige gab es diesmal mit Beleuchtung. Damit die Uhr nach einem Stromausfall auch wieder von selbst richtig weiter läuft, sollte sie einen DCF77-Empfänger haben, der die Funkzeit empfängt. Und weil der Mikrocomputer "C-Control" von Conrad schon die gesamte Auswertung eines solchen Signals eingebaut hat, entschied ich mich diesmal für diesen Baustein als "Herz" des Gerätes.

Außerdem entwickelte ich einen anderen Ansatz. Es sollte nicht mehr Schaltzeiten geben, denen Wochentage zugeordnet werden, an denen sie gültig sind, sondern umgekehrt: ich definierte Tagesarten (Werktage, Freitage, Wochenenden, Feiertage und 4 Spezialtage), denen Schaltzeiten zugeordnet werden. Auf diese Weise ist es z.B. möglich, einen mehrwöchigen Urlaub oder überhaupt Schaltzeiten zu programmieren, die weit in der Zukunft liegen.

oben: normale Anzeige mit
Wochen-Vorschau
Mitte: jede Tages-Art hat neun
Schaltzeiten. Werktags wird
um 6:00 Uhr die Heizung
eingeschaltet und um 6:40
das Radio, das um 6:50 wieder
ausgeschaltet wird usw.
unten: Für Spezialtage können
4 Gültigkeitsbereiche festgelegt
werden
 
Der C-Control-Baustein besitzt jede Menge Ein- und Ausgänge, was die Anzahl der nötigen Peripheriebausteine stark vermindert. So konnte ich die Anzeige für Datum und Wochentag direkt anschließen, ebenso ein kleines EEPROM, in dem die Schaltzeiten dauerhaft gespeichert werden. Umso größer war dagegen nun der Aufwand, die Ziffernanzeige zu multiplexen, denn dafür ist die C-Control doch nicht schnell genug. Über einen ganzen Haufen CMOS-ICs werden die sechs Werte nacheinander ausgegeben, in sechs Zwischenspeichern festgehalten und von dort aus per Multiplex auf die Ziffern übertragen.

Es stellte sich aber heraus, dass die C-Control selbst dafür nicht schnell genug ist: besonders zur vollen Stunde konnte ich deutlich sehen, wie die sechs Ziffern nacheinander zur Anzeige übertragen wurden. Auch das Auslesen der Schaltzeiten aus dem EEPROM dauerte zu lange. So blieb mir nichts anderes übrig, als mich mit der Assemblerprogrammierung der CPU zu beschäftigen und die zeitkritischen Funktionen als Assemblerroutinen einzubinden. Das Ergebnis war aber die Mühe wert, die Zeitersparnis war riesig und voll befriedigend.

Da die C-Control über einen speziellen BASIC-Dialekt programmiert wird, waren nun selbst ganz komplizierte Dinge machbar: vor allem eine vollautomatische Berechnung aller Feiertage nach der Gauß'schen Oster-Formel. Somit kennt die Uhr nicht nur Werktage und Wochenenden, sondern auch noch Freitage (freitags muss die Heizung früher eingeschaltet werden, bevor ich von der Arbeit komme), Feiertage sowie vier verschiedene Spezialtage, für die ich manuell den Gültigkeitszeitraum festlegen kann – bis zu einem Jahr im Voraus. Jeder dieser acht verschiedenen Tagesarten kann ich bis zu neun Schaltzeiten für insgesamt vier Geräte zuordnen. Wichtig ist hierbei natürlich die Priorität: der Ostermontag z.B. wird nicht als Werktag, sondern als Feiertag angesehen, es sei denn, das Datum liegt im Zeitraum eines Spezialtages, dann hat dies die höchste Priorität. Auf die Anzeige von Terminen habe ich verzichtet – das war doch mehr Spielerei als Nutzen gewesen. Stattdessen zeigt eine Vorschau auf die nächsten sieben Tage, um welche Art von Tagen es sich handelt.


Die Freude an dieser Uhr war vorbei, als es mich aus beruflichen Gründen nach Finnland verschlug. Das Zeitsignal war kaum zu empfangen und wäre sowieso "falsch" gewesen, denn Finnland liegt in der osteuropäischen Zeitzone. Ich reaktivierte erst mal die vorige Uhr, die – mittlerweile über 20 Jahre alt – weiterhin brav ihren Dienst tat, und entwickelte später einen DCF77-Simulator, mit dessen Hilfe ich meine Funkuhren wieder benutzen konnte.

Das war allerdings noch nicht genug, denn meine Uhr kannte nur die niedersächsischen Feiertage, die in Finnland nur teilweise gelten. Ich erweiterete deshalb das Programm um eine Feiertag-Eingabe. Diese ist natürlich allgemeingültig, das heißt, ich gebe z.B. für den Karfreitag kein Datum ein, sondern die Information "beweglich" und "-2" = die Differenz zum Ostersonntag. Ich will schließlich nicht jedes Jahr beigehen und neue Daten eingeben!