Pfad: Home => AVR-Übersicht => Anwendungen => Uhr 60+4    (This page in English: Flag EN) Logo
Zirkular-LED

Uhr 60+4 mit sechzig plus vier LEDs und einem ATmega48

60 rote 3mm-LEDs, in einem Kreis mit einem Durchmesser von 97 mm montiert, zusammen mit vier zusätzlichen LEDs in den vier Ecken, zeigen Uhrzeit und Status an. Alle LEDs werden von CMOS-Schieberegistern angetrieben und brauchen keine Widerstände. Die komplette Uhrenintelligenz ist in einem ATmega48 zu Hause, der das ganze Rechnen und Steuern erledigt.

Achtung! Das Ganze funktioniert nur mit echten CMOS-4094, nicht mit 74HC4094 oder 74HCT4094!

Vorläufig! Ungetested und noch nicht komplett!
Die Zeit wird folgendermaßen angezeigt: Das Einstellen der Zeit und der Weckzeit erfolgt mit einem Schalter, zwei Tasten und einem Potenziometer:
  1. Das Ein- und Ausschalten des Weckers erfolgt mit einem Schalter.
  2. Die erste Taste startet den Einstellungszyklus, führt bei der Einstellung eine Stufe zurück und verlässt den Einstellungsmodus auch wieder.
  3. Die zweite Taste bestätigt die Eingabe und geht zur nächsten Einstellung über (von Stunden über Minuten und Sekunden). Sind alle Einstellungen vorgenommen, wird die neu eingestellte Uhrzeit übernommen. Ist der Alarmschalter aktiv, werden anstelle der Sekunden die Weckmelodie abgespielt und eingestellt. Ist der Alarmschalter geschlossen und der Einstellmodus nicht aktiv, verlängert jedes Drücken des zweiten Tasters die Weckzeit um fünf weitere Minuten.
  4. Alle Einstellungen werden mit dem Potenziometer vorgenommen.
Alle Zeichnungen dieses Projektes können hier als Libre Office Draw-Datei (einschließlich gedruckte Schaltung und Bestückungsplan) heruntergeladen werden. Alle Flussdiagramme gibt es als Libre-Office-Draw-Datei hier, alle Berechnungen und Tabellen als Libre-Office-Calc-Datei hier.

Seitenanfang Hardware Aufbau Betrieb Software
Niedrigstrom Hochstrom Taktung Gedruckte Schaltung Teileliste Assembler-Quellcode Wie es funktioniert

2 Hardware

4094-Schieberegister Um sechzig einzelne LEDs plus vier Status-LEDs anzusteuern, kann man keinen AVR in DIL-Packung verwenden, weil die alle zu wenig Pins haben. Die Hardware in diesem Projekt erweitert daher einen 8-Bit-Daten-plus-3-Bit-Kontroll-Port auf 64 einzelne Bits, indem diese 64 Bits in CMOS-Schieberegister eingeschoben werden.

Der 4094 hast acht Schieberegister S1 bis S8. Bei positiven Flanken am Takt- oder CLK-Eingang schiebt das erste Schiebregister den logischen Zustand am DATA-Eingang in das erste Schieberegister S1 und gleichzeitig alle acht Schieberegister um eine Position nach rechts "S(n) ==> S(n+1)". Nach achtmaligem Schieben kommt das erste Bit am letzten Schieberegister S8 an.

Wird der Eingang-Strobe STB Eins, dann folgt der Inhalt der acht Speicher (Latches, L1 bis L8) dem Zustand der acht Schieberegister. Wird STB Null, bleibt der letzte eingestellte Zustand der Latches erhalten.

Ist der Output-Enalbe-Eingang OE Null, dann sind die acht Ausgangstreiber des 4094 ausgeschaltet: sie haben dann einen sehr großen Widerstand (High-Z-Zustand). Wird der Output-Enable-Eingang OE Eins, dann wird der Ausgang der acht Latches auf die acht Ausgangstreiber geschaltet und diese treiben dann die Ausgänge an.

Bitte beachten, dass der 4094 noch zwei weitere Ausgänge hat, die das Aneinanderschalten mehrerer 4094 ermöglichen. Da diese Funktion hier nicht verwendet wird, ist sie auch nicht genauer beschrieben.

Beide Datenblätter, sowohl von Fairschild als auch von Texas Instruments, sind fehlerhaft. Sie behaupten beide, dass der Output-Enable-Pin Eins sein müsse, um das Schieben und Stroben zu ermöglichen. Das ist aber nicht so: der Output Enable ist nur für das Ein- und Ausschalten der Ausgangstreiber verantwortlich und hat beim Schieben und Stroben keinen Einfluss. Ferner ist der Strobe-Eingang STB nicht flanken-getriggert, wie dies in Fairchilds Datenblatt suggeriert wird. Die Funktion am STB-Eingang ist aber statisch: solange er Eins ist, folgen die Latches den Schiebreregister-Ausgängen.

Die Verwendung von CMOS-Schieberegistern zum Antreiben der LEDs hat noch einen weiteren Vorteil: der CMOS-Ausgang treibt nur sehr geringe Strommengen, die Widerstände zum Einstellen des LED-Stroms können entfallen: der CMOS-Ausgang liefert alles, was er kann. Das hat aber auch einen Nachteil, denn der Strom ist bei 5V Betriebsspannung oder darunter so niedrig, dass nur Niedrig-Strom-LEDs betrieben werden können. Zum Betreiben von normalen LEDs mit 10 oder 20mA muss die CMOS-Betriebsspannung höher sein. Das bedingt, dass der AVR einen Pegelumsetzer braucht, um die CMOS-Schieberegister anzusteuern. Da der AVR nur spricht und die 4094 nur empfangen, kann das ein einfacher Einweg-Umsetzer von 3,3 oder 5,0V auf z. B. 9V sein.

Weil es so viele verschiedene Varianten gibt, die Schaltung zu betreiben, gibt es folgende unterschiedlichen Fälle:
  1. Die einfachste Version ist es, den Controller, die Schieberegister und die LEDs aus einer einzigen Stromquelle mit 3,3 oder 5,0V zu betreiben. Der LED-Strom liegt dann zwischen 1,1 und 3,1 mA, geeignet für 2-mA-LEDs. Dazu ist kein Pegelumsetzer erforderlich.
  2. Um die LEDs mit höheren Strömen zwischen 5 und 20 mA zu betreiben, brauchen die Schieberegister und die LEDs eine höhere Betriebsspannung. Das bedingt das Zwischenschalten eines Pegelumsetzers, der im vorliegenden Fall aus zwei Darlington-Arrays besteht.
  3. Die LEDs können bei beiden Varianten entweder im Gemeinsame-Anoden-Modus oder im Gemeinsame-Kathoden-Modus betrieben werden. Bei gemeinsamen Anoden zieht der CMOS-Ausgang die LED nach GND, bleibt aber auf einem Spannungsniveau von +Ub minus ca. 2V hängen. Dies wird als Sink-Mode bezeichnet. Sind hingegen die Kathoden der LEDs auf GND-Niveau arbeiten die CMOS-Ausgänge im Source-Modus: sie liefern dann Strom in die LED. Die Unterschiede zwischen beiden Betriebsarten sind nicht so arg groß, siehe weiter unten.
Das Folgende beschreibt diese unterschiedlichen Geschmäcker.

Seitenanfang Hardware Aufbau Betrieb Software
Niedrigstrom Hochstrom Taktung Gedruckte Schaltung Teileliste Assembler-Quellcode Wie es funktioniert

2.1 Niedrig-LED-Strom-Variante

Schaltbild der Niedrigstromvariante Das hier ist die Niedrig-LED-Strom-Variante. Alles wird aus einer Betriebsspannung versorgt, die zwischen 3,3 und 5,0 Volt liegen kann.

Eine vergrößerte Version des Schaltbilds kriegt man zum Download, wenn man auf das Schaltbild entweder draufklickt (dann öffnet sich die vergrößerte Version im Browser) oder wenn man darauf rechts-klickt und "Speichern unter ..." wählt (dann kann man sie herunterladen). Die vergrößerte Version enthält auch das Schaltbild eines Netzteils, das zwischen 3,3 und 5,0 Volt einstellbar ist.

Der ATmega48 kann mit einem Quarz getaktet werden, was das Nachstellen der Uhr seltener nötig macht. Nahezu jeder Quarz ist dafür geeignet und kann mit der Konstanten "clock" in der Software eingestellt werden. Auch die nötigen Teilerraten können mit dem Rechenblatt "quarz" in der Libre-Office-Calc-Datei uhr60-4.ods ausgewählt und die Einstellkonstanten in den Assembler-Quellcode kopiert werden. Als Vorgabe im Rechenblatt und in der Software ist ein Uhrenquarz mit 32.768 kHz eingestellt. Das sollte man unbedingt ändern, wenn die ISP-Brenner-Software keinen ISP-Takt mit 4kHz und niedriger kennt.

