Pfad:
AVR-DE =>
Anwendungen => Magic circle
This page in english:
 |
Anwendungen von
AVR-Einchip-Prozessoren AT90S, ATtiny, ATmega und ATxmega
Magischer Kreis mit ATtiny2313 und LEDs
|
Magic circle mit ATtiny2313
Eine Anwendung des Controllers mit 13 PWM-gesteuerten LEDs, vorzugsweise zum
Verschenken und ins Fenster stellen.
- Eigenschaften
- Hardware
- Aufbau
- Software
LEDs ein- und Ausschalten kann jeder, das ist mit CBI und SBI primitiv. Und viele
LEDs gehen eben mit vielen CBI und SBI.
In diesem Fall geht das Einschalten mit 256 Stufen steigender Helligkeit, das
Ausschalten mit 256 Stufen abnehmender Helligkeit, sozusagen sanftes Ein- und
Ausschalten. Mit der Einstellung "FAST" gerne auch mit doppelter
und mit der Einstellung "VeryFast" gerne auch mit hektischer
vierfacher Geschwindigkeit, damit der Takt nicht langweilig und der Betrachter
nicht zum Einschlafen neigt.
Für die Helligkeitssteuerung sorgen vier PWM-Kanäle im ATtiny2313,
die die PWM-Ausgänge OCR0A, OCR0B, OCR1A und OCR1B bei jedem Durchlauf
der Zähler TC0 und TC1 torkeln lassen. Jeder Ausgang treibt zwischen zwei
und vier LEDs gleichzeitig an. Das bringt besonders die Viererausgänge
OC1B und OC0A an die Grenzen ihrer Leistungsfähigkeit und wird mit ca.
0,88 V Low-Spannung im eingeschalteten Zustand quittiert. Da jeder
LED-Anoden-Ausgang nur jeweils eine einzige LED antreiben muss, ist deren
Belastung gering (ca. 0,3 V unter Betriebsspannung).
Die Ablaufsequenzen sind in einer Tabelle abgelegt und können daher
individuell an die Bedürfnisse angepasst werden, so dass jedes Geschenk
ein Unikat ist.
2.1 Prozessorteil
Das hier ist die ganze langweilige Schalte. Jede LED wird mit einem
Vorwiderstand betrieben (in diesem Fall bei 3,3 V Betriebsspannung mit
33 Ω). Durchschnittlich beträgt der LED-Strom 7,2 mA
(zwischen 5,7 und 9,2 mA), die LED-Spannung mit roten
5 mm-Standard-LEDs 2,0 V.
Mit auf der Platine ist noch der ISP6-Anschlussstecker, der die Programmierung
in der fertigen Schaltung ermöglicht. Die Doppelbelegung der drei Pins
ist unschädlich, da der OC-Ausgang im Programmierfall inaktiv ist und
die Verkoppelung der drei Programmierpins mit jeweils 33 Ω
eigentlich unschädlich ist. Bei der Programmierung hat sich allerdings
herausgestellt, dass das Programmiergerät AVR-ISP-MkII bei 3 V
Batteriespannung keine Programmierung zulässt und mit einer Fehlermeldung
aussteigt. Mit einem Diamex-USB-Programmiergerät gab es hingegen keine
Probleme. Eine Abhilfe könnte es sein, die Widerstände mit drei
Jumpern beim Programmieren auszuschalten.
2.2 Netzteil
Das Netzteil wurde mit einem 2 VA-Trafo mit 2 * 7,5 V realisiert.
Als Regler wurde ein LM317 verwendet, der mit einem 10-Gang-Poti von 1k
auf 3,3 V Ausgangsspannung eingestellt werden kann.
Ein 5 V-Netzteil ginge auch, nur müssten dazu die
LED-Vorwiderstände auf 180 bis 220 Ω vergrößert
werden.
Der LM317 wird in der Schaltung mit maximal 600 mW belastet, daher
kommt er ohne oder mit nur einem kleinen Kühlkörper aus. Bei
höheren LED-Strömen reicht ein 20°C/W-Kühlkörper
aus. Bei Überlastung des Ausgangs geht als erstes der kleine Trafo
in die Knie.
Alle Kondensatoren sind mit 35 V spezifiziert, weil der Trafo bei
fehlender Last wegen des hohen Innenwiderstands von 22,7 Ω
der 7,5 V-Wicklungen auf über 16 V Leerlaufspannung
kommt. Tantalelkos nehmen auch kleinste Überspannungen übel.
Bei einem 3,5 VA-Trafo oder einer dauerhaft angeschlossenen LED
direkt am Netzteil bestünde diese Gefahr weniger oder gar nicht.
Das folgende Bild zeigt die Netzteilspannungen bei einer maximalen
Nennlast von 130 mA.
Die Software für diese Netzteilberechnung findet sich übrigens
hier.
Eine neuere Version dieser Software findet sich
hier.
3.1 Prozessorteil
Der Aufbau erfordert eine 40*40 mm große Lochrasterplatine.
Die LED-Kathoden- und -Anoden-Anschlüsse sind mit
1 mm-Lötnägeln vorgesehen. Wer die LEDs steckbar
anbringen will, muss eine 18- oder 20-polige Steckerleiste opfern.
So sieht die mit den LED verdrahtete Version aus.
3.2 Netzteil
Das Netzteil passt auf eine 50*60 mm-Lochraster-Platine. Besondere
Sorgfalt ist auf der 230 V-Seite geboten, da die Befestigungsschrauben
nahe an den Sicherungsanschlüssen sitzen und vermieden werden muss,
dass die Netzspannung nicht an den Befestigungsschrauben anliegt.
So sieht das Netzteil aus. Die Beschriftung des Trafos ist verkehrt herum,
Primär- und Sekundärseite sind vertauscht. Wahrscheinlich gab es
deshalb den Trafo billig bei Ebay.
3.3 Gehäuse
Das Ganze passt in ein kleines Plastikgehäuse L=120/B=60/H=40, das noch mit
einem Typenschild (im Open-Office-Grafikformat)
verziert, mit Gummifüßen rutschfest und mit einer Benutzanleitung
(im PDF-Format oder
im Open-Office-Writer-Format) an der/die
Beschenkte ausgeliefert wird.
4.1 Aufbau
Beim Initiieren werden alle drei verwendeten Ports A, B und D
an die LED-Anoden angeschlossen sind, mit Einsen belegt. Die
Richtungsregister der Ausgänge OC0A, OC0B, OC1A und OC1B
werden mit 1, alle Anodenausgänge mit 0 belegt (alle LED
aus). Der Zeiger Z wird auf den Beginn der Ablauftabelle gesetzt.
Beide Timer werden mit dem Vorteiler 8 gestartet und alle
OC-Ausgänge auf Torkeln eingestellt (0 oder LED an zu
Beginn des PWM-Zyklus, Torkeln bei Erreichen der Compare-Werte.
Die Software läuft nach der Initiierung rein interruptgesteuert.
Dazu wird der CompareA-Interrupt des Timer/Counters 0 verwendet, der
am Ende jedes Durchlaufs der PWM-Phase ausgelöst wird. In der
Interrupt-Service-Routine werden beide PWM-Werte A und B der beiden
Timer TC0 und TC1 auf den Wert im Register rPwm gesetzt. Dieses
Register wird anschließend erhöht (ist die Flagge bFast
gesetzt: um zwei, ist die Flagge bVeryFast gesetzt um weitere zwei).
Ist die Flagge bFall gesetzt, findet entsprechend eine Verminderung
statt.
Erreicht der Zähler rPwm den höchsten Wert, wird die Flagge
bFall gesetzt, der Zähler zählt dann abwärts. Ist die
Flagge bUpOnly gesetzt, findet diese Umkehr nicht statt. Wird beim
Abwärtszählen Null erreicht, oder bei bUpOnly der
Höchstwert, wird die Flagge bStart gesetzt. Diese wird
außerhalb der Interrupt-Service-Routine ausgewertet und stellt
die nächste LED-Anoden-Kombination ein, indem die Richtungsregister
derjenigen Anodenausgänge 1 gesetzt werden, die eingeschaltet
werden sollen. Die Portausgänge bleiben dabei immer auf Null,
nur die Richtungsregister werden zum Ein- und Ausschalten der LEDs
verwendet.
Die Abläufe bei der LED-Steuerung sind im nächsten
Kapitel beschrieben.
4.2 Ablaufsteuerung
Alle Abläufe sind in einer Tabelle abgelegt. Sie enthaelt im
Standardfall jeweils vier Bytes:
- Flaggenbyte: Die Flaggen können normal (0), nur Aufwaertszaehlen
(1), doppelte Geschwindigkeit (2) und vierfache Geschwindigkeit
(4 plus 2) kodieren.
- Richtungsbits für den Port D (Bit 6 ist immer Eins zu
setzen).
- Richtungsbits für Port B (Bits 2, 3 und 4 sind immer Eins
zu setzen).
- Richtungsbits für Port A.
Ist das Flaggenbyte mit folgenden Werten besetzt, wird der Ablauf
gesteuert und nur ein nachfolgendes Byte gelesen:
- 0xFF: Ende der Tabelle, Neubeginn am Anfang
- 0xFE: Wiederholung der nachfolgenden Einträge, das zweite
Byte gibt die Anzahl Wiederholungen an, speichert die
Tabellenadresse im Doppelregister X
- 0xFD: Zweite Wiederholungsschleife, zweites Byte ist die Anzahl
Wiederholungen, speichert die Tabbeladresse im Doppelregister Y
- 0xFC: Ende der ersten Wiederholungsschleife, Beginn am Anfang
der ersten Wiederholung, holt die Tabellenadresse aus dem
Doppelregister X
- 0xFB: Ende der zweiten Wiederholungsschleife, Beginn am Anfang
der zweiten Wiederholung, holt die Tabellenadresse aus dem
Doppelregister Y
Um das Schreiben der Tabelle zu vereinfachen, sind in der Datei
konstanten.inc Bitkombinationen definiert, die die in die
Richtungsregister von Port A, B und D zu schreibenden Werte angeben,
um eine bestimmte Bitkombination anzuzeigen. Z. B. sind die
Werte für keine Lampe an und für alle Lampen an so
definiert:
.equ X0=1843200 ; 00.1C.20.00
.equ Xalle=67075840 ; 03.FF.7F.00
Mit
.set cX = X1
.db Byte1(cX),Byte2(cX),Byte3(cX),Byte4(cX)
.set cX = X2
.db Byte1(cX),Byte2(cX),Byte3(cX),Byte4(cX)
lassen sich die Lampen 1 und 2 nacheinander anmachen, mit
.set cX = X1_2
.db Byte1(cX),Byte2(cX),Byte3(cX),Byte4(cX)
beide gleichzeitig.
Die Flaggen bUpOnly,bFast und bVeryFast werden einfach zu diesem
Wert addiert, z.B. so für sehr schnelles an und aus von Led 2:
.set cX = cVeryFast+X2
.db Byte1(cX),Byte2(cX),Byte3(cX),Byte4(cX)
Mit den Wiederholungssteuerungen lassen sich Abläufe bis zu
256 mal wiederholen, ohne die Tabellenwerte n mal hinschreiben
zu müssen. So wiederholt sich die Abfolge Led 1, Led 2 und
Led 3 vier mal nacheinander mit folgender Formulierung:
.db cRepeat1,4 ; Wiederholung 1 starten, Anzahl = 4
.set cX = X1
.db Byte1(cX),Byte2(cX),Byte3(cX),Byte4(cX)
.set cX = X2
.db Byte1(cX),Byte2(cX),Byte3(cX),Byte4(cX)
.set cX = X3
.db Byte1(cX),Byte2(cX),Byte3(cX),Byte4(cX)
.db cNext1,0 ; Wiederholung 1 drei weitere Male ausfuehren
Mit cRepeat1 und cRepeat2 lassen sich auch verschachtelte Widerholungen
mit einer äußeren und einer inneren Schleife realisieren,
so dass viel Tabellencode gespart wird.
Bei Bedarf lassen sich mit der Tabellenkalkulation
im Open-Office-Format hier, im Blatt Bit_Tab,
beliebige andere LED-Kombinationen definieren, indem
- ein Name für die Konstante in Spalte A der Tabelle eingetragen
wird,
- in den Spalten L1 bis L13 für jede LED, die angeschaltet sein
soll, eine Eins eingetragen wird, und
- das sich ergebende Definitionsergebnis in Spalte S einfach mit Copy
und Paste in die Datei konstanten.inc eingefügt wird.
Sollen mehrere neue Kostanten definiert werden, kann man diese am Ende
der Tabelle hinzufügen, die Formeln ab Spalte O dazukopieren, die
gesamte Spalte S markieren und kopieren, in konstanten.inc alles markieren
und die Zwischenablage einfügen.
Die geänderte Tabelle immer mit .db 0xFF,0xFF abschließen,
damit das Spiel von Neuem beginnt.
4.3 Download
Die Assembler-Software im Quellcode gibt es
hier im Assembler-Format und
hier im HTML-Format. Zum Assemblieren
ist noch die Include-Datei konstanten.inc
erforderlich. Sie kann mit der Open-Office-Tabellenkalkulation
erstellt werden.
Beim Programmieren sind keine Fuses zu verstellen, sie läuft
im Werksformat des Chips.
Viel Spaß beim sanften Blinken.
Lob, Tadel, Fehlermeldungen, Genöle und Geschimpfe oder Spam bitte über
das Kommentarformular an mich.
©2017 by http://www.avr-asm-tutorial.net