Nachdem ich vor den Sommerferien in die Mikrocontrollerprogrammierung mit einem Atmega8 eingestiegen war und damit ein Projekt für den Kunstunterricht umgesetzt hatte, wollte ich in den Sommerferien noch einen weiteren der vier verbleibenden Atmegas verbauen.

Und so kam mir die Idee zum 0815 (nein, keine Anspielung auf den 8051er) Mikrocontroller Projekt: Die Uhr oder besser gesagt eine Binäruhr. Ich wollte meine Uhr allerdings nicht irgendwo in meinem Zimmer aufstellen, sondern in meinem Schulmäppchen mitnehmen. Eins vorweg, einen Schaltplan habe ich vor dem Bau nicht erstellt, sodass ich hier nur auf den Aufbau der Software und der Platine eingehen werde. Dabei werde ich auch ein paar Tipps zum Bau einer eigenen Binäruhr geben.

Atmega 8, ISP Buchse und ein paar LEDs mit Vorwiderständen
Atmega 8, ISP Buchse und ein paar LEDs mit Vorwiderständen, hier im Stellmodus für Stunden

Aufbau und Bedienung

Die Uhr ist auf einer Lochraster Platine aufgebaut. Entsprechend unübersichtlich ist sie auf der Rückseite geworden. Die vier LED Reihen geben von links nach rechts die Stunden, Minuten und Sekunden an. Mit einem Druck auf den Taster unterhalb des Atmegas wird in eine Datumsansicht umgeschaltet, bei der anstatt der Sekunden das Datum angezeigt wird. Die letzte Reihe gelbe LEDs dient dann zur Anzeige des Monats. Normalerweise sind sie abgeschaltet.

Möchte man die Uhr einstellen (bei der derzeitigen Genauigkeit ohne externen Quarz ist das täglich nötig), so muss man den Taster länger gedrückt halten. Sobald sich die Uhr im Stellmodus befindet, wird die jeweilige Reihe auf 0 zurückgesetzt und durch kurzes Drücken des Taster kann der Wert um eins erhöht werden. Durch erneutes langes Drücken springt die Uhr zur nächsten Reihe.

Möchte man Energie sparen, so wäre es auch denkbar die LEDs nach einer bestimmten Zeit abzuschalten und den Controller in den Schlafzustand zu versetzen, wobei er weiterhin auf Timer1 im CTC Modus (1Hz Interrupt zum hochzählen der Sekunden) und einen Interrupt Pin reagieren müsste. So könnte man die LED Anzeige mit einem Tastendruck wieder aktivieren.

Versorgt wird die Uhr über zwei AA Akkus, wobei ich noch darüber nachdenke ein Ladegerät zu integrieren, um sie nicht immer aus dem Batteriefach entfernen zu müssen. Die benötigten analogen Pins habe ich für diesen Zweck freigehalten.

Das Programm

Da die Anzahl der Ausgänge des Atmega 8 nicht ausreicht, um jede LED einzeln anzusteuern, werden sie per Multiplexing angesprochen. Dabei sind alle LEDs einer Zeile an den selben Ausgang und Vorwiderstand angeschlossen. So spare ich auch einige Widerstände, da ich nicht für jede LED einen Widerstand brauche. Über die 4 Transistoren wird dann je eine Reihe eingeschaltet, die LEDs auf Ein gesetzt die leuchten sollen, ein wenig gewartet, alle LEDs ausgeschaltet und der nächste Transistor aktiviert um den Wert anzuzeigen. Dies geschieht so schnell, dass es für das menschliche Auge so aussieht, also ob die LEDs dauerhaft an sind. Dabei werden sie nur kurz eingeschaltet.

Da ich nur einen Timer brauchte und der Taster nicht an einen Interrupt Pin angeschlossen ist, konnte ich die Timer verschwenden. Deshalb läuft das Multiplexing in einem eigenen Timer ab, wobei dies auch eine Ursache für die Ungenaue Zeit sein könnte. Auf der anderen Seite würde die Uhr dann eher nach als vor gehen. Um das zu testen werde ich aber erst einmal einen Quarz bestellen müssen.

Das gesamte Programm wurde in C mit dem Atmel Studio geschrieben und mit einem Atmel mk II per ISP auf den Controller geflasht.

Probleme

Da ich ursprünglich nicht daran gedacht habe den Interrupt Pin für einen Eingang freizuhalten, muss der Taster gepollt werden. Das bedeutet natürlich auch, dass der Controller nie ganz in den Energiesparmodus fahren kann, weil er dann nicht per Taster aufgeweckt werden könnte => die LEDs ließen sich nicht mehr Einschalten. Auf der anderen Seite kann jetzt der komplette Port für die LEDs verwendet werden, was die Anzeige der Binärzahlen deutlich einfacher macht.

Ein weiteres Problem ist natürlich die Platine. Sie ist erhlich gesagt nicht sonderlich ordentlich, was sich aber mit einem vernünftigen Layout und einer geäzten Platine sicherlich auch Einlagig mit einigen Brücken umgehen ließe.