An den ATmega48 sind noch folgende Hardware-Komponenten angeschlossen: Jedes Bit der acht 4094-Schieberegister treibt eine LED an: die 60 Uhrzeit-LEDs sowie die vier Status-LEDs (AM grün, PM rot, Einstellmodus gelb, Wecken rot).

Die Ausgangs-Portpins PD0 bis PD7 (Datenbits) und PC3 bis PC5 (Steuerbits) sind direkt an die 4094-Schieberegister angeschlossen. Alle Daten- und Steuer-Bits gelangen daher ohne Invertierung an die 4094-Schieberegister. Da die LEDs im Schaltbild aber im Sink-Modus angeschlossen sind (gemeinsame Anoden), müssen die Datenbits invertiert an die Schieberegister gesendet werden. Das macht die Software, indem man die Konstante "cSink" auf Eins setzt.

Die Impulse an den Steuerbits PC3 (CLK) und PC4 (STB) sind bei 32,768kHz Takt 61µs lang, bei höheren Quarzfrequenzen bis 20MHz mindestens etwa 1µs lang. Das macht das Makro "WaitClock" mit entsprechend vielen NOP-Instruktionen.

Das Funktionsdiagramm des Schiebens der Bits in die Schieberegister So schiebt der ATmega48 die Bits in die 4094-Schieberegister. In acht Registern werden die Zustände der 64 LEDs entweder auf Eins (cSink = 1) oder auf Null (cSink = 0) gesetzt. Je nachdem in welchem Zustand sich die Uhr befindet, werden die Uhrzeit (Stunden, Minuten und Sekunden) in diese Bits geschrieben (bei cSink = 1 mit einem UND mit der invertierten Bit-Position, bei cSink = 0 mit einem ODER).

Sind alle Bits korrekt ausgefüllt, werden, beginnend mit den acht LEDs, die an die 4094-Schieberegister an Q8 angeschlossen sind, diese Bits in einem Register in die richtige Reihenfolge gebracht, auf Port D gelegt und mit CLK in die ersten Schieberegister der 4094 eingeschoben. Es folgen die LEDs, die an Q7 angeschlossen sind, dann die an Q6, etc. Jede Achter-Portion wird mit einem kurzen Puls am CLK-Eingang in die 4094 eingeschoben.

Sind alle 64 Bits in den 4094 angekommen, werden mit einem kurzen Puls am STB-Eingang die Schieberegister in die Latches des 4094 kopiert. Dann wird OE an allen 4094 auf Eins gesetzt, die CMOS-Ausgänge treiben ab jetzt die LEDs an.

Zur Reihenfolge, die die Bits an Q8, Q7 etc. einnehmen, ist im Software-Kapitel Näheres angegeben, da die Zuordnung nicht so ganz trivial ist.

LED-Strom bei verschiedenen Betriebsspannungen, 4094 Bitte beachten, dass in dieser Schaltung der LED-Strom ausschließlich von der Betriebsspannung bestimmt wird. Das Diagramm zeigt den beim 4094 gemessenen LED-Strom bei verschiedenen Betriebsspannungen. Die zwei Schaltungsarten (Sink = Gemeinsame Anode, Source = Gemeinsame Kathode) sind dabei unterschieden.

Wie zu sehen ist, ist der LED-Strom im Sink-Modus geringfügig höher als im Source-Modus. Das steht im Gegensatz zu meinen Messungen an einem 4011, die ich vorher veranstaltet hatte. Aber die Unterschiede sind gering (1.74 gegenüber 1.54 mA/V) und jedenfalls nicht entscheidend.

Beide Kurven sind über weite Strecken linear, nur bei niedriger Betriebsspannung gibt es ein wenig Abweichung nach oben. Die angegebenen Formeln sind daher recht genau. Für genauere Werte können die Orignaldaten in der Libre-Office-Calc-Datei uhr60-4.ods verwendet werden (im Blatt "CMOS-treiberstrom_4094").

LED-Strom bei verschiedenen Betriebssspannungen Diese Tabelle zeigt genauer, welche LED-Ströme bei verschiedenen Betriebsspannungen zu erwarten sind. 2mA-LEDs sind ab ca. 4 V voll ausgesteuert und bei 3,1 mA ist Schluss mit Lustig.

Wer auf minimalen Stromverbrauch Wert legt, z. B. weil er aus einer Batterie oder einem Akku versorgt, stellt die Stromversorgung der Niedrig-Strom-Variante mit einem Poti und einem 3,3V-Spannungsregler auf genau 2 mA ein. In diesem Fall muss aber sichergestellt sein, dass die Betriebsspannung die 5,25 V nicht überschreiten kann. Im großformatigen Schaltbild ist eine solche Schaltung enthalten.

2.2 High-current LED hardware

Schaltbild der Hochstromvariante Diese Variante betreibt die CMOS-Schieberegister mit einer höheren Spannung und daher die LEDs mit einem höheren Strom.

Der einzige Unterschied sind die beiden Darlington-Arras ULN2001. Diese übersetzen die niedrigere Spannung am Controller in die höhere zum Betrieb der Schieberegister. Dabei invertieren die Arrays alle Steuer- und Datensignale, was in der Software berücksichtigt werden muss: Man setze die Konstante cUln2001 dazu einfach auf Eins, den Rest erledigt der Assembler-Quellcode. Einfach assemblieren und in das Flash brennen.

Mutige können auf die mit "Entweder ... Oder" gekennzeichneten Teile einfach verzichten, diese kurzschließen und damit die Anoden mit Plus 9V verbinden. Die CMOS-Ausgänge machen die LEDs nicht kaputt, auch wenn das 2mA-LEDs sind. Wer ganz vorsichtig sein will, begrenzt den LED-Strom mit bis zu drei JFETs J176 auf maximal 30 mA oder mit dem BC557-Konstantstromregler auf eine mit dem 15Ω-Widerstand einstellbaren Maximalstrom. Der Widerstand ergibt sich aus 650 (mV) / I (mA) und ist bei I = 43 mA bei den 15Ω im Schaltbild.

Wenn Du mit der linken Maustaste auf die Grafik klickst, öffnet sich ein größeres, vollständiges Schaltbild im Browser, das Du mit einem Rechtsklick und "Speichern unter" auch herunterladen kannst. Das kleine und das große Schaltbild gibt es aber auch als Libre-Office-Draw-Datei uhr60-4.odg zum Download.

LED-Strom bei verschiedenen Betriebsspannungen Diese Tabelle gibt eine Orientierung über die LED-Ströme bei den verschiedenen Betriebsspannungen auch bei der Hochstromvariante. Die thermische Leistung der 4094-Schieberegister ist in den letzten beiden Spalten der beiden Schaltungsvarianten für eine einzige sowie für viel LEDs gleichzeitig an einem 4094 angegeben. Rote Ziffern stellen eine Überschreitung der thermischen Leistungsgrenze de 4094 dar (700 mW). Die angegebenen Spannungen sind nur dann anwendbar, wenn diese Spannung vom Netzteil fest eingestellt wird. Für den Fall, dass der Trafo bei Stromabnahme seine Spannung verringert, sind die Werte weiter unten realistischer angegeben.

Alle weiteren am ATmega48 angeschlossenen Komponenten sind mit der Niedrigstrom-Variante identissch.


Seitenanfang Hardware Aufbau Betrieb Software
Niedrigstrom Hochstrom Taktung Gedruckte Schaltung Teileliste Assembler-Quellcode Wie es funktioniert

2.3 Taktung des ATmega48

Der Controller kann auf zweierlei Weise getaktet werden:
  1. mit dem internen RC-Oszillator, was eine Genauigkeit von 3% bei einer Betriebsspannung von 3,3 Volt ergibt. Bei 5 V sind es 10% Genauigkeit. 10% entspricht ca. 876 Stunden pro Jahr und benötigt daher eine öftere Nachjustierung der Uhr.
  2. mit einem externen Quarz und zwei Keramik-Kondensatoren: hier bestimmt der externe Quarz die Genauigkeit. Die meisten haben +/-20 ppm. Das entspricht +/-631 Sekunden pro Jahr oder 10 Minuten Genauigkeit. Man kommt daher mit einer Nachjustierung der Uhr alle halbe Jahre aus (oder wenn halt mal wieder die Zeitzone wechselt).
Quarze als Taktgeber Die Software benötigt einen Sekundenimpuls. Die Tabelle rechts zeigt für alle handelsüblichen Quarze (plus dem controller-internen RC), ob und wie diese Quarzfrequenzen mit einem 8-Bit-TC so heruntergeteilt werden können, dass sie auf 1 Hz genau kommen. Das kann, z. B. bei 32,768 kHz, mit einem einzigen Overflow-Interrupt oder einem CTC-Interrupt gehen, in anderen Fällen ist dazu noch ein Software-Abwärtszähler nötig. Der kann in einem Byte erfolgen oder mit zwei oder drei Bytes.

