Pfad:AVR-DE => Anwendungen => Magic circle
ATtiny2313 Anwendungen von
AVR-Einchip-Prozessoren AT90S, ATtiny, ATmega und ATxmega
Magischer Kreis mit ATtiny2313 und LEDs

Magic circle mit ATtiny2313

Hier klicken um eine gezippte Version dieser Seite herunterzuladen (1.45 MB)
Eine Anwendung des Controllers mit 13 PWM-gesteuerten LEDs, vorzugsweise zum Verschenken und ins Fenster stellen.
  1. Eigenschaften
  2. Hardware
  3. Aufbau
  4. Software

1. Eigenschaften

Magic circle 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.


Seitenanfang Eigenschaften Hardware Aufbau Software


2. Hardware

2.1 Prozessorteil

Schaltbild 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

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

Netzteilspannungen Die Software für diese Netzteilberechnung findet sich übrigens hier.

Power Supply Simulation Eine neuere Version dieser Software findet sich hier.


Seitenanfang Eigenschaften Hardware Aufbau Software


3. Aufbau

3.1 Prozessorteil

Bestückung 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.

Prozessorplatine So sieht die mit den LED verdrahtete Version aus.

3.2 Netzteil

Netzteil-Bestückung 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.

Netzteil 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

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.


Seitenanfang Eigenschaften Hardware Aufbau Software


4. Software

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:
  1. Flaggenbyte: Die Flaggen können normal (0), nur Aufwaertszaehlen (1), doppelte Geschwindigkeit (2) und vierfache Geschwindigkeit (4 plus 2) kodieren.
  2. Richtungsbits für den Port D (Bit 6 ist immer Eins zu setzen).
  3. Richtungsbits für Port B (Bits 2, 3 und 4 sind immer Eins zu setzen).
  4. Richtungsbits für Port A.
Ist das Flaggenbyte mit folgenden Werten besetzt, wird der Ablauf gesteuert und nur ein nachfolgendes Byte gelesen: 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 Tabellenkalkulation

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.

Seitenanfang Eigenschaften Hardware Aufbau Software




Lob, Tadel, Fehlermeldungen, Genöle und Geschimpfe oder Spam bitte über das Kommentarformular an mich.

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