Home ==> AVR-DE ==> Apps ==> Dünne-Berg-Uhr
Duenne-Berg-Uhr

Eine Alternative zu Dicke-Tal-Uhren: die Dünne-Berg-Uhr


Überblick

  1. BCD-Anzeige als Alternative zu Siebensegmentanzeigen
  2. Der Prozessor
  3. Das Netzteil
  4. Der Aufbau
  5. Die Software
  6. Die Bedienanleitung

1 BCD-Anzeige als Alternative zu Siebensegmentanzeigen

Schon die allerersten Computer, die noch Relais- oder Röhrenrechner hießen, hatten Lämpchen, mit denen der Programmierer im Einzelschritt überprüfen konnte, was der Rechner so gerade vor sich hin rechnet. Das war zwar mühsam, behielt aber auch in komplexen Situationen die Übersicht.

Das Konzept dieser Uhr geht in diese Anfangszeiten zurück: die Zahlen werden binär angezeigt und müssen zusammengezählt werden und werden nicht etwa auf den krummen Anzeigen fertig serviert. Das Ablesen erfordert binären Grips.

So sieht die Uhr um 24:00 Uhr aus:

0 Uhr

Alle Lampen von der Uhr sind aus. Es ist herrlich dunkel, aber nur für eine Sekunde lang.

Jetzt so eine andere Uhrzeit:

23:59:47

Jetzt kommen die Zahlenwerte links, die Zweierpotenzen, zum Einsatz. Bei den Zehnern der Stunde ist die 2-Lampe an, also sind die Zehner 2. Bei den Einern der Stunde ist die 1-Lampe und die 2-Lampe an, macht 3. Selbiges bei den weiteren Ziffern.

Fehlende Lampen sind auf das bekloppte 60-er-System bei der Uhrzeit zurückzuführen. Die 60 (das Schock) und die 12 (das Dutzend) waren mal magische Erfindungen von ein paar abstrusen Menschen, die eigentlich im Dezimalsystem und auch in der Computerei nix zu suchen haben, nur noch bei der englischen Währung ihre überkommenen Urständ fristen und konsequent abgeschafft gehören.

Nun vergleichen wir dieses Anzeigesystem mal mit dem herkömmlichen Sieben-Segment-Zirkus bei Uhren. Um die Uhrzeit mit dieser Auflösung darzustellen, bräuchten wir sechs solcher Anzeigen mit 42 LEDs drin. Wir kommen mit weniger als der Hälfte aus: unsere Uhr hat gerade mal 20 davon. Ressourcen und Stromverbrauch mal eben halbiert, wenn das kein Argument für die Dünne-Berg- gegen die Dicke-Tal-Uhr ist.

Unsere sechs Ziffern heißen bei Informatikers übrigens BCD (Binary Coded Digit), so was wie binär-kodierte Ziffern. Wir werden im Kapitel Software noch sehen, dass das hervorragendes Futter für Microcontroller ist und dass er den Umgang mit solchen Ziffern glatt beherrscht.

BCD-Anzeige Prozessor Netzteil Aufbau Software Bedienanleitung

2 Der Prozessor

Warum ein Prozessor?

Zuerst mal die klassische Variante, eine CMOS-Uhr:

CMOS-Uhr

Ganze 12 ICs, 42 Widerstände und sechs Siebensegmentanzeigen dürften eine ganze Europlatine füllen. Plus Dutzende von Leiterbahnen. Ein echtes CMOS-Grab, teuer und kompliziert.

Das alles (bis auf die LEDs und die Widerstände) ist in einem Mikrocontroller schon enthalten und braucht bloss per Software (Timer) und Fuses (Quarzoszillator) aktiviert werden.

Prozessorauswahl

Der moderne AVR-Designer greift jetzt zum Arduino, aber nur weil er nix anderes kennt und daher an einer seltsamen Fixierung leidet, so Kokain-mäßig. Und taucht voll in die Suche nach passenden Bibliotheken ein, die ihm die eigene Denkarbeit abnehmen und stattdessen nach Lösungen suchen lassen, die dann halt doch nicht wirklich auf sein Problem passen. Aber irgendwie kriegt er das mit seinem eingebauten ATmega324 schon hin, nachdem er schon acht Kompromisse eingegangen ist oder 15 Zeilen Inline-Assembler für die BCD-Mathematik hineingefriemelt hat, die er in keiner Bibliothek findet.