In der Tabelle ist auch ein 16-Bit-TC angegeben. Der geht aber in dieser Schaltung nicht, weil der 16-Bit-TC hier die Musik macht. Kann man nur bei anderen Schaltungen verwenden (oder wenn man TC2 die Musik machen lässt).

Die Tabelle zeigt, dass bis auf vier alle anderen Quarze gehen. Wenn man nicht allzu oft Interrupts und möglichst kleine Zähler haben will, nimmt man einen, der mit einem Vorteiler von 256, 64 oder wenigstens 8 arbeitet.

Bitte bei der Auswahl noch Folgendes beachten: Die Libre-Office-Calc-Datei uhr60-4.ods ermöglicht im Blatt "quarze" in einem Ausklappfeld die Auswahl eines Quarzes und stellt alle Software-Einstellungen dafür als Assembler-Quelltext zur Verfügung. Dieser kann kopiert und in den Assembler-Quelltext herüberkopiert werden. Die Software stellt dann automatische alles korrekt zur Verfügung.

Seitenanfang Hardware Aufbau Betrieb Software
Niedrigstrom Hochstrom Taktung Gedruckte Schaltung Teileliste Assembler-Quellcode Wie es funktioniert

2.3 Überlegungen zur Spannungsversorgung

Transformatorspannungen unter Last Da die Anzahl an potenziellen Variationen sehr roß ist, kann kein spezieller Trafo empfhlen werden. Hier sind einige Hinweise zur Spannungsversorgung.

Bei der Niedrigstrom-Variante und beim Versorgen der 4094s und LEDs mit maximal +5V, unter Verwendung von 2mA-LEDs, ergibt sich ein LED-Strom von mindestens 8 mA, zuzüglich der Prozessorversorgung etwa 15 mA. Daher kann der Trafotyp durchaus ein 0,33VA-Typ mit 6V sein, der bis zu 55mA liefern kann. Fairerweise sollten die Dioden dann vom Schottky-Typ sein, damit dem Low-Drop-Spannungsregler auch was zu regeln bleibt.

Interessanter ist die Variante, die 4094-Schieberegister und die LEDs aus der ungeregelten, gleichgerichteten Trafospannung zu betreiben. Da deren Spannung sehr stark von der angeschlossenen Last abhängt, ist der sich ergebende LED-Strom vom Gesamtstrombezug abhängig. Dazu wurden alle Trafoarten betrachtet, die es zwischen 6 und 9V zu kaufen gibt.

Selbstverständlich sind Trafos mit Zweifachwicklung etwas anders drauf als solche mit nur einer Wicklung: sie brauchen nur zwei Dioden anstatt vier. Daher sind im Diagramm doppellagige Trafos gepunktet und einfachlagige Trafos durchg¨ngig. Doppellagige Trafos fallen in der Spannung unter Last im Mittelbereich weniger stark ab als einzellagige.

Betreibt man die 4094s und die LEDs aus der gleichgerichteten Tranfospannung und nicht aus dem Spannungsregler, dann zeigt das Diagramm den Spannungsverlauf mit der Last. Bei 0,33VA wurden die Spannungen nach dem Graetz-Gleichrichter einmal mit 1N4001-Dioden und einmal mit Schottky-Dioden vom Typ BAT85 gerechnet. Wie man aus der durchgezogenen und der gestrichelten Linie sieht, ergibt das schon einen deutlich sichtbaren Unterschied.

Sich einstellende LED-Stroeme nach Trafotyp Selbiges sieht man auch, wenn man die sich ergebenden LED-Ströme berechnet, und zwar für gleichzeitig an-nene zwei, vier, fünf und - vorsichtshalber auch mal - acht LEDs. Der Unterschied zwischen 1N4001- und BAT85-Dioden wird hier deutlich sichtbar: die BAT85-Variante erzeugt deutlich mehr an LED-Strom.

Da bei mehr aktiven LEDs die Gleichspannung wegen des steigenden Strombedarfs erheblich zurückgeht, unterscheiden sich die LED-Ströme nicht so arg viel voneinander. Jedenfalls sind acht an-nene LEDs deutlich weniger stromhungrig als es vier Mal zwei an-nenen oder zwei Mal vier an-nenen entspräche. Noch ein Argument mehr, auf die gesonderte Regelung der LED-Ströme zu verzichten: der Unterschied zwischen acht und vier mA oder zwischen zehn und fünf dürfte bei 2mA-LEDs kaum zu erkennen sein.

Die wichtigste Message aus diesem Diagramm ist aber, dass mit allen genannten Trafotypen keine Überschreitung des maximal zulässigen LED-Stroms von 30mA eintreten kann.

Thermische Lesitungen der 4094s Werden eine, zwei, vier, fünf oder gar acht LEDs von einem einzigen 4094 angetrieben, dann bleibt an ihm die gesamte Treiblast hängen. In diesem Diagramm sind diese thermischen Lasten bei den verschiedenen Trafo-Typen dargestellt. Wie man sieht, bleiben alle 6V-Trafotypen unter den zulässigen thermischen Leistungen des 4094 (700 Milliwatt). Auch die 9V-Typen mit 1VA bleiben darunter. Bei den 1,8VA-Typen kann es zu Überschreitungen kommen, aber nur wenn mehr als vier LEDs aus einem einzigen 4094 angetrieben werden. Die Achtervariante ist exotisch, das macht man allenfalls absichtlich, aber kaum im Normalbetrieb der Uhr. Die Fünfervariante tritt nur dann auf, wenn Da dieser Fall nur sehr selten eintritt und die Ü,berschreitung auch nicht arg erheblich ist, sind auch diese beiden Trafotypen noich machbar. Wer ganz sicher gehen will, baut bei diesem Trafotyp noch eine Strombremse mit einem PNP-Transistor ein, wie sie im Schaltbild zu sehen ist. Dann kann gar nix mehr Übles passieren.

Noch zwei Anmerkungen:
  1. Trafos mit 12V und darüber unbedingt vermeiden, das überschritte die maximal zulässigen 18V der 4094s.
  2. Weil alle 4094s gleichzeitig den STROBE-Befehl kriegen und sich die Anzahl an eingeschalteten LEDs nur zu diesem Zeitpunkt ändert, sind daraus resultierende Spannungsänderungen auch ungefährlich: der Datentransfer ist dann vollständig abgeschlossen.




Seitenanfang Hardware Aufbau Betrieb Software
Niedrigstrom Hochstrom Taktung Gedruckte Schaltung Teileliste Assembler-Quellcode Wie es funktioniert

3 Aufbau

Für die beiden Varianten wurde eine vereinfachte gedruckte Schaltung entwickelt. Sie sit auf einer 10<10cm einseitig beschichteten Platine untergebracht. Allerdings sind viele Verbindungen manuell mit lötbarem Kupferlackdraht auf der Leiterseite anzubringen. Dazu gehören
  1. die CLK-, STB- und OE-Verbindungen der 4094 zum Prozessor (Niedrigstrom-Variante) oder zum ULN2001-2 (Hochstrom-Variante).
  2. alle DATA-Pins der 4094, die mit den Portausgängen des Controllers (Niedrigstrom-Variante) bzw. den beiden ULN2001 (Hochstrom-Variante) zu verbinden sind.
  3. die beiden Keramikkondensatoren am Quarz (bei Wahl dieser Option).
Kapitel 3.3 gibt einige Hinweise zu Alternativen.

3.1 Gedruckte Schaltung

Das hier ist das Layout der gedruckten Schaltung. Um zu einer höher aufgelösten Grafikdatei zu kommen, kann man mit der linken Maustaste auf das Bild klicken, und es mit der rechten Maustaste und "Speichern unter" herunterladen. Auch in der Libre-Office-Draw-Datei uhr60-4.odg ist diese Grafik enthalten.

Gedruckte Schaltung der Uhr Der 10-Pin-Verbinder verbindet alle externen Komponenten, die nicht auf der Schaltungsplatine selbst montiert sind. Dieser muss auf der Unterseite der Platine angelötet werden, dafür sind keine Bohrungen vorgesehen.

Die beiden Taster sind mit ihren beiden RCs ebenfalls nicht auf der Platine und müssen extern verdrahtet werden.

Die Stromversorgung wird ebenfalls über den 10-Pin-Plug zugeführt. Wenn die 4094 und die LEDs aus einer einzigen Spannungsquelle gespeist werden sollen, können der Spannungsregler sowie die beiden Tantal-Elkos auf der Platine entfallen und gebrückt werden.

3.2 Bestückungsplan

