nach oben

Schwippbogen mit Kerzeneffekt

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.



Die Herausforderung

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

Funktion

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

Aufbau

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.


Zusammengefaßt

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)


Algorithmus und Software

Das Assemblerprogramm ist strukturiert geschrieben und in kleine Unterprogramme (UP) aufgeteilt. Das erhöht die Übersicht.

Blick in den Code

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.


Download

Sourcecode (*.asm), Hexfile, Schaltung und diese Beschreibung (*.htm) in schwippbogen.zip



Kommentare, Hinweise oder Tips bitte an info@gheinz.de