Binäruhr im Mäppchen
Binäruhr im Mäppchen. Die Platine ist mit Silberdraht am Stift befestigt, der durch den Tintenpatronenhalter gesteckt wurde.

Zu guter letzt ist da noch das Batteriefach. Das habe ich lose im Mäppchen liegen und über ein zweiadriges Stück Flachbandkabel mit der Uhr verbunden. Leider neigt es wie auch auf diesem Bild gerne mal abzubrechen. Die Folge ist dann eine Krokodilklemme, die irgendwie mit Klebeband angeklebt wird, damit sie sich nicht löst, bis ich das Kabel wider angelötet habe. Hier werde ich mir sowohl am Batteriefach als auch an der Platine noch eine Zugentlastung überlegen müssen. Im einfachsten Fall ein Tröpchen Heißkleber über das Kabel. Den kann man zur Not auch wieder abbrechen.

Außerdem schließt das Batteriefach einen sehr schlechten Kontakt. Je nach dem sind die Federn nicht stark genug, um die Batterie an beide Kontakte zu drücken. In der Folge geht die Uhr natürlich aus. Dies passiert scheinbar besonders oft, wenn es zu Erschütterungen kommt (z.B.  im Bus auf den Straßen der Schlaglochrepublik). Danach läuft sie dann meist wieder von vorne los. Bis ich hier ein besseres Fach bestelle, habe ich zwei kleine Stücke Kupferblech dazwischengeklemmt und die Batterien mit Klebeband festgeklebt. Jetzt funktioniert alles soweit, wenn da nicht schon wider ein neues Problem beim Foto Shooting gewesen wäre.

Offenbar ist im Bus irgendwie der Stelltaster gedrückt gewesen. In der Folge befand sich die Uhr im Stellmodus als ich zuhause ankam (siehe erstes Bild, alle LEDs für die Minutenanzeige leuchten). Mal sehen wie ich das beheben kann.

So viele Probleme?

Eigentlich waren es noch viel mehr. Unter anderem hätte ich mir immer wieder einen Debugger gewünscht (den baue ich grade mit eigenem Übertragungsprotokoll und Schaltplan). Ein Artikel wird hier folgen.

Diese Fülle an Problemen ist für einen Einsteiger meist unabsehbar. Um ein Problem mit dem Interrupt Pin zu vermeiden mache ich mir inzwischen vorher Gedanken über die Pinbelegung und reserviere die Pins auf einem Ausdruck des entsprechenden Pinouts des Dattenblatts. Anfangs hielt ich es für relativ leicht eine Binäruhr zu bauen, allerdings sind teilweise kleine Probleme wie Programmfehler oder kalte Lötstellen ziemlich unüberschaubar, wenn man nicht weiß, wo man suchen muss. Eine Kalte Lötstelle beim Multiplexing lässt sich beispielsweise nicht ohne weiteres mit einem Multimeter finden, wenn man den Controller nicht wieder herausnimmt. Hier hatte ich Glück, dass ich Zugriff auf ein Oszilloskop habe. So kann ich vor allem auch die Probleme direkt im laufendem Programm sehen und muss mir keine Gedanken um ständiges Nachmessen machen.

Befestigung

Die Platine ist an einem alten Stift mit abgesägter angespitzter Seite mit ein wenig Silberdraht befestigt. Der Stift wiederrum ist in den Halter für Tintenpatronen gesteckt, sodass ich die Binäruhr auch wieder Rückstandslos entfernen kann, was wohl auch bei Änderungen an Platine noch häufiger notwendig werden könnte.

Für den Aufmerksamen Leser

Wer etwas aufmerksamer beim Lesen war, der wird gemerkt haben, dass für die Sekundenanzeige eigentlich eine LED fehlt, um volle 59 Sekunden darstellen zu können. Das liegt daran, dass ich in der Planung nur eine Datumsanzeige vorgesehen hatte. Ein Beispielt für schlechte Planung. Die werde ich dann wohl irgendwann mal Einlöten.

Subscribe
Notify of
3 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments

[…] Mitschüler waren jedoch eingie Male überrascht, als ich mit einem Bleistift im ISP Stecker meiner Binäruhr einen Reset des Controllers […]

Aaron Tacke
8 years ago

Ich habe deine Idee, ohne dass ich bisher überhaupt Kenntnis davon hatte, soweit weitergeführt, dass ich mit einem Attiny85 eine Binäruhr fürs Handgelenk gebaut haben. Über eine 3-Volt Cr2032 ist sie nun nicht mehr grösser als viele andere Digitaluhren. Ich habe folgende LEDs, da ich ja mit 5 Pins und möglichst wenig aufwand nur 8 LEDs ansteuern konnte: 4h, 2h, 1h, 30min, 10min, +10min, 5min, SekundenLED, die alle 5 Sekunden die Minuten%5 angibt.
Studierst du eigentlich irgendetwas in Richtung SPS oder Elektronik?