Bestueckungsplan der gedruckten Schaltung Das ist der Bestückungsplan der gedruckten Schaltung. Es sind alle Komponenten für die Hochstrom-Variante eingezeichnet. Siehe weiter unten für die Niedrigstrom-Variante.

Zwei Brücken sind zu bestücken (schware Linien), und auf der Leiterseite sind die beiden Kondensatoren am Quarz mit lötbarem Lackdraht zu verbinden, falls Quarzbetrieb sein soll (blaue Linien).


Seitenanfang Hardware Aufbau Betrieb Software
Niedrigstrom Hochstrom Taktung Gedruckte Schaltung Teileliste Assembler-Quellcode Wie es funktioniert

3.3 Variationen

3.3.1 Niedrigstrom-Variante

Falls nur die Niedrigstrom-Variante gebaut werden soll, ist Folgendes zu beachten:

3.3.2 LEDs in Source-Schaltung

Die LEDs in Source-Schaltung Wenn die LEDs in Source-Schaltung betrieben werden sollen, ist Folgendes zu tun:

Seitenanfang Hardware Aufbau Betrieb Software
Niedrigstrom Hochstrom Taktung Gedruckte Schaltung Teileliste Assembler-Quellcode Wie es funktioniert

3.3.3 Verwendung anderer Quarze

Der auf der gedruckten Schaltung reservierte Platz für den Quarz ist auf kleine, runde Uhrenquarze optimiert. Soll es ein anderer Quarz sein, muss dieser nach dem Einbau der Prozessor- und der ULN2001-Fassung sowie dem Abblock-C von 100 nF an den VCC- und GND-Pins eingebaut werden. Dazu ist einer der beiden Anschlussdrähte des Quarzes so hinzubiegen, dass er in das zweite Quarzloch passt (den Draht für XTAL2 in seiner ursprünglichen Form und Länge so belassen). Wenn nötig, den Anschluss-pin für XTAL1 etwas verlängern. Bitte sicherstellen, dass das Quarzgehäuse nicht Pins des ULN oder des ATmega berühren kann (Plastikband oder Einschweißen des Quarzes in einen Schrumpfschlauch).

3.3.4 Begrenzung bei erhöhtem LED-Strom

Im Schaltbild sind zur Strombegrenzung der LEDs drei JFETs J176 eingezeichnet. Wer sowas bei hoher Versorgungsspannung brauchen sollte, findet hier die Dimensionierungsgrundlagen dafür.

Stromgrenzen beim J176 Das hier sind die Maximalströme, die ein bis drei J176 bei Versorgungsspannungen zwischen 3,3 und 18 V liefern können. Das natürlich nur dann, wenn die 4094 das auch liefern können. Dabei sind die J176 einfach nur parallel geschaltet.

Da die Ströme aller LEDs, die eingeschaltet sind, durch die JFETs durchmüssen, und weil meistens drei bis vier LEDs gleichzeitig an sind, kann diese Konstruktion zwischen 7 und 10 mA per LED bei 18V treiben. Wer gerne mehr Strom haben will, z. B. 20 mA pro LED, muss die Akternativ-Konstruktion mit dem PNP-Transistor bauen. Die Stromgrenze ergibt sich hierbei aus 650 (mV) / R (Ω) für R = 15Ω zu 43 mA oder mit R = 8,2Ω zu I = 80 mA. Aber Obacht! Die 4094 müssen das auch aushalten (siehe oben).

Seitenanfang Hardware Aufbau Betrieb Software
Niedrigstrom Hochstrom Taktung Gedruckte Schaltung Teileliste Assembler-Quellcode Wie es funktioniert

3.4 Teileliste

Stückliste für Uhr60+4 Hier ist die Stückliste mit allen nötigen Bauteilen, unterteilt nach Varianten und Optionen. Die Teilebezeichnungen sind für Reichelt, die angegebenen Preise sind vom 03.01.2022. Bauteile mit mehr als 1% Kostenanteil sind angegeben. Wie man sieht, sind die LEDs, die 4094s und die Transformatoren die führenden Posten.

Der Gesamtpreis für die Bauteile liegt um die 30 Euros, daher ist das Teil als Geburtstagsgeschenk oder als Weihnachtsgeschenk durchaus geeignet.


Seitenanfang Hardware Aufbau Betrieb Software
Niedrigstrom Hochstrom Taktung Gedruckte Schaltung Teileliste Assembler-Quellcode Wie es funktioniert

4 Betrieb

Flussdiagramm Tastenbedienung Beim Betrieb der Uhr sind die Uhrzeit und die Weckzeit einzustellen, beim Wecken kann zeitweilig ein verlängerter Weckzeitraum eingestellt werden (Snooze-Funktion). Das erfolgt mit den hardwareseitig entprellten Tasten T1 (PCINT10) und T2 (PCINT9).

Die Einstellung erfolgt nach folgenden Regeln:
  1. Im Normalmodus beginnt mit Taste T1 der Eingabebetrieb, falls das Wecken aktiv ist (Schalter ist an), verlängert Taste T2 den Weckzeitpunkt um fünf Minuten.
  2. Wenn beim Drücken von T1 der Weckschalter geschlossen ist, wird die Weckzeit eingestellt, wenn nicht wird die Uhrzeit eingestellt.
  3. Die Einstellung von Zeit und Weckzeit beginnt mit den Stunden. Die Einstellung erfolgt mit dem Poti, dabei zeigen die AM- und PM-LED die Tageszeit an.
  4. Wird nun erneut die Taste T1 gedrückt, dann wird der Einstellmodus verlassen, die vorgenommenen Einstellungen werden verworfen.
  5. Wird die Taste T2 gedrückt, werden die eingestellten Stunden in den Zwischenspeicher kopiert und es werden die Minuten eingestellt.
  6. Durch Drücken von T1 wird zur Stundeneinstellung zurück verzweigt. Beim Drücken von T2 wird entweder zur Einstellung der Sekunden verzweigt oder, wenn der Weck-Schalter geschlossen ist, zur Auswahl der Weckmelodie.
  7. Sind alle drei Einstellungen vorgenommen und mit T2 bestätigt, erfolgt die Einstellung der Zeit bzw. der Weckzeit.

4.1 Signalisierung bei der Zeit- und Weckzeiteinstellung

Der Einstellmodus wird mit einer im Sekundenrhythmus blinkenden gelben LED links unten angezeigt.

Bei der Einstellung der Zeit ist zu beachten, dass die derzeit bestehende Zeit (Stunden, Minuten, Sekunden) durch eine dauerhafte LED angezeigt wird. Da die Zeit während der Einstellung weiterläuft, kann sich diese feste LED auch ändern. Die mit dem Poti eingestellte neue Zeit blinkt hingegen im Sekundenrhythmus. Blinkt nur die gelbe LED, ist die verstellte Zeit mit der aktuellen Zeit identisch.

Werden die Stunden eingestellt, blinkt neben der neuen Stunde auch die neu eingestellte AM- bzw. PM-LED, die derzeit bestehende AM- bzw. PM-LED ist hingegen nicht dauerhaft an. Die AM- und PM-LEDs sind bei der Einstellung von Minuten und Sekunden/Melodienummer ausgeschaltet und werden erst nach dem Beenden des Einstellmodus wieder aktiv.

Bei der Einstellung der Weckmelodie ist die ursprüngliche Melodienummer ebenfalls dauerhaft an und die neu einzzustellende Melodienummer blinkt. Die neu einzustellende Melodienummer wird abgespielt, wenn sich die eingestellte Nummer ändert.

Seitenanfang Hardware Aufbau Betrieb Software
Niedrigstrom Hochstrom Taktung Gedruckte Schaltung Teileliste Assembler-Quellcode Wie es funktioniert

4.2 Snooze-Funktion

Wenn der Einstellungsmodus inaktiv ist, der Weckschalter aber geschlossen, dann bewirkt das Drücken von Taste T2 eine vorübergehende Verlängerung der Weckzeit um fünf Minuten. Aus- und Einschalten des Weckschalters bewirkt, dass die ursprünglich eingestellte Weckzeit wieder aktiviert wird.

Die temporär eingestellte Weckzeit kriegt man heraus, indem man mit T1 in den Einstellmodus geht und sich dann mit T2 die Minuten anzeigen lässt. Durch mehrfaches Drücken von T1 kann man den Einstellmodus wieder verlassen, ohne die Weckzeit zu verstellen.

5 Software

5.1 Download des Assembler-Quellcodes

$$TBD$$

5.2 Fuse-Einstellungen

Vor oder nach dem Flashen des Hexcodes muss, wenn der externe Quarz als Taktgeber ausgewählt werden soll, dessen Fuse umgestellt werden.