Die anderen, nicht abhängigen Menschen starten den Windows- oder den Linux-AVR-Selektor und wählen in der Sektion "Clock src" einen Quarzoszillator und in der Sektion "I/O" 20 Ein-/Ausgabe-Pins.

AVR-Select Hardware

Eine Reihe von AVR-Typen kann das. Wir wählen den bei Reichelt leicht erhältlichen ATmega8 in irgendeiner der erhältlichen Unterarten (mit nix, mit A, mit ...), auch wenn manche Angeber meinen, der sei total out und werde schon gar nicht mehr produziert (es ist manchmal amüsant, in die vom Arduino total verbogene Wahrnehmungswelt mancher Zeitgenossen einzutauchen).

AVR-Select Ergebnis

So sieht unser Schaltbild mit dem ATmega8 aus, alles easy. Und noch dazu total easy lieferbar.

Schaltbild

Die zusätzliche Anforderung, dass die Software nicht allzu kompliziert sein soll, bringt folgendes Schaltbild zutage.

Schaltbild Uhr

Für den Quarz mit 2,4576 MHz kann auch jeder andere Typ mit fast beliebiger Frequenz eingesetzt werden, der durch 1024 geteilt und mit einem ganzzahligen Teiler bis 65536 eine Eins ohne Nachkommastellen liefert. Er ist mit Keramikkondensatoren von 22 pF zum Schwingen angeregt.

Die sechs BCD-Ziffern sind an die Ports D, B und C angeschlossen. Alle Portanschlüsse passen zu den Anzeigenreihen, nur das Portbit PD7 überlappt ein wenig, was aber per Software mit einfachem Links- und Rechtsschieben leicht handhabbar ist.

Zum Programmieren in der Zielschaltung ist noch eine ein 6-poliger ISP-Stecker eingebaut.

In dieser Schaltung sind alle LEDs in Sink-Schaltung angeschlossen. Bei 5 V Betriebsspannung beträgt der LED-Strom
ILED = (5 - 2 - 0,2) / 270 * 1000 = 10,4 mA

Wären alle 20 LEDs an, betrüge der Strom 207 mA. Der ATmega8 ist mit maximal 300 mA Strom über den GND-Pin spezifiziert, kann also so betrieben werden.

Um den Aufbau zu vereinfachen, ist noch ein 20-poliger Wannenstecker eingebaut, der die 20 LEDs mit der Prozessorplatine verbindet. Die Anschlussfolge des Steckers orientiert sich an einer vereinfachten LED-Verdrahtung mit den Enden des eingesteckten Flachkabels.

20-poliger Stecker

Die Kathoden der Achter- und Vierer-LEDs kommen an Pin 1 bis 8 der Flachkabelbuchse, die der Zweier und Einer an die Pins 9 bis 20. Alle Anoden der LEDs sind verbunden und gehen an ein separates Kabel direkt zum Netzteil.

BCD-Anzeige Prozessor Netzteil Aufbau Software Bedienanleitung

3 Das Netzteil

Dimensionierung

Wie oben beschrieben brauchen wir für die LEDs maximal knapp über 200 mA. Um den realen Wert zu ermitteln, wurden in einer Tabellenkalkulation alle 86.399 Sekunden eines Tages simuliert und die Anzahl LEDs berechnet. Maximal sind gleichzeitig 14 LEDs an (z.B. um 17:37:37 und um 17:57:37). Es ergibt sich folgende Verteilung:

Anzahl LEDs gleichzeitig an

Im Schnitt sind 7,3 LEDs gleichzeitig an, der maximale Minutenschnitt beträgt 11,7 LEDs. Das sind bei 10,4 mA LED-Strom im Schnitt 76 mA, maximal für eine Minute lang 122 mA und maximal für eine Sekunde lang 146 mA. Also deutlich weniger als der unrealistische 20-LED-Fall.

