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

Zirkular-LED mit ATmega324PA

32 rote Leuchtdioden sind in einem Kreis mit einem Durchmesser von 75 mm angeordnet. Jede Leuchtdiode ist über einen Vorwiderstand an die 32 Port-Ausgänge eines ATmega324PA angeschlossen und kann einzeln ein- und ausgeschaltet werden.

1 Eigenschaften

Fertig aufgebaute Uhr

Diese nette kleine Spielerei kann auf zweierlei Weise genutzt werden:
  1. als programmierbares kreisförmiges Lichtband: beginnend von links bewegen sich eine, zwei, drei oder vier gleichzeitig angeschaltete Leuchtdioden im Uhrzeigersinn oder entgegen des Uhrzeigersinns im Kreis herum, die Abläufe und ihre Geschwindigkeit und Richtung können in einer nahezu beliebig langen Tabelle kombiniert werden und wiederholen sich endlos,
  2. als Uhr: beginnend mit der oberen LED und dann im Uhrzeigersinn sind maximal drei Leuchtdioden angeschaltet: die Sekundendiode bewegt sich von Null bis zum aktuellen Sekundenstand schnell vorwärts (Rundenzeit ca. zwei Sekunden), die Minuten- und Stunden-LED stehen.
Es sind viele Varianten möglich:

Inhalt

Alle Zeichnungen dieses Projekts sind in der LibreOffice-Draw-Datei hier enthalten (einschließlich Leiterplatte und Bestückungsplan), alle beiden Flussdiagramme sind in hier verfügbar, alle Rechentabellen in der LibreOffice-Calc-Datei hier.

2 Hardware

Die Hardware beider Anwendungsvarianten ist im Wesentlichen die gleiche. Die Uhr braucht noch zusätzlich einen Quarz und zwei Keramikkondensatoren.

2.1 Hardware des Lichtbands

Schaltbild der Zirkular-LED-Schaltung Dies hier ist das etwas langweilige Schaltbild der Zirkular-LED. Die Anordnung und Verdrahtung der LEDs vereinfacht das Layout der Schaltung, braucht aber etwas mehr an Aufmerksamkeit auf der Software-Seite: die Bits der drei Ports C, D und B sind etwas anders nummeriert als bei Port A, was bei der Schieberichtung berücksichtigt werden muss.

Den 6-poligen ISP-Wannenstecker braucht man nur, wenn man den Controller darüber in der fertig aufgebauten Schaltung programmieren möchte oder wenn man die Betriebsspannung aus einem Programmiergerät darüber zuführen möchte.

Varianten

Wer unbedingt mehr als nur acht der 32 LEDs gleichzeitig anschalten möchte, nimmt als LEDs Niedrigstrom-LEDs, z. B. mit 2 mA, vergrößert die Widerstände von 82 Ω auf 560 Ω (bei 3 V Betriebsspannung) und kann dann bequem alle 32 LEDs auf einmal einschalten, ohne die Stromgrenze von 200 mA des Controllers zu überreizen. Das Gleiche kann man machen, wenn man die Schaltung aus Batterien oder Akkus betreiben will.

2.2 Hardware der Uhr

Die Uhr braucht die gleiche Hardware, nur müssen der Quarz und die beiden 22-pF-Keramikkondensatoren bestückt sein. Damit die Uhr genau geht, muss sie aus diesem Quarz getaktet werden.

Geeignete Quarze fuer die Uhr Standardmäßig habe ich in der Software einen Quarz mit 2,097152 MHz voreingestellt. Dieser kann sowohl mit einem 8-Bit-TC als auch mit einem 16-Bit-TC einen korrekten Takt für die Uhr erzeugen. Die Software verwendet in der vorliegenden Version einen 16-Bit-TC.

Das Bild zeigt für alle handelsüblichen Quarze an, ob sie sich hier eignen. Wie man sieht, bietet die Version mit einem 16-Bit-TC die meisten Möglichkeiten. Bei der Auswahl ist noch zu beachten, dass Quarze oberhalb von 10 MHz nur mit 5 V Betriebsspannung funktionieren. Aber so hohe Frequenzen werden ohnehin gar nicht benötigt. Schaltung und Software funktionieren mit ganz niedrigen Frequenzen genauso gut, sogar mit einem Uhrenquarz von nur 32,768 kHz. Allerdings muss dann das Programmiergerät mit weniger als 8 kHz takten können.