Umstellung der ISP-Frequenz Ist der angeschlossene Quarz ein Uhrenquarz mit 32,768 kHz, dann muss als Erstes die ISP-Frequenz auf einen niedrigeren Wert von 8 kHz oder weniger eingestellt werden. Im Studio 5.19 erledigt das der Button "Settings" im Tab "Main". Sollte die Brenner-Software und der angeschlossene Brenner das nicht können, muss ein Quarz mit einer höheren Frequenz verwendet werden (siehe oben).

Die Original-Fuses des ATmega48A Die auf den externen Quarz eingestellten Fuses des ATmega48A Erst danach können die Fuses umgestellt werden. Links sind die Werkseinstellungen zu sehen, rechts die für einen 32 kHz Quarz vorzunehmenden Einstellungen. Bitte unbedingt beim ersten Rutsch auch die CLKDIV8-Fuse ausschalten, sonst ist der AVR nur noch mit 1kHz oder weniger ansprechbar. Pech, wenn das die Soft- und Hardware des Brenners nicht können.

Seitenanfang Hardware Aufbau Betrieb Software
Niedrigstrom Hochstrom Taktung Gedruckte Schaltung Teileliste Assembler-Quellcode Wie es funktioniert

5.3 Wie es funktioniert: Generelles

Alle verwendeten Prozeduren laufen innerhalb von Interrupt-Service-Routinen ab und sind teils recht umfangreich. Zwischen des ISRs wird der Controller schlafen gelegt, um den Strombedarf zu verringern. Der Schlafanteil liegt bei etwas über 90%. Dies aber nur, wenn eine Melodie abzuspielen ist und jeder Nulldurchgang einer Halbwelle einen Interrupt auslöst. Das dürfte auch bei nur 32 kHz Takt genügend Spielraum für alles Andere lassen.

Das folgende Timing basiert auf diesem 32 kHz-Takt, wenn nötig sind auch andere Quarze angesprochen.

Seitenanfang Hardware Aufbau Betrieb Software
Niedrigstrom Hochstrom Taktung Gedruckte Schaltung Teileliste Assembler-Quellcode Wie es funktioniert

5.4 Wie es funktioniert: die Zeitanzeige

Die Zeitanzeige im Normalmodus verwendet 62 LEDs: 60 für Stunden, Minuten und Sekunden plus zwei für die AM- und PM-Anzeige. Weil alle LEDs von 4094-Schieberegistern angesteuert werden, muss der Zustand, welche Bits Eins oder Null sein müssen, für alle diese Bits zusammengestellt werden. Das macht eine große Bit-Spielwiese.

Noch ein Wort darüber, warum die Spielwiese in jeder Sekunde neu aufgebaut wird und bei der Zeitbestimmung nicht als Basis herangezogen wird: Die Entscheidung, das so zu machen, wie es jetzt gelöst ist, ist gerechtfertigt.

5.4.1 Die Bit-Spielwiese

Die Bit-Spielwiese in rT0 bis rT7 Im Quellcode besteht die Spielwiese aus acht Registern, rT0 bis rT7 in R0 bis R7. Jedes Register ist für einen 4094 zuständig und für dessen angeschlossene LEDs (wenn auch nicht in der naheliegenden Reihenfolge, siehe unten).

Immer, wenn eine Sekunde vorbei ist, wird diese Spielwiese frisch aufgebaut. In Abhängigkeit von den beiden Konstanten
  1. cUln2001 und
  2. cSink
besteht die Spielwiese aus lauter Nullen (cUln2001 == cSink) oder lauter Einsen (cUln2001 <> cSink). Das erledigt das Makro ClearRegs.

5.4.2 Setzen oder Löschen eines Bits der Spielwiese

Setzen oder löschen eines Bits der Spielwiese Sehr oft kommt es vor, dass ein einziges Bit der Reihe zu Setzen oder zu löschen ist (je nach Polarität). Das erledigt das Makro SetBit. Es hat einen Parameter, der weiter unten erläutert wird.

Ist der Eingangswert rmp, was Sekunden oder Minuten sein können, nun z. B. 59, dann muss der Nummer im Register rmp vier hinzugezählt werden: ab 8, 24, 40 und 56 jeweils Eins, um die Vier-Ecken-LEDs zu überspringen.

Für die nachfolgenden Operationen sind dann zwei Parameter wichtig:
  1. die Registernummer: sie ergibt sich aus dem erhöhten rmp beim Teilen durch acht, für den Zugriff mit LD und ST wird die Adresse im Doppelregister Z gebildet, sowie
  2. das Bit innerhalb des Registers: es wird durch Linksschieben von Eins in Register rShft ermittelt.
Das betreffende Byte, auf das Z zeigt, wird nun mit LD gelesen. Die Verknüpfung zwischen dem betreffenden Bit in rShft und im gelesenen Registerwert kann nun auf zweierlei Weise erfolgen:
  1. Makro-Parameter 0 (@0) = 0: das Bit soll invertiert werden, d. h. wenn es Null ist soll es Eins werden, wenn Eins dann Null, oder
  2. Makro-Parameter 0 (@0) = 1: das Bit soll auf jeden Fall und immer gesetzt/gelöscht werden, egal was auch immer bereits drinsteht, je nach Polarität erfordert das entweder ein ODER oder ein AND nach erfolgter Invertierung von rShft.
Der erste Fall betrifft z. B. die Stunden- oder Minuten-LEDs, die sich bei Gleichheit gegenseitig invertieren sollen, der zweite Fall die Sekunden-LEDs (die auf jeden Fall an sein sollen).

Das Ergebnis wird abschließend mit ST an die Ursprungsadresse in Z abgelegt.

Das Setzen der Stunden geht etwas anders. Hier sind 12 abzuziehen, wenn es nachmittags ist (und die PM-LED aktiv zu setzen), danach wird mit fünf malgenommen und SetBit ausgeführt.

5.4.3 Die vier Ecken-LEDs

Bei den vier Ecken-Leds sind die Register klar: in rT0 ist die rote PM-Led, in rT2 ist die rote Weck-LED, in rT4 die gelbe Einstell-LED und in rT6 die grüne AM-LED, und zwar jeweils in deren Bit 7.

Normalerweise blinken die AM- und PM-LED nicht, sondern eine von beiden ist dauerhaft an. Das wechselt im Einstellmodus, wenn die Stunden justiert werden: die AM- und PM-LED blinkt dann je nach Einstellung der Stunden, zusammen mit der gelben Einstellungs-LED. Zur Verstetigung des Strombedarfs blinken beide LEDs wechselseitig.

5.4.4 Senden der LED-Bits der Spielwiese an die 4094

Das Transferieren der Bits in der Spielwiese an die 4094s geht folgendermaßen.
  1. Die acht Bits für Q8 in allen acht 4094s kommen in ein Register und werden dem Ausgabeport D zugeführt: PD0 ist für 4094Q8-1, PD1 für 4094Q8-2, etc.
  2. Der CLK-Eingang aller 4094 wird gleichzeitig auf 1 gepulst, bei höheren Quarzfrequenzen ein wenig gewartet und danach wieder deaktiviert. Das schiebt die acht Datenbits für Q8 in die acht 4094s. Das Makro PulseClock erledigt das:
    1. nach dem Schreiben des Ports D wartet es mindestens eine µs, dann
    2. setzt es das Ausgangsbit PC2 entweder high (wenn cUln2001 == 0 ist) oder low (wenn cUln2001 == 1 ist), dann
    3. wartet es für mindestens eine µs, dann
    4. löscht es PC2 (wenn cUln2001 == 0 ist) oder setzt es (wenn cUln2001 == 1 ist).
  3. Danach werden die zweiten, dritten, etc. Datenbits fürQ7, Q6, etc. in gleicher Weise an die 4094-Schieberegister versandt.
  4. Durch Pulsen des STB-Eingangs für wenigstens 1µs wird der Inhalt der Schieberegister in den 4094 in die Latches veranlasst (Makro PulseStb).
  5. Durch Aktivieren des OUTPUT ENABLE werden die Latchinhalte an die acht Ausgangspins Q der acht Schieberegister gebracht und die LEDs leuchten.
Bitte auch hier beachten, dass die einschlägigen Datenblätter falsch sind: das Schieben mit CLK und das Latchen mit STB bei den 4094 ist nicht vom Zustand des OE-Eingangs abhängig.

Die gesamte Stundenerhöhung, das Komponieren der Spielwiese und deren Versand an die 4094 dauert bei 32kHz Takt etwas mehr als 10 ms lang. Das bedeutet, dass der Controller damit gerade mal zu etwa 1% ausgelastet wird. Auch das rechtfertigt die niedrige Taktfrequenz: Megahertze würden da nur unsinniges Zeugs machen.

Seitenanfang Hardware Aufbau Betrieb Software
Niedrigstrom Hochstrom Taktung Gedruckte Schaltung Teileliste Assembler-Quellcode Wie es funktioniert