In der Bastelkiste fand sich ein 2*7,5V-Trafo mit 3,6 VA. Um zu testen, ob der geeignet wäre, wurde die Power-Supply-Software angeworfen und das Trafonetzteil gerechnet.

Power Supply Simulation

Die über 10 V, die das Netzteil bei 0,4 V Ribble bei der realistischen Maximalbelastung liefert, sollte ausreichen um einen 5V-Spannungsregler wie den 7805 sicher anzusteuern. Da bei 76 mA 6,2 V am Spannungsregler abfallen, ist die Wärmeleistung am 7805 von 465 mW mit einem kleinen Kühlkörper abzuführen.

Schaltbild

Dies hier ist das Schaltbild des Netzteils.

Schaltbild Netzteil

Das ganze passt auf eine kleine Lochrasterplatine, die perfekt in das gewählte Gehäuse passt.

Lasttest

Um sicherzustellen, dass das Netzteil auch extreme Ausnahmezustände übersteht (z.B. Hitzeperioden), habe ich es mit 300 mA Dauerlast (2 Widerstände mit 33Ω-2W parallel) mehrere Stunden gequält. Der Trafo und der 7805-Kühlkörper werden dabei recht heiß, aber noch erträglich.

CENTER

Ab 400 mA wird das Ribble auf der geregelten 5V unerträglich hoch, die maximal 480 mA, die der Trafo bringt, sind mit dem 7805-Reger nicht nutzbar. Dazu müsste ein 9V-Trafo her. Das ist für den vorliegenden Bedarf aber völlig unnötig.

BCD-Anzeige Prozessor Netzteil Aufbau Software Bedienanleitung

4 Der Aufbau

Der Aufbau erfolgt auf Lochrasterplatinen, die passgerecht in das Gehäuse passen.

Aufbau

Der Vorteil des 20-poligen LED-Anschlusses ist, dass Netzteil und Prozessorteil im unteren Gehäuseteil platziert werden können. Der LED-Teil im Deckel sieht dann so aus:

Aufbau der LEDs

Die Verdrahtung der LEDs ist durch die Steckerbelegung sehr vereinfacht. Dafür ist dann die Verdrahtung des Steckers auf der Prozessorplatine etwas komplizierter. Die erste Version hatte zwei Verdrahtungsfehler.

BCD-Anzeige Prozessor Netzteil Aufbau Software Bedienanleitung

5 Die Software

Die Software ist in Assembler-Format hier, im HTML-Format hier.

Aufbau und Struktur

Die Software ist in folgenden Schritten aufgebaut:
  1. Initiierung der Hardware,
  2. Timer, Interrupts und Schlafmodus,
  3. Sekundeninterrupt und Uhrzeit,
  4. Umwandeln in das Anzeigeformat und Portausgabe,
  5. Quarzoszillator mit Fuse einschalten.

Initiierung

Da das Programm den Interruptmodus verwendet, muss der Stapel initiiert werden. Da der ATmega8 über mehr als 256 Byte SRAM verfügt, sind Low- und High-Byte des Stapelzeigers zu setzen.

Alle Portpins sind dann als Ausgänge umzuschalten, indem deren Richtungsports lauter Einsen erhalten. Alle Ports sind beim Init auf High zu schalten, damit der Fall mit den annenen 20 LEDs gar nicht erst eintritt.

Timer, Interrupts und Schlafmodus

Der Timer arbeitet mit einem Vorteiler von 1024 und im CTC-Modus (Rücksetzen bei Erreichen des Compare-Match-A-Wertes). Die Compare-Match-Werte sind von der Quarzfrequenz abhängig. Die Werte sollten mit Ganzzahlenwerten Eins ergeben. Geeignete handelsübliche Quarze sind (Quarze oberhalb 10 MHz sind für die V/L-Versionen des ATmega8 oder bei Betriebsspannungen unter 5 Volt ungeeignet):
< 5 MHz5 – 10 MHz> 10 MHz
2,0485,068810,24
2,0971525,1211,0592
2,45766,14412,288
3,0726,414,7456
3,27686,553616
3,932167,372818,432
4,0967,6819,6608
4,1943048,388608
4,91529,216
9,8304