Im Falle des 8-Bit-TC habe ich noch zusätzlich den Taktvorteiler CLKPR vorgesehen, damit der TC-Takt bei erhöhten Frequenzen unter 256 bleibt. Wie man sieht, macht auch das keinen der höherfrequenten Quarze geeigneter.

Wer einen anderen Quarz als den hier vorgeschlagenen verwenden will, findet im Rechenblatt "clockxtals" in der LibreOffice-Calc- Datei hier die Möglichkeit, auch andere handelsübliche Quarze auf ihre Eignung hin zu untersuchen. Geeignet sind alle Quarze, die bei der Teilung ganzzahlige Teilerverhältnisse ergeben.

Mit dem Ausklappfeld in Zelle B3 kann man aus allen Quarzen einen geeigneten auswählen. Falls dieser sich entweder für den 16-Bit-TC oder den 8-Bit-TC eignet, werden Vorteiler und CTC-Teiler als Konstanten für den Export in den Quellcode bereitgestellt. Dazu einfach die fünf Zellen markieren, mit Strg-C ab in die Zwischenablage und, nach Markieren der betreffenden alten Quellcode-Zeilen, mit Strg-V diese überschreiben. Dann natürlich neu assemblieren und den Hexcode in das Flash übertragen.

LED-Stroeme bei verschiedenen Spannungen und Widerstaenden Die Tabelle zeigt die LED-Ströme, die sich aus der Auswahl der LED-Widerstände bei verschiedenen Betriebsspannungen ergeben. Aufgelistet sind die Betriebsspannungen 3,0 V (2 * AA- oder AAA-Batterie), 3,3 V (Betrieb aus ISP6 oder Netzteil), 3,6 V (3*AA- oder AAA-Akku), 4,5 V (3 * AA- oder AAA-Batterie) und 4,8 V (4 * AA- oder AAA-Akku). Als Obergrenze bei einer Netzteilversorgung von 5 V ist noch die obere Toleranzgrenze aufgelistet.

Die Berechnung der Ströme ist nicht ganz trivial, da vom LED-Strom abhängig sind. Die Berechnung erfolgt im Tabellenblatt "LED-strom-5mm" mittels zehn Näherungen für jeden Widerstand und für jede Betriebsspannung. Dabei hat sich herausgestellt, dass die Näherungen für 47Ω nicht und für 82Ω nur bei höheren Betriebsspannungen konvergieren. Die Zahlenwerte für beide Widerstände können daher ungenau sein.

Bei allen Widerständen ab 82Ω aufwärts ist der gesamte Betriebsspannungsbereich im zulässigen LED-Strom-Bereich. Allerdings kann es bei Strömen über 20 mA zu Problemen beim Programmieren kommen, wenn das Programmiergerät nicht den nötigen Strom verträgt.

Am realen Objekt habe ich bei 3,125 V Betriebsspannung und bei 82Ω einen LED-Strom von 10,6 mA gemessen, die in der Tabelle angegebenen Werte sind daher etwas zu niedrig angesetzt.

Rot hinterlegte Zellen signalisieren, dass hierfür nur Niedrigstrom-LEDs infrage kommen.

3-mm-LEDs mit 2 mA 3-mm-LEDs mit nominell 2-mA Betriebsstrom haben eine etwas andere Strom/Spannungs-Kennlinie mit niedrigeren Durchlassspannungen. Hier sind solche LEDs gerechnet. Sie benötigen etwas höhere Widerstände als die Standard-5mm-LEDs.

Seitenanfang Hardware Aufbau Software
Lichtband Uhr Netzteil Gedruckte Schaltung Bestückung Stückliste Lichtband Uhr

2.3 Netzteil

Das Netzteil gibt es in zwei Varianten: zuerst die Schaltung für maximal vier normale LEDs (wie z. B. für die Uhr), unten für den Maximalstrom von 200 mA, den der ATmega324PA unter Einhaltung seiner Spezifikation verarbeiten kann.