5.4.5 Die LED-Assoziierung im Schaltbild und in der gedruckten Schaltung

Die LED-Reihenfolge im Schaltbild ist nicht Eins-zu-Eins mit den 4094 verschaltet. Ihre Struktur assoziiert die 60 LEDs ein wenig eigenwillig, denn L1 ist nicht unbedingt Q1 und L8 nicht zwangsläufig auch Q8. Das höngt vom Design der gedruckten Schaltung ab. Die folgenden Darstellungen beziehen sich auf 4049-1, alle anderen 4094 sind identisch verdrahtet.

LED-Assoziierung im Schalbild und in der gedruckten Schaltung Dieser Auszug aus der gedruckten Schaltung zeigt, welche LEDs von welchen Ausgängen des 4094 angetrieben werden:
  1. Q1 treibt L4, L1 wird von Q4 angetrieben,
  2. Q2 treibt L3. L2 ist an Q3 angeschlossen,
  3. Q3 treibt L2, L3 ist am Q2,
  4. Q4 treibt L1, L4 ist an Q1,
  5. Q5 treibt L8, L5 ist an Q8,
  6. Q6 treibt L7, L6 ist an Q7,
  7. Q7 treibt L6, L7 ist an Q6,
  8. Q8 treibt L5, L8 ist an Q5.
Das ist nun alles außerhalb jeder Reihenfolge, oder?

Aber gemach, bevor wir jetzt für jedes Q eine eigene Routine basteln, um alle Q8 in einem Register versammeln zu können. Die Reihenfolge ist zwar von hinten durch die Brust ins Auge, aber so ganz unregelmäßig ist sie dann doch nicht.

Gesendet werden muss in der folgenden Reihenfolge: Q8, Q7, Q6, Q5, Q4, Q3, Q2 und Q1. Das entspricht den folgenden LEDs: L5, L6, L7, L8, L1, L2, L3 und L4. Entsprechend dieser LED-Reihenfolge muss jetzt das Byte der Spielwiese umsortiert werden.

Um alle Q8 in ein Register zu bringen, müssen wir Q8 (vulgo: L5) entweder an den rechten oder linken Rand des Registers kriegen, um mit LSR oder LSL jeweils ein Bit in das Carry schieben zu können. Dazu reicht ein einziges SWAP aus: es befördert Q8 und L5 mal eben in Bit 0 des Registers, von wo es mit LSR abgeholt werden kann und mit ROL in das Senderegister eingeschoben werden kann. Letztendlich landet so das Bit B5 im 4094-Schieberegister für Q8.

Und: das SWAP hat auch gleich noch alle anderen Bits in die richtige Reihenfolge gebracht: alle acht Bits können mit LSR und ROL in der korrekten Folge in das Senderegister geschoben werden.

Es gibt zahlreiche Variationen solcher Reihenfolgen. Einige sind im Folgenden näher behandelt.

5.4.6 Alternatives Design: das obere Nibble auf der Außenseite

Alternatives Layout: oberes Nibble außen Dieses Layout der gedruckten Schaltung verlegt das obere Halbbyte (Nibble) auf die Außenseite des 4094. Das verändert natürlich die Pin-Zuordnung der oberen vier LEDs zu den Anschlüssen Q5 bis Q8 des 4094.

Nun ist Q8 tatsächlich die L8, und Q7 ist L7, etc., bis L5. Die Bits aus den acht rTn-Registern können nun in der richtigen Reihenfolge mit ROL in das Carry und von dort in das Senderegister geschoben werden.

Nur bei den unteren Bits der rTn-Register ist die Reihenfolge umgekehrt: zuerst muss für Q4 das Bit für L1 gesendet werden. Und das geht wieder mit SWAP: beim Vertauschen des oberen und unteren Nibbles im Register rTn gelangt B1 an den rechten Rand des Registers und kann mit LSR in das Carry geschoben werden.

Bei diesem Design sind zwei Schlaifen zu je vier Bits nötig, dazwischen ein SWAP.

5.4.7 Alternatives Design: Alle Pins in korrekter Reienfolge

Alle Bits in der korrekten Reihenfolge Dieses Design setzt die Bits schon von vornherein in die korrekte Reihenfolge. Damit die Leiterbahnen nicht so arg krumm werden, ist der 4094 vertikal und ohne Winkel platziert. Wegen der korrekten Reihenfolge braucht man nur acht Mal LSL und die Bits trudeln in der richtigen Reihenfolge im Senderegister ein.

Das vereinfacht zwar das Senden, weil kein SWAP erforderlich ist. Aber das Design ist auch nicht viel einfacher, weil die Kontrollbits CLK und STB nun oben liegen. Die nachfolgenden Designs vermeiden das und drehen den 4094 um 180 Grad. Natürlich hat das auch Folgen für die Bitschieberei beim Senden.

5.4.8 Alternatives Design: der 4094 umgedreht

4094 umgedreht, beide Nibble aussen Das ist der 4094 um 180 Grad verdreht und beide Nibble nach außen verdrahtet. Das hat nun folgende Vorteile: Das macht einen aufgeräumten ersten Eindruck, ist aber beim Senden etwas aufwändiger. Hier beginnt es mit einem SWAP, gefolgt von vier LSL. Dann erfolgt ein weiterer SWAP und weitere vier LSR.

Insgesamt die aufwändigste aller Varianten. Allerdings sind acht SWAPs nun auch nicht gerade Performance-Bremser, da sie bei 32,768kHz Takt mit 244µs doch recht flott vonstatten gehen. Auch zweifach ist das noch unter einer Millisekunde. Nur Programmiersprachen, die gar kein SWAP kennen, sind hier klar im Nachteil.

5.4.9 Alternatives Design: der 4094 umgedreht, das niedrige Nibble auf der Innenseite

4094 umgedreht, unteres Nibble innen Hier wurde das untere Nibble des 4094 auf der Innenseite verdrahtet.

Bei dieser Variante ist, wie im Defaulat-Fall, nur ein einziges SWAP nötig, die acht Bits können dann in einem Rutsch mit LSL an die richtige Stelle im 4094 geschoben werden.

5.4.10 Alternatives Design: der 4094 umgedreht und das obere Nibble innen

4094 umgedreht, oberes Nibble innen Und schließlich der Vollständigkeit halber noch eine weitere Variante im Design: das obere Nibble innen und das untere Nibble außen verdrahtet.

Das ist nun wieder ganz einfach, denn die Reihenfolge der LEDs ist nun einfach perfekt umgedreht. Daher kommen wir einfach mit acht Malen LSR und ganz ohne SWAPS aus.

Man erkennt an diesen alternativen Layouts, dass man alle Varianten mit LSR/LSL und die meisten noch mit einem oder zwei SWAPs schon in die richtige Reihenfolge kriegt. Das etwas eigenwillige Design der Pins beim 4094 kriegt man so auf jeden Fall leicht in den Griff: nein, man muss die Bits nicht mühsam einzeln zusammensammeln, wie das ein Hochsprachler wahrscheinlich so täte, weil ihm LSL/LSR und SWAP so nicht zur Verfügung stehen..

Seitenanfang Hardware Aufbau Betrieb Software
Niedrigstrom Hochstrom Taktung Gedruckte Schaltung Teileliste Assembler-Quellcode Wie es funktioniert

5.5 Die Bits der Spielwiese im Einstellmodus