Wird ein anderer Quarz als 2,4576 MHz verwendet, ist die Quarzfrequenz in der Konstante clock zu ändern.

In jedem Fall muss die Fuse geändert werden (siehe unten).

Nach dem Starten des Timers im Port TCCR1B ist noch der Compare-Match-Interrupt einzuschalten. Damit der Controller beim Zählen alle anderen Arbeiten einstellt, wird der Sleep-Mode Idle eingestellt, nur der Interrupt weckt den Prozessor wieder auf. Die Ausführung von Interrupts sind durch Setzen des Interrupt-Flags im Statusregister einzuschalten.

Nach dem Aufwecken wird der Controller einfach wieder schlafen gelegt.

Sekundeninterrupt und Uhrzeit

Da kein anderer Interrupt zu bearbeiten und auch sonst nichts weiteres zu tun ist, findet der gesamte Ablauf im Sekundeninterrupt statt. Die Software enthält dafür zwei verschiedene Versionen, die mit dem Schalter pbcd ausgewählt werden. Ist dieser auf 1 gesetzt, findet die Berechnung der Uhrzeit mit gepackten BCD-Zahlen statt, Wenn nicht mit binären Zahlen.

Bei gepackten BCD-Zahlen enthalten die Register rSek, rMin und rStd in den unteren vier Bits die Einer, in den oberen vier Bits die Zehner. Um zu erkennen, ob die nächste Sekunde im unteren Nibble mehr als 9 Sekunden erreicht hat, wird 6 zum unteren Nibble dazu addiert. Tritt dabei ein Übertrag vom unteren in das obere Nibble auf, ist die H-Flagge (Halbübertrag) im Statusregister gesetzt. Falls nicht, werden die 6 wieder abgezogen. Sekunden und Minuten werden mit 0x60, Stunden mit 0x24 verglichen. Sind diese erreicht, wird das betreffende Register auf Null rückgesetzt und die nächste Minute oder Stunde angestossen.

Im binären Modus werden die Register rSek, rMin und rStd so lange erhöht, bis ihr Inhalt 60 bzw. 24 ist und das Rücksetzen erfolgt (bei Sekunden und Minuten mit Übertrag auf das nächste Register).

Umwandeln in das Anzeigeformat und Portausgabe

Im gepackten BCD-Modus ist die Ausgabe am einfachsten: die Ports D, B und C kriegen direkt die gepackte BCD-Zahl. Nur das unterste Bit von B wird aus dem Port heraus- und in den Port D als oberstes Bit hereingeschoben.

Beim binären Uhrzeitmodus muss die Binärzahl zuerst durch zehn dividiert werden. Das Divisionsergebnis geht dann in das obere Nibble, der Divisionsrest in das untere Nibble. Damit hat man dann gepacktes BCD. Bit 0 aus Port B wird dann wie oben beschrieben in Port D kopiert.

Bei der Ausgabe werden die drei Portergebnisse mit COM invertiert, da die Anoden der LEDs an +5V angeschlossen sind und leuchten, wenn der Portausgang auf Null geht.

Quarzoszillator einschalten

Um den Quarzoszillator als Taktquelle einzuschalten, ist die Fuse wie im Bild gezeigt zu setzen.

Fuse Quarz


BCD-Anzeige Prozessor Netzteil Aufbau Software Bedienanleitung

6 Die Bedienanleitung

Wenn die Dünne-Berg-Uhr als Geschenk zu verschenken ist, muss eine ordentliche Bedienungsanleitung her. Ich habe da mal einen Entwurf für OpenOffice in maschinell aus Chinesisch in Deutsch übersetzter Version (Kennzeichen: chinesische Rechner haben keine Umlaute) gemacht und daraus ein PDF produziert.

BCD-Anzeige Prozessor Netzteil Aufbau Software Bedienanleitung


©2017 by http://www.avr-asm-tutorial.net