Netzteil 0,5VA berechnet Netzteil für maximal 4 LEDs Das kleine Netzteil kann bis zu 80 mA LED-Strom liefern, der Strombedarf des Prozessors fällt gegenüber dem LED-Strom unter "ferner liefen" (ca. 0,5 mA).

Netzteil fuer 4 LEDs

Netzteil 1,5VA berechnet Netzteil für maximal 200 mA Die Version mit 200 mA reicht für zehn LEDs mit 20 mA oder für alle 32 gleichzeitig mit Niedrigstrom-LEDs (max. 6,25 mA pro LED).

Netzteil 200 mA So aufgebaut auf einem Stück Lochrasterplatine, kompakt und fertig zum Einsatz.
Seitenanfang Hardware Aufbau Software
Lichtband Uhr Netzteil Gedruckte Schaltung Bestückung Stückliste Lichtband Uhr

3 Aufbau

Für beide Varianten (Leuchtkreis und Uhr) wurde eine gedruckte Schaltung entwickelt, da die Platzierung der LEDs im Kreis auf einer Lochraster-Platine ungenau ist.

3.1 Gedruckte Schaltungen

3.1.1 Gedruckte Schaltung kreisrunde Version

Gedruckte Schaltung fuer das Lauflicht/die Uhr Die ist die Vorlage für die gedruckte Platine von 80*80 mm im .gif-Format. Die Platine ist einseitig Kupfer-kaschiert.

Wer es hoch-aufgelöster braucht, klickt mit der rechten Maustaste auf die Zeichnung und wählt "Ziel speichern unter" oder kann sich aus der Zeichendatei (Link siehe oben) eine noch höher aufgelöste Kopie als gif- oder png-Datei erstellen und diese (z. B. mit IrfanView) maßstabsgerecht ausdrucken.
Bestückung kreisrunde Version
Bestueckungsplan Zirkular-LED So werden die Bauteile auf der Platine platziert. Alle Bohrungen bis auf die vier Löcher für die Befestigungsschrauben (2,5 oder 3 mm), die sechs Löcher für den Wannenstecker und die beiden Schraubklemmen-Anschlüsse (1 mm) sind 0,8 mm weit.

Wer den Controller mit der ISP6-Schnittstelle programmieren möchte, muss noch die drei Anschlüsse SCK, MISO und MOSI mit lötbaren, lackisolierten Drähten von den Prozessor-Pins zum ISP6-Stecker verdrahten.

Wer weder den Controller programmieren möchte noch die Schaltung über den ISP6-Stecker mit Strom versorgen möchte, kann auf den Einbau des Wannensteckers auch ganz verzichten.

Wer nur das Lichtband nutzen möchte, aber keine Uhr braucht, kann den Quarz und die beiden 22-pF-Kondensatoren weglassen. In diesem Fall läuft der Prozessor mit dem internen RC-Generator und mit 1 MHz Takt. Dies ist in der Software auch so eingestellt.

3.1.2 Gedruckte Schaltung quadratische Version

Rechteckiges Layout Wer es nicht rund sondern lieber quadratisch mag, nimmt dieses Layout. Auch hier gibt es beim Rechtsklick und mit "Ziel speichern unter" eine vergrößerte Version. Den Bestückungsplan spare ich mir: alle Bauteile sind diesselben, nur ein wenig anders angeordnet. Die Software funktioniert genauso, nur beginnen die LED-Nummerierungen nun in der Mitte der linken Kante.

3.1.3 Gedruckte Schaltung Kleinstversion

Gedruckte Schaltung fuer die Minimalversion Um den Reigen noch zu erweitern, gibt es auch eine Minimalversion. Die ist auf 3mm-LEDs ausgelegt, damit sie schön klein wird. Hier nimmt der Prozessor ein Drittel, die Widerstände und die LEDs zwei Drittel der Platine ein. Auch hier gibt wieder mit rechter Maustaste und "Ziel speichern unter" eine vergrößerte Version der Zeichnung.
Bestückungsplan für die Kleinstversion
Gedruckte Schaltung fuer die Minimalversion Da die Bauteile hier ein wenig anders platziert sind, gibt es dafür auch einen Bestückungsplan. Wie man sieht, wurde auf den Quarz und die beiden Keramikkondensatoren verzichtet und die Stromversorgung und die ISP6-Schnittstelle verlegt. Die Widerstände stehen (bis auf einen) nun aufrecht. Die Platine ist dadurch jetzt nur noch 65x50 mm groß.

