Assembler-Programm
ATtiny261/461/861
AVR-STUDIO 4.19, B.730
Gerd Heinz
Meine Frau bekam zu Weihnachten einen kleinen Schwippbogen mit 7 LEDs geschenkt. Die leuchteten wenig originell und gleichhell so vor sich hin. Zunächst wurden die Batterien ausgebaut und durch eine 5-Volt-Buchse samt USB-Netzteil ersetzt. Dann erinnerte ich mich, daß noch ATtiny861 und passende Leiterplatten (DAC2x4BIT) herumliegen müßten - schon war der Tag gerettet! Die acht LEDs sollten einen über den Schwippbogen ziehenden Windhauch imitieren. Nebenbei kamen noch vier weitere Licht-Funktionen dazu, die mittels Tastendruck weitergeschaltet werden können.
bestand nun darin, daß der ATtiny861 weder PWM-Augänge hat, noch sonderlich schnell läuft, um acht Zufallzahlen zu generieren und gleichzeitig noch jeden Kanal als PWM in Echtzeit auszugeben. Also eine Freude für jeden Atmel-Liebhaber. Weil schon ein ähnlicher Uralt-Code in Assembler herumlag, wurde dieser genutzt und angepaßt (C-Fans mögen mir verzeihen).
Acht Zeitfunktionen a 256 Schritte sind als Pulsweitenmodulation für acht LEDs an PA0-7 auszugeben, die 8 wurde gewählt, weil der ATtiny861 im PDIP/SOIC-Gehäuse auf der rechten Seite einen kompletten Port PA0...7 bietet.
Vorwiderstände haben den Strom für jedes ATtiny-Pin auf maximal 20 mA zu begrenzen. Damit fließen über das GND-Pin des Prozessors maximal 160 mA (von erlaubten 200 mA).
Ein Taster gestattet die Umschaltung zu verschiedenen Moden. Der Mode wird im EEPROM festgehalten, sodaß die Leuchte nach Abschaltung von VDD wieder im zuletzt gewählten Mode hochkommt.
Moden: (Weiterschaltung auf Tastendruck) Knopfdruck LEDs an PA0...PA7 0x Statisch, alle leuchten 1x Lauflicht 2x Inverses Lauflicht 3x Balkenlicht 4x Kerzenlicht
Als PCB kam eine vorhandene PCB "DAC_2x4BIT" zum Einsatz, auf der auch die Vorwiderstände der LEDs verbaut wurden. Diese Leiterplatte paßte perfekt in den Fuß des Schwippbogens.
Bild 2: Blick in den Sockel mit der Leiterplatte, der 5-Volt Buchse rechts und der Mode-Taste links.
Bild 3: Schaltungsfragment des verwendeten Teils der PCB. Der Prozessor läuft mit internem RC-Takt. An die Pins PA0...7 sind die Vorwiderstände der LEDs gelötet (270 Ohm). Die Anode aller LEDs liegt an VDD. Die Funktionstaste liegt zwischen PB4 und GND.
Bild 4: Layout der Platine (BOT). Statt der bedrahteten Widerstände hätte man auch SMD-Bauteile einlöten können.
LEDs LEDs 0...7 auf PortA mit 270 Ohm gegen GND (HIGH-aktiv) Rv je 270 Ohm (11mA - hell genug) Ports und Pins: PA0: led0 PA1: led1 PA2: led2 PA3: led3 Mitte PA4: led4 PA5: led5 PA6: led6 PA7: led7 n.c. PB4: Taste gegen GND interner Pullup an PB4 (Taste) Fuses EX 0xFF HI 0xDC LO 0xE2 Hochladen des Codes mit AVR-ISP-mkII Brenner über BU1. Compiliert mit AVR-Studio 4.19, Built 730 ATtiny861 memory use summary [bytes]: Segment Begin End Code Data Used Size Use% --------------------------------------------------------------- [.cseg] 0x000000 0x00024e 556 0 556 8192 6.8%
(Am Codesegent cseg sieht man, daß es ein ATtiny261 auch tun würde)
Das Assemblerprogramm ist strukturiert geschrieben und in kleine Unterprogramme (UP) aufgeteilt. Das erhöht die Übersicht.
Im Setup wird zunächst das EEPROM auf den letzten Tastendruck abgefragt. Die zugehörige Funktion wird geladen.
Wird das UP "Kerze" aufgerufen, soll unser sehr spezielles Kerzenlicht erstrahlen. Wie im Code zu erkennen, wird dafür alle 0x60 (dez 96) Iterationen eine neue Zufallszahl erzeugt. Vorherige Zufallszahlen werden weitergeschoben zur nächsten LED. An der Stelle "pwmloop" erfolgt die Pulsweitenmodulation für jede LED. Das Programm wird solange abgearbeitet, als kein weiterer Tastendruck erfolgt.
Erfolgt ein weiterer Tastendruck, wird der neue Tastenwert im EEPROM gespeichert und das entsprechende UP wird aufgerufen.
Die weiteren Lichtmoden sind wohl eher selbsterklärend.
Sourcecode (*.asm), Hexfile, Schaltung und diese Beschreibung (*.htm) in schwippbogen.zip
Kommentare, Hinweise oder Tips bitte an info@gheinz.de