Pfad: Home ==> AVR-DE ==> Anwendungen ==> Dünne-Berg-Uhr   This page in english: Flag EN Logo
Duenne-Berg-Uhr

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


Die duenne 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
Diese Seiten als PDF, 15 Seiten, 723 kB.

1 BCD-Anzeige als Alternative zu Siebensegmentanzeigen

Schon die allerersten Computer, die noch Relais- oder Röhrenrechner hießen, hatten kleine Glühlämpchen, mit denen der Programmierer im Einzelschritt überprüfen konnte, was der Rechner so gerade vor sich hin rechnet. Auf diese Weise blinkte es gar lustig, wenn der Rechner arbeitete. Und wenn der Operator den Rechner anhielt, um zu schauen, was er gerade jetzt so macht, konnte er den Lämpchen entnehmen, mit was der Rechner gerade jetzt so beschäftigt war:
  1. 12 oder 16 Lämpchen zeigten die Adresse an, die gerade bearbeitet wurde oder die als nächstes dran war.
  2. 8 Lämpchen zeigten den Befehl an, den der Rechner als nächtes ausführen würde, wenn man ihn ließe.
  3. 8 Lämpchen zeigten den Akkumulator an, das letzte Resultat der Rechnerei.
Das Einzelschrittverfahren 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, müssen zusammengezählt werden und werden nicht etwa auf krummen Anzeigen fertig serviert. Das Ablesen erfordert etwas 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 zusammen 3. Selbiges bei den weiteren Ziffern.

Fehlende Lampen bei den Zehnerstellen 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 heutigen Dezimalsystem und auch in der Computerei nix mehr zu suchen haben und nur Ärger machen, und die ansonsten nur noch bei der englischen Währung ihre überkommenen Urständ fristen und eigentlich konsequent abgeschafft gehören. Und halt auch noch bei der Uhrzeit.

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 von selbst beherrscht.

BCD-Anzeige Prozessor Netzteil Aufbau Software Bedienanleitung

2 Der Prozessor

2.1 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 so einem Mikrocontroller schon enthalten und braucht bloß per Software (Timer) und Fuses (Quarzoszillator) aktiviert werden. Aber halt nicht in einem nackigen ATmega8, der tut ohne eingebranntes Programm rein gar nix.

2.2 Prozessorauswahl

Der moderne AVR-Designer greift jetzt zum Arduino, aber nur weil er gar 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.

AVR-Select Hardware 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 Ergebnis 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).


2.3 Schaltbild

So sieht unser Schaltbild mit dem ATmega8 aus, alles easy: aus 12 ICs wird eines mit 28 Pins und aus 42 Widerständen wird glatt die Hälfte. Und noch dazu total easy lieferbar.

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

Für den Quarz mit 2,4576 MHz kann auch jeder andere Typ mit fast beliebiger Frequenz eingesetzt werden, der durch 1.024 geteilt und mit einem ganzzahligen Teiler bis 65.536 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 * 1.000 = 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

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

3.2 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 hier angeworfen und das Trafonetzteil gerechnet.

Power Supply Software Es wird Zwei-Dioden-zwei-Spulen-Gleichrichtung gewählt, in die Felder mit dem Transformer 7,5 V, 3,6 VA und 6,2 Ω in die Felder mit dem Elko 2.200 µF und in das Feld mit dem Strom 146 mA eingetragen. Und schon produziert die Software die Kurve mit was das Netzteil so arbeitet.

Transformatornetzteil mit 3,6VA Das Netzteil produziert aus dem 7,5-V-Trafo 12 V Spitzenspannung bei 0,42 Vpp Brummspannung. Das ist vollkommen ausreichend, um den 5V-Regler korrekt auszusteuern. Da bei 146 mA 7 V am Spannungsregler hängen bleiben und das mit P = U * I etwas mehr als 1 W Wärmelast ist, kriegt der 7805 einen kleinen Kühlkörper mit 20 K/W.

3.3 Lasttest

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.

Auch bei 400 mA ist das Ribble noch erträglich (1,04 Vpp) und auf der geregelten 5V-Spannung tut sich nix.


BCD-Anzeige Prozessor Netzteil Aufbau Software Bedienanleitung

4 Der Aufbau

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

Aufbau der LEDs 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.

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.

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

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

5.3 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):
Passende Quarze (MHz):
< 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.

5.4 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 angestoßen.

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

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

5.6 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/2018 by http://www.avr-asm-tutorial.net