Eine Brücke ist zu verbinden und die MOSI-Leitung von der ISP6-Schnittstelle ist noch manuell zu verbinden, falls der Prozessor in der Schaltung programmiert werden soll.

Kleinstversion mit 32 3-mm-LEDs Hier das Ganze mit 2mA-LEDs und 470Ω-Widerständen für den Batteriebetrieb.

Das Ganze ist jetzt schnuckelig klein und kann mit Batterien oder mit einem kleinen Netzteil verschenkt werden.

Seitenanfang Hardware Aufbau Software
Lichtband Uhr Netzteil Gedruckte Schaltung Bestückung Stückliste Lichtband Uhr

3.2 Stückliste

Stueckliste fuer Leuchtband und Uhr Dies ist die komplette Stückliste für beide Varianten plus die beiden Netzteil-Varianten. Die Bestellbezeichnungen und die Preise sind für Reichelt, die angegebenen Preise sind vom 12.10.2021.

Der Controller und die 32 LEDs bestimmen im Wesentlichen den Gesamtpreis. Wer sein Teil mit Akkus oder Batterien betreiben möchte kann statt der Standard-LEDs etwas teurere Niedrigstrom-LEDs verwenden.

Mit Netzteil ist man mit 21 Euronen dabei. Es fehlt noch ein Plastikgehäuse für das Netzteil, denn ohne Gehäuse kann man das Netzteil nicht mit einem guten Gewissen verschenken. Da das Geschmackssache ist, ist es hier nicht dabei, kann aber fast so teuer werden wie der gesamte Rest aller Bauteile, wenn man ein edles Gehäuse auswählt.

Seitenanfang Hardware Aufbau Software
Lichtband Uhr Netzteil Gedruckte Schaltung Bestückung Stückliste Lichtband Uhr

3.3 Ströme aus den Netzteilen

Ströme aus der Versorgung Hier nun eine Analyse der Ströme, die das Netzteil liefern muss, um die LEDs anzutreiben.

Gemessen wurden zwei Konfigurationen:
  1. Das 3,3V-200mA-Netzteil wurde mit der Schaltung mit normalen 5-mm-LEDs, auf 20 mA Strom ausgelegt, und 82Ω Vorwiderstand kombiniert.
  2. Das 3,3V-Netzteil für 4 LEDs wurde mit der 3-mm-LED-Schaltung kombiniert, bei denen die LEDs auf 2 mA Strom ausgelegt sind.
Wie man sieht, wurden in beiden Fällen bis zu 23 LEDs gleichzeitig angeschaltet, ohne das Netzteil bis zum Letzten auszulasten. Bis auf den Fall mit dem 200mA-Netzteil und mit den 23 LEDs haben auch alle Messungen die 200mA-Grenze des ATmega324PA eingehalten. Die Überlast in diesem einen Fall hat den Controller aber auch nicht aus dem Takt gebracht.

Man sieht, dass es die Hersteller von 3,3V-Spannungsreglern mit der Einhaltung der Spannung nicht so genau nehmen. Besonders im mittleren Strombereich gehen die damit gebauten Netzteile in die Knie und liefern bis zu 0,6 V weniger als sie sollten. Bei höheren Strömen liefern sie dann wieder etwas besser, aber keines liefert 3,3 V, wie es draufsteht. Nur bei Null-Strom halten alle ihre Nominalspannung ein. Und warm werden sie auch nicht so arg, so dass das als Ursache schon mal entfällt.

Interessant sind auch die beiden Ströme mit keiner LED an. Mit 0,55 und 0,88 mA zeigen die beiden Exemplare des ATmega324PA erstaunliche Unterschiede, obwohl sich weder der Takt noch die Software unterscheiden (beide Exemplare wurden ohne aktive Interrupts gemessen).

