Pfad:
Home ==>
AVR-DE ==>
Anwendungen ==> Dünne-Berg-Uhr
This page in english:
Eine Alternative zu Dicke-Tal-Uhren: die Dünne-Berg-Uhr
Überblick
- BCD-Anzeige als Alternative zu Siebensegmentanzeigen
- Der Prozessor
- Das Netzteil
- Der Aufbau
- Die Software
- Die Bedienanleitung
Diese Seiten als PDF,
15 Seiten, 723 kB.
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:
- 12 oder 16 Lämpchen zeigten die Adresse an, die gerade
bearbeitet wurde oder die als nächstes dran war.
- 8 Lämpchen zeigten den Befehl an, den der Rechner als
nächtes ausführen würde, wenn man ihn ließe.
- 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:
Alle Lampen von der Uhr sind aus. Es ist herrlich dunkel, aber
nur für eine Sekunde lang.
Jetzt so eine andere Uhrzeit:
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.
2.1 Warum ein Prozessor?
Zuerst mal die klassische Variante, eine 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.
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.
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.
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.
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.
3.1 Schaltbild
Dies hier ist das Schaltbild des Netzteils.
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:
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.
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.
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
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.
Der Aufbau erfolgt auf Lochrasterplatinen, die passgerecht
in das Gehäuse passen.
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.
Die Software ist in Assembler-Format hier,
im HTML-Format hier.
5.1 Aufbau und Struktur
Die Software ist in folgenden Schritten aufgebaut:
- Initiierung der Hardware,
- Timer, Interrupts und Schlafmodus,
- Sekundeninterrupt und Uhrzeit,
- Umwandeln in das Anzeigeformat und Portausgabe,
- 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 MHz | 5 – 10 MHz | > 10 MHz |
2,048 | 5,0688 | 10,24 |
2,097152 | 5,12 | 11,0592 |
2,4576 | 6,144 | 12,288 |
3,072 | 6,4 | 14,7456 |
3,2768 | 6,5536 | 16 |
3,93216 | 7,3728 | 18,432 |
4,096 | 7,68 | 19,6608 |
4,194304 | 8,388608 | |
4,9152 | 9,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.
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.
©2017/2018 by http://www.avr-asm-tutorial.net