Die Spielwiese außerhalb des Einstellmodus ist recht einfach gestrickt: ist das zweitniedrigste Sekundenbit Eins, dann einfach die Stunden mit einem EXOR umkehren, ist das niedrigste Sekundenbit Eins, dann einfach die Minuten mit einem EXOR umkehren (jeweils mit dem Makro SetBit 0. Und danach die Sekunden in jedem Fall anmachen (mit dem Makro SetBit 1. Und dann noch die AM/PM- und die Weck-LED dazu und ab dafür an die 4094s.

Im Einstellmodus ist das alles anders: hier gibt nicht die Sekundenmimik den Rhythmus an, sondern der AD-Wandler. Wird der Einstellmodus begonnen, dann wird der AD-Wandler auf den ADC0 eingestellt, mit der Betriebsspannung des AD-Wandlers als Referenzspannung, und mit dem Autostart (automatischer Neustart der Wandlung nach dem Abholen des Ergebnisses. Sein Interrupt-Enable wird dauerhaft eingeschaltet und erst beim Verlassen des Einstellmodus wieder abgeschaltet.

Das Timing des AD-Wandlers ist im Blatt "adc" in der Libre-Office-Calc-Datei uhr60-4.ods zusammengestellt.

Damit die Mimik sowohl bei 32,768kHz als auch bei 20 MHz noch funktioniert, sind drei Bremsen eingebaut:
  1. Die erste Bremse ist der AD-Wandler-Vorteiler: er arbeitet bei 32kHz mit zwei, bei 1 MHz mit 8, ab 2 bis unter 4 MHz mit 16, ab 4 bis unter 8 MHz mit 32, ab 8 bis unter 16 MHz mit 64 und ab 16 MHz mit 128. Das gibt schon mal umso weniger AD-Wandler-Ergebnisse je höher die Taktfrequenz ist.
  2. Nur wirksam bei Taktfrequenzen von mehr als 32kHz wird ein zusätzlicher Teiler durch acht, der einfach keine Neuausgabe vollführt.
  3. Eine weitere Bremse, die bei allen Taktfrequenzen eingebaut ist, ist die Summenbildung aus 256 Einzelmessungen. Das ergibt bei der Summierung von 256 Einzelmessungen mit 8 Bit Auflösung (Bit ADLAR = 1) eine 16-Bit-Summe, die weiterverarbeitet wird.
Mit allen genannten Bremsen dauert dieses Aufsammeln etwa 200 Millisekunden, ein annehmbarer Zeitraum für das Erneuern der Anzeige.

Vier Bits im Flaggenregister rFlag sind im Einstellmodus entscheidend:
  1. bAdj: Dieses Bit ist Eins, solange der Einstellmodus aktiv ist. Dies schaltet die Zeitausgabe ab und die Einstellausgabe an. Es wird abgeschaltet, wenn die Taste T1 (der PCINT10) bei gestztem Stunden-Einstellbit gedrückt wird (Abbruch) oder wenn die Taste T2 (der PCINT9) bei gelöschten Stunden- und Minuten-Einstellbits gedrückt wird und das Ergebnis der Einstellung feststeht und gesetzt ist.
  2. bAlrm: Ist dieses Bit Eins, dann wird die Weckzeit eingestellt, bei Null wird die Uhrzeit eingestellt. Es wird gesetzt oder gelöscht, wenn der Weck-Schalter betätigt wird (der PCINT0).
  3. bAdjHr: Ist dieses Bit Eins, dann werden die Stunden eingestellt, bei Null die Minuten oder Sekunden. Es wird gesetzt bei Beginn des Einstellmodus oder beim Betätigen von Taste T1 (bei PCINT10), wenn die Minuten-Einstellflagge gesetzt ist. Es wird gelöscht, wenn die Taste T2 (bei PCINT9) gedrückt wird.
  4. bAdjMin: Ist das Stundenbit Null, dann werden bei Eins die Minuten eingestellt, bei Null die Sekunden oder, wenn das Alarm-Bit gesetzt ist, die Melodienummer.
Die weitere Verarbeitung des 16-Bit-ADC-Resultats (Summe aus 256 8-Bit-Messungen) hängt von diesen Bits ab:
  1. bAdjHr = 1: Das MSB der Summe wird mit 24 malgenommen. Ist das MSB des Ergebnisses größer oder gleich 12, werden diese abgezogen und, falls das niedrigste Sekundenbit Eins ist, die PM-LED eingeschaltet (alternativ: die AM-LED). Andernfalls wird die Zahl mit fünf multipliziert und das sich ergebende Bit mit EXOR umgekehrt. (Makro SetBit 0). Zum Schluss wird noch die aktuelle Stunde der Uhrzeit (minus 12, falls nachmittags, mal fünf) dauerhaft und in jedem Fall gesetzt (Makro SetBit 1).
  2. bAdjHr = 0, bAdjMin = 1: Das MSB der Summe wird mit 60 malgenommen. Das MSB des Ergebnisses wird, falls das niedrigste Sekundenbit Eins ist, mit SetBit 0 auf die Anzeige gebracht. Dann werden die Minuten der aktuellen Uhrzeit mit SetBit 1 eingeschaltet.
  3. bAdjHr = 0, bAdjMin = 0: Falls bAlrm gesetzt ist, wird das MSB der Summe mit der Anzahl geseicherter Melodien multipliziert, falls nicht mit 60. Das Ergebnis wird, falls das niedrigste Sekundenbit Eins ist, mit SetBit 0 auf die Anzaige gebracht. Danach wird entweder die aktuell eingestellte Melodienummer oder die aktuellen Sekunden der Uhrzeit mit SetBit 1 eingeschaltet.
In allen drei Fällen wird das Ergebnis im Zwischenspeicher im SRAM abgelegt. Alle weiteren Vorgänge werden mit den beiden Tasten im PCINT10 und PCINT9 erledigt.

Seitenanfang Hardware Aufbau Betrieb Software
Niedrigstrom Hochstrom Taktung Gedruckte Schaltung Teileliste Assembler-Quellcode Wie es funktioniert

5.6 Wie es funktioniert: Tasten und Schalter

Alle Tasten- und Schalterereignisse werden mittels PCINTs verarbeitet. Die Masken PCINT0 beim PCIO0 sowie PCINT10 und PCINT9 beim PCIO1 sind gesetzt.

Der Weck-Schalter ist am Portpin PB0 (PCINT0) angeschlossen, sein Pull-Up-Widerstand ist eingeschaltet. Die Interrupt-Service-Routine PCIO0 legt eine Kopie der derzeitigen Schalterstellung in der Flagge bAlrm ab.

Die Interrupt-Service-Routine PCIO1 fragt den Zustand an den Pins PC2 (PCINT10) und PC1 (PCINT9) ab. Ist der Einstellmodus in der Flagge bAdj inaktiv (Null), dann bewirkt ein Low am PC2-Eingang, dass
  1. die Einstellflaggen bAdj, bAdjHr und bAdjMin gesetzt werden,
  2. der ADC mit den oben genannten Parametern gestartet wird.
Falls der Einstellmodus aktiv ist, dann bewirkt ein Low an PC2 folgendes:
  1. Falls die Flagge bAdjHr gesetzt ist, werden die Flaggen bAdj, und bAdjMin ausgeschaltet, und
  2. der ADC wird ausgeschaltet.
Ein Low am PC1 (PCINT9) bewirkt bei ausgeschaltetem Einstellmodus und bei eingeschaltetem Weckmodus, dass die Weckzeit um fünf Minuten verlängert wird. Das betrifft die Weckzeit in dem Register rMinA sowie erforderlichenfalls im Register rHrA, die Original-Weckzeit im SRAM sMinA und sHrA wird davon nicht tangiert.

Bei eingeschaltetem Einstellmodus bewirkt ein Low am PC1 Folgendes:
  1. bAdjHr = 1: Der aktuell gespeicherte Stundenwert wird gespeichert, und bAdjHr wird Null gesetzt,
  2. aAdjHr = 0, bAdjMin = 1: Der aktuell gespeicherte Minutenwert wird gespeichert, und bAdjMin wird Null gesetzt,
  3. bAdjHr = 0, bAdjMin = 0: Der aktuell gespeicherte Sekunden/Melodiennummer wird gespeichert, die gespeicherten Ergebnisse in die Uhrzeit bzw. in die Weckzeit und die Melodienummer geschrieben, die Flaggenbits rAdj, rAdjHr, rAdjMin gelöscht und der ADC abgeschaltet.
Seitenanfang Hardware Aufbau Betrieb Software
Niedrigstrom Hochstrom Taktung Gedruckte Schaltung Teileliste Assembler-Quellcode Wie es funktioniert

5.7 Wie es funktioniert: Musik und Melodien

5.7.1 Musiknoten

Mit Takten ab 1 MHz sind bei zu 63 verschiedene Musiknoten verfügbar, bei 32kHz wegen der niedrigen Erzeugungsfrequenz nur die untersten 45 Musiknoten. Die Benennungen der Musiknoten beginnt mit dem Buchstaben n für Noten, gefolgt vom Tonbuchstaben der Oktave, also A, H, C, D, E, F und G, und der Oktave, die von 0 bis 9 (bei 32kHz: 6) reicht.

Allen Notensymbolen sind Konstanten zwischen 1 und 63 (32 kHz: 45) zugeordnet. Die Note 0 oder cPause bewirkt, dass die Tonausgabe ausgeschaltet wird (stumme Pause). Die Note 255 oder 0xFF bewirkt, dass das Musikstück an dieser Stelle endet. Falls sich die Uhr im Einstellmodus befindet und Wecken eingeschaltet ist sowie die beiden Flaggen mit bAdjHr = 0 und bAdjMin = 0 ausgeschaltet sind, wird automatisch die mit dem Poti eingestellte Melodie abgespielt. Andernfalls wird die Tonausgabe über TC1 abgeschaltet und wird erst wieder beim erneuten Wecken aktiviert.

Die Libre-Office-Calc-Dateil uhr60-4.ods enthält im Blatt "musiknoten" ein Berechnungsmodell für die Musiknoten. Das Blatt funktioniert für alle im Blatt "quarze" angebotenen Quarzfrequenzen. Es berechnet für alle Musiknoten
  1. das Notenkürzel,
  2. die Sollfrequenz in Hz,
  3. wo notwendig den Vorteiler (1 oder 8),
  4. den im OCR1A einzustellenden CTC-Wert,
  5. die sich ergebende Ist-Frequenz, und
  6. die Abweichung der Ist-Frequenz von der Sollfrequenz in %, und
  7. die Anzahl CTC-Durchläufe für eine Sekunde Dauer (= 2 * Frequenz).
In Zelle D4 ist diejenige Note angeführt, ab der der Vorteiler von 8 auf 1 wechselt (ist nur bei erhöhten Frequenzen oberhalb von 3,2768 MHz notwendig).

In den beiden Spalten danach sind alle Noten in Assembler-Quelltext übersetzt. Die Tabelle Noten: enthält alle Notenkonstanten, die Tabelle Notentabelle: enthält für alle Noten die einzustellenden CTC-Werte und die Dauer in CTC-Durchgängen pro Sekunde. Beide Tabellen können (einzeln) markiert, kopiert und in den Quellcode eingefügt werden. Die Konstante nPresc8, die ebenfalls zu der zweiten Tabelle gehört, bewirkt im Quelltext, dass der Vorteiler automatisch auf 8 gesetzt wird, wenn die Note das nötig macht.

Bitte bei der Verwendung beachten, dass bei 32 kHz Noten der sechsten Oktav ziemlich unsauber sind, weil sie schon recht stark vom Sollwert entfernt liegen. Bitte diese Oktave beim Musikstückeln, wenn möglich, vermeiden.

5.7.2 Melodien

Per Default enthält der Assembler-Quellcode acht Melodien. Bitte die Melodiensammlung beachten um zu sehen, wie diese Melodien kodiert sind.

Jeder Tone besteht aus zwei Bytes: das erste Byte kodiert die Notennummer (nTN), das zweite Byte gibt deren Dauer an. Dauern sind Vielfache einer 16-tel Sekunde. Die Standardpause zwischen Tönen ist vier Sechzehntel Sekunden lang, das kriegt man mit .db 0,4 exakt so hin. Die Maximaldauer ist 16 Sekunden, bei den höchsten Tönen auch etwas weniger.

Melodien sind folgendermaßen kodiert:

MelodyN:
  .db nC2,1,nD2,2,nE2,4,nF2,8,nG2,16 ; Ohne Pausen
  .db nC3,1,0,4,nD3,2,0,4,nE3,4,0,4,nF3,8,0,4,nG3,8,0,4 ; Mit Standard-Pausen
  .db 0xFF,0xFF ; Ende der Melodie



Seitenanfang Hardware Aufbau Betrieb Software
Niedrigstrom Hochstrom Taktung Gedruckte Schaltung Teileliste Assembler-Quellcode Wie es funktioniert

5.7.3 Wie es funktioniert: die Musikabspiel-Software

Die Software, um diese Melodien abzuspielen, funktioniert folgendermaßen.

, Das Y-Registerpaar zeigt auf die nächste zu spielende Note der Melodie. Der Timer/Counter TC1 vollführt den gesamten Ablauf. Wenn der Ton eingeschaltet ist, torkelt TC1 den OC1A-Pin, wenn er aus ist dann setzt er OC1A zurück. Um einen Ton oder eine Pause zu spielen, ist der TC1 im CTC-Modus, mit Coompare A als frequenzbestimmende Größe. Bei jedem Compare-Match wird der Compare-Match-A-Interrupt ausgeführt.

Jeder Ton, der einen Eintrag in der Notentabelle Noten: hat, hat auch einen Eintrag in der Notentabelle Notentabelle:. Diese enthält zwei Worte pro Ton:
  1. Das erste Wort gibt den CTC-Wert an, der in das Compare-A-Doppelregister gehört.
  2. Das zweite Wort gibt die Anzahl an CTC-Durchläufen an, die der Ton für eine Sekunde Dauer absolvieren muss.
Die Ausgabe einer Melodie wird mit dem Makro StartMelody gestartet. Dieses Makro
  1. liest die aktuelle Melodienummer im Register rMel, multipliziert diese mit zwei und addiert dies zum Beginn der Melodientabelle. Die zwei Bytes, die der Eintrag hat, werden in das Registerpaar Y eingelesen, Y zeigt nun auf den ersten Noteneintrag dieser Melodie,
  2. schaltet den OC1A-Ausgang auf Clear (Lautsprecherausgang aus), lädt eine niedrige Zahl in das Vergleichsregister A, setzt das Dauerregister im Registerpaar X auf 1, schaltet den Compare-Match-A-Interrupt aktiv und startet den TC1 als CTC-Zähler.
Alles weitere passiert dann in der TC1-Compare-Match-A-Interrupt-Routine. Diese
  1. vermindert den Dauerzähler im Registerpaar X,ist dieser nicht Null, ist die Service-Routine schon fertig und der Ton oder die Pause wird weiter abgespielt,
  2. wenn X Null erreicht, dann liest er das nächste Notenbyte, auf das Y zeigt, ist dieses Byte ein 0xFF, dann ist die Melodie zu Ende, der OCR1A-Ausgang wird auf CLEAR gestellt und der Timer-Interrupt ausgeschaltet,
  3. ist der Ton nicht 0xFF, wird geprüft, ob das nächste Notenbyte Null ist (stumme Pause). Falls ja, wird OC1A auf CLEAR, falls nicht wird es auf Torkeln eingestellt,
  4. dann wird noch das Dauermultiplikator-Byte aus der Melodie eingelesen,
  5. die Notennummer wird dann mit vier multipliziert und zur Basis der Notentabelle addiert. Die beiden Bytes an dieser Adresse werden eingelesen und in der richtigen Reihenfolge (High-Byte zuerst) in das TC1-Vergleichsregister A geschrieben,
  6. danach werden die beiden Bytes der Sekundendauer in das Registerpaar X eingelesen, dieses wird dann durch 16 geteilt und die vier rechts herausfallenden Bits werden zur Vermeidung von Rundungsfehlern in ein Zwischenregister abgelegt, diese drei Bytes werden kopiert und nun so oft zur Dauer in X hinzuaddiert, wie es im Dauer-Multiplikator angegeben ist, das untere Byte dient dabei lediglich als Übertrags-Byte und zur Rundungsfehler-Vermeidung beim Addieren. Abschließend wird noch das Bit 0 in XL gelöscht, damit immer eine runde Anzahl Nulldurchgänge herauskommt und der Lautsprecherausgang aus ist.
Damit ist die nächste Tonausgabe komplett und dem Abspielen der Melodie steht nichts mehr im Weg herum.

Der Ton C2 wird fuer 1/16-tel Sekunden lang gespielt Daran anschliessend der Ton D2 fuer 2/16-tel Sekunden Das sind die ersten zwei Töne aus dem obigen Beispiel: links der Ton C2, rechts daran anschließend der Ton D2. Die Dauer ist mit 1/16-tel für C2 auf 62,5 Millisekunden, für D2 auf 125 Millisekunden eingestellt. Wie die beiden Diagramme zeigen, stimmen diese Zeiten. Natürlich werden die Tonhöhen beider Töne nicht genau getroffen, aber das wussten wir schon beim Berechnen der CTC-Werte der Töne. Die Abweichungen dürften aber für normale, durchschnittliche Hörer nicht zu erkennen sein.

Daran anschliessend der Ton E2 mit 4/16-tel Sekunden Dauer Daran anschliessend der Ton F2 mit 8/16-tel Sekunden Das kann man nun so fortsetzen.

Und daran anschliessend der Ton G2 mit einer halben Sekunde Dauer Bis auch der fünfte Ton der Reihe in einer Sekunde vollständig abgespielt ist.

Der Ton C3 mit 1/16-tel Sekunden Dauer Daran anschliessend der Ton D3 mit 2/16-tel Sekunden Das Ganze jetzt mit einer Oktave höher und mit einer Viertel-Note Pause dazwischen.

Daran anschliessend der Ton E3 mit 4/16-tel Sekunden Dauer Und anschliessend der Ton F3 mit 8/16-tel Sekunden Folgen noch die Töne E3 und F3, jeweils mit einer Viertel-Note Pause dazwischen.

Und abschliessend auch der Ton G3 mit einer halben Sekunde Dauer Und nun alles komplett. Mit einer Gesamtdauer von 1/16-tel, 2/16-teil, 4/16-tel, 8/16-teil plus 8/16-tel und vier Pausen zu je 4/16-tel kommen wir auf insgesamt 39/16-tel, was 2,4375 s entspricht. Auch diese Dauer ist offenkundig korrekt.


Seitenanfang Hardware Aufbau Betrieb Software
Niedrigstrom Hochstrom Taktung Gedruckte Schaltung Teileliste Assembler-Quellcode Wie es funktioniert



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