4 Software

Die Software ist vollständig in Assembler geschrieben und gut dokumentiert, so dass eigene Ergänzungen und Änderungen leicht möglich sind.

Die Flussdiagramme sind hier als LibreOffice-Draw-Datei verfügbar.

Fazit: Batterien sind bei Weitem die besseren Spannungskonstanthalter. Und: vertraue keinem Halbleiter-Hersteller, was er darufdruckt ist nicht immer auch drin.

4.1 Software für das Lichtband

4.1.1 Download Assembler-Quellcode Lichtband

Der Assembler-Quellcode für das Lichtband kann hier heruntergeladen und hier im Browser betrachtet werden. Es werden keine Include-Dateien benötigt. Die Fuses können nicht so bleiben wie sie ab Werk gesetzt sind, sie sind zu ändern.

Seitenanfang Hardware Aufbau Software
Lichtband Uhr Netzteil Gedruckte Schaltung Bestückung Stückliste Lichtband Uhr

4.1.2 Setzen der Fuses beim Leuchtband

Fuses Original ATmega324PA Fuse-Umstellung Zirkular-LEDs Links sind die Original-Fuses des ATmega324PA abgebildet, rechts die Fuses, wie sie gesetzt werden müssen, um den Prozessor korrekt arbeiten zu lassen.

Es muss nur die JTAGEN-Fuse abgeschaltet werden, sonst funktionieren die LEDs L13 bis L16 nicht. Alle anderen Fuses können so bleiben wie sie sind.

4.1.3 Funktionsweise der Software des Lichtbands

Flussdiagramm der Compare-A-Interrupt-Service-Routine Das Leuchtband funktioniert folgendermaßen:
  1. Der Timer TC1 läuft mit einem Vorteiler von 64 und im CTC-Modus mit dem Vergleichswert in Compare-A.
  2. Ein Timer-Interrupt erfolgt beim Erreichen des Compare-A- Werts. Die Interrupt-Service-Routine schiebt den gesamten 32 Bit breiten Ausgabewert, abhängig vom Richtungs-Bit in der Flagge, entweder im Uhrzeigersinn rechts (Flagge = 0, Rechtsschieben) oder links herum (Flagge = 1, Linksschieben) und gibt die aus der Tabelle gelesenen N Kombinationen auf die vier Ports aus (Ausgabe).
  3. Sind alle 32 Schiebevorgänge durchgeführt, (rRnd wird Null), dann wird die Anzahl Wiederholungen (rRpt) vermindert. Ist diese Null, dann wird die nächste Kombination aus der Steuer-Tabelle gelesen (Neuen Tabellenwert laden). Die Steuertabelle besteht aus acht 16-Bit-Worten: die ersten zwei Worte geben den Anfangszustand an (1 = LED aus, 0 = LED an), das dritte Wort den Compare-A-Wert (je niedriger desto schneller), das vierte Wort enthält im MSB die Anzahl an Rundenanzahl und in Bit 7 die Richtungsflagge in rRpt0 (rechts = 0, links = 1), das LSB gibt die Anzahl N der zu absolvierenden Wiederholungen an (rRpt).
  4. Ist das Tabellenende erreicht, wird mit der gleichen Tabelle von vorne begonnen. Die Tabelle kann den gesamten verfügbaren Rest des Flash-Speichers verwenden (ca. 4.000 Einträge).
Man beachte bei der Tabelle, dass die LEDs der Ports C, D und B umgekehrt notiert sind, d. h. 0x7F macht das erste Bit an, während bei Port A 0xFE das erste Bit anmacht. Die Reihenfolge der Tabellenworte ist:
  1. Erstes Wort: LSB = Port A (Normal), MSB = Port C (Umgedreht),
  2. Zweites Wort: LSB = Port D (Umgedreht), MSB = Port B (Umgedreht),
  3. Drittes Wort: CTC-Vergleichswert, 1 MHz / 64 = 15,625 kHz, pro Runde sind das 488,28 Hz oder 2,048 Millisekunden,
  4. Viertes Wort: LSB = Anzahl Wiederholungen, MSB = Anzahl Schiebeschritte 1 .. 127, Bit 7 = 1 ist rückwärts schieben.
Die voreingestellte Tabelle hat folgenden Inhalt:

Table:
  .dw 0xFFFE,0xFFFF, (10000*cSecondMult+500)/1000-1, 1+32*256 ; One LED, 1 time right, round time 10 seconds
  .dw 0xFFFE,0xFFFF, (2000*cSecondMult+500)/1000-1, 20+32*256 ; One LED, 20 times right, round time half a second
  .dw 0xFFFE,0xFF7F, (1000*cSecondMult+500)/1000-1, 10+32*256 ; Two LEDs, 10 times right, round time one seconds
  .dw 0xFFFF,0xFFFF, (500*cSecondMult+500)/1000-1, 1+32*256 ; All off for half a second
  .dw 0xFFF0,0xFFFF, (100*cSecondMult+500)/1000-1, 100+(32+cLeft)*256 ; Four LEDs in a row, 100 times left, round time 0.1 seconds
  .dw 0xFFFF,0xFFFF, (2000*cSecondMult+500)/1000-1, 1+32*256 ; All off for two seconds
TableEnd:

Die Konstante cSecondMult ermöglicht es, die Dauer einer ganzen Runde in Millisekunden anzugeben. In der fünften Zeile ist ferner demonstriert, wie der Rückwärtslauf in die Runde eingeführt wird. Die Zeilen 4 und 6 zeigen, wie Pausen ohne leuchtende LEDs gemacht werden: einfach alle LED-Bits auf Eins.

Man beachte bei dem Flussdiagramm, dass alle Durchläufe der Interrupt-Service-Routine zwischen 26 und 43 Taktzyklen benötigen (die roten Zahlen sind Taktzyklen). Dies ist der Grund dafür, warum der Vorteiler von 64 gewählt wurde: selbst wenn Null als Vergleichswert eingestellt würde (entspricht einem einzigen Timer-Durchlauf) kann es nicht zu verpassten Timer-Interrupts kommen.

Seitenanfang Hardware Aufbau Software
Lichtband Uhr Netzteil Gedruckte Schaltung Bestückung Stückliste Lichtband Uhr

4.1.4 Video vom Leuchhtband

... gibt es hier in 1280 und hier in 640.

4.2 Software der Uhr

Die Software der Uhr ist ebenfalls in Assembler geschrieben.

4.2.1 Download Assembler-Quellcode Uhr

Der Assembler-Quellcode kann hier im Assembler-Format heruntergeladen und hier im Browser betrachtet werden. Zum Assemblieren sind keine weiteren Include-Dateien erforderlich.

Im Abschnitt "Adjustable const" können alle Parameter der Uhr eingestellt werden. Viele der Einstellungen können aus den Rechenblättern der LibreOffice-Calc-Datei hier kopiert werden und ersetzen dann die entsprechenden Quellcode-Zeilen.

Nach dem Assemblieren und Brennen ist noch die Fuse zu setzen, sonst läuft die Uhr zu langsam (oder viel zu schnell, wenn der Quarz nur 32,768 kHz hat).

Seitenanfang Hardware Aufbau Software
Lichtband Uhr Netzteil Gedruckte Schaltung Bestückung Stückliste Lichtband Uhr

4.2.2 Einstellung der Fuses bei der Uhr

Fuses Original ATmega324PA Fuse-Umstellung bei der Uhr Vor oder nach dem Programmieren müssen noch die Fuses des ATmega324PA auf den Quarz umgestellt werden. Links sind die Original-Fuses, rechts die umgestellten Fuses zu sehen.

Umgestellt werden müssen die JTAGEN-Fuse (sonst bleiben die LEDs L13 bis L16 dunkel), die CLKDIV8-Fuse (sonst geht die Uhr um den Faktor 8 zu langsam) und die SUT_SCKSEL-Fuses (sonst geht die Uhr um den Faktor 2 zu langsam).

Die SUT_SCKSEL-Fuses gelten für den 2,097152-MHz-Quarz. Wer lieber einen 32,768-kHz-Quarz verwendet, muss die entsprechenden Einstellungen aus der LibreOffice-Datei importieren und den Quarz auf Low-Speed umstellen.

Seitenanfang Hardware Aufbau Software
Lichtband Uhr Netzteil Gedruckte Schaltung Bestückung Stückliste Lichtband Uhr

4.2.3 Funktionsweise der Software bei der Uhr

Flussdiagramm der Uhren-Software Das Design der Software ist nicht so ganz trivial wie es die Schaltung ist, denn Die gesamte Zeitsteuerung ist daher nicht so ganz trivial und einfach.
  1. Die Sekunden-Impulse, die die Sekunden-LED bestimmen, müssen 32 Schritte in 60 Sekunden gehen. Das entspricht 32 / 60 Schritte pro Sekunde = 0,5333333 Schritte/s oder 1,875 Sekunden pro Schritt. Um eine dynamische Sekundenanzeige hinzukriegen, werden diese 1,875 Sekunden nochmals durch 32 geteilt. Bei jedem dieser Schritte von 58,59375 Millisekunden Dauer wird die aktive LED um einen weiteren Schritt verschoben, bis die derzeit aktuelle LED erreicht ist. Dann wird nicht weiter verschoben, die aktuelle Sekunden-LED bleibt dann auch für den Rest des 32-er-Zyklusses an.
  2. Die Minuten-Impulse teilen eine Stunde durch 32, so dass 32 Schritte in 60 Minuten zu absolvieren sind. Die Schrittgeschwindigkeit in Schritten pro Minute ist daher 32 / 60, in Schritten pro Sekunde 32 / 60 / 60 oder 0,0088888 oder 112,5 Sekunden pro Schritt. Bezogen auf die Sekunden-Umlaufdauer von 1,875 Sekunden sind das 60 Sekunden, bezogen auf die Schrittdauer von 58,59375 Millisekunden sind es 1.920 Einzelschritte.
  3. Die Stunden-Impulse teilen einen halben Tag durch 32, so dass 32 Schritte in 12 Stunden zu absolvieren sind. Hier fallen daher 32 Schritte in 12 * 60 * 60 Sekunden an oder 1.350 Sekunden pro Schritt. Bezogen auf die Schrittdauer von 58,59375 Millisekunden sind das 23.040 Einzelschritte.
Entsprechend ist das Flussdiagramm der TC1-Compare-A-Interrupt-Service-Routine aufgebaut. Sie wird alle 58,59 ms aufgerufen. Am Ende (unterster Teil) gibt diese Routine den Zustand der LEDs in den vier rLedN-Registern aus. Die Minuten- und die Stunden-LEDs werden mittels UND-Instruktionen mit den LED-Registern rLedN ebenfalls aktiv gesetzt. Dabei werden die Bits 2 und 4 des Rundenzählers zum Blinken benutzt: sie überspringen das UND, wenn das Rnd-Bit Null (Minute) oder Eins (Stunde) ist. Der Zustand der Minuten ist in den vier Registern rMinN bzw. rHrN enthalten: diese enthalten 31 Einsen und eine Null an der aktuellen LED-Position.

Die Minuten- und Stunden-Register werden alle 1.920 (Zähler in XH:XL) bzw. 23.040 (Zähler in YH:YL) Interrupt um Eins nach rechts geschoben. Rollt dabei eine Null heraus, wird diese Null mit AND an den Anfang der vier Register eingeschoben und die Minuten bzw. Stunden beginnen erneut.

Das Flussdiagramm beginnt mit dem Verschieben der Sekunden-LED. Diese Verschiebung der Register rLedN erfolgt nur dann, wenn der Rundenzähler in rCntRnd größer oder gleich dem Sekundenzähler in rSec ist, falls nicht bleibt diese LED an.

Erreicht der Rundenzähler rCntRnd Null, dann werden die LED-Register auf Null gestellt, der Zähler wird neu mit 32 gestartet.

Das Ende der Sekunde wird deswegen nicht zur Minuten-Erhöhung herangezogen, weil der Sekundentakt gar nicht eine Sekunde beträgt, sondern 1,875 Sekunden (siehe oben). Die Minuten und die Stunden werden daher autonom mittels der entsprechenden 16-Bit-Zähler ermittelt und sind nicht vom Sekundentakt abhängig.

Der Takt zum Schieben der Sekunden wird mit dem 8-Bit-Zäler TC0 erzeugt. Er vermindert alle 1,875 Sekunden rSec um Eins. Dazu wird er mit einem Vorteiler von 1.024 getaktet. Läuft der Zähler über, dann erfolgt der TC0-Überlauf-Interrupt. In der Service-Routine wird rSecDiv um Eins vermindert. Ist dieser Null (nach 15 Überläufen) dann sind 1,875 s um und rSec wird um Eins vermindert.

In roter Schrift sind alle Taktzyklen angegeben, die die verschiedenen Durchläufe durch die Routine benötigen. Wie man sieht werden maximal 76 Taktzyklen benötigt. Selbst bei einer Taktfrequenz von nur 32,768 kHz sind dies nur 4,0% der Zeit bis zum nächsten TC1-Interrupt. Die Soiftware kann daher auch mit diesem sehr langsamen Taktzyklus verwendet werden.

Die Anzahl der Taktzyklen spielt auch noch für den Stromverbrauch eine Rolle: außerhalb der Interrupt-Service-Routine wird der Prozessor nämlich schlafen gelegt. Bei 2 MHz Takt beträgt der Schlafanteil 99,3%, bei 32,768 kHz immerhin noch 96,1%. Der Stromverbrauch des Prozessors kann daher im Vergleich zu den LEDs vernachlässigt werden.

Die Schaltzeiten bei Minuten und Sekunden Will man die Uhr nicht bei Null beginnen lassen, sondern zu einer beliebig im Quellcode einstellbaren Zeit, dann muss man alle diese krummen Stunden- und Minuten-Zahlen korrekt berücksichtigen. Auch das ist alles andere als trivial: das Rechenblatt "clockstart" hat mich entsprechend viele Stunden Arbeit gekostet, bis es korrekt funkioniert hat.

Die Zeiten, zu denen die nächste Minuten- und Stunden-LED angeht, gehen aus diesem Diagramm hervor. n ist die Rundennummer von 0 bis 31, Minute und Hour geben für jede LED an, ab welcher Zeit diese LED an ist. Die angegebenen Bits beziehen sich auf die Portbits der LEDs in dem jeweiligen in weiß auf grün angegebenen Port. Die LED-Nummern in weiß auf rot beziehen sich auf die LED-Nummerierung im Schaltbild.

Die etwas krummen Zeiten bei den Minuten und auch bei Stunden und die auftretenden Kommazahlen machen sich dann bemerkbar, wenn die Uhr mit einer voreingestellten Zeit nach dem Reset loslaufen soll: Ist diese Startzeit z. B. 20:20 Uhr, dann geht bei den Stunden LED22 an (Bit 1 im Port B). Die nächste Stunden-LED geht erst ab 20:25 an. Die 20 Minuten machen die LED am Portpin PD5 an, die nächste LED geht erst bei 20,625 min an.

Startzeit 20:20 Im Rechenblatt "clockstart" der LibreOffice-Calc-Datei kann die Startzeit in Stunden und Minuten in die beiden grün hinterlegten Zellen eingegeben werden. Dies errechnet dann die LED-Nummer und die Portbits und gibt diese als 32-Bit-Hex-Zahl an (Alternativ: binär). Da für die Stunden und Minuten auch noch Teiletappen zu absolvieren sind, bis die nächste LED angesteuert werden muss, berechnet das Blatt auch noch die Restzeit, bis die nächste LED angeht. Diese Zahlen können direkt in den Y- und X-Zähler übernommen werden.

Konstanten-Export Die vier Konstanten können im Calc-Blatt markiert, mit Strg-C in die Zwischenablage kopiert und im Assembler-Quelltext mit Strg-V eingefügt werden. Nach dem Assemblieren und Brennen startet die Uhr mit dieser Uhrzeit.

4.2.4 Video von der Uhr

... gibt es hier in 1280 und hier in 640.

Seitenanfang Hardware Aufbau Software
Lichtband Uhr Netzteil Gedruckte Schaltung Bestückung Stückliste Lichtband Uhr


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