Elektronik-Labor
Projekte
Mikrocontroller PicoBasic
Ich arbeite gerade an einem
Projekt mit einem preiswerten Pdauk-Controller, bei dem ich acht LEDs mit einem
schwachen Flimmern ansteuern will, das an flimmernde Sterne erinnern soll.
Wichtig ist auch, dass alles für den geplanten Batteriebetrieb sehr
stromsparend wird. Ich hatte schon verschiedene Ideen dazu, aber die
Entwicklung ist aufwendig, weil ich bei jedem Versuch das Padauk-Programmiergerät
einsetzen muss. PicoBasic dient hier zur vereinfachten Entwicklung eines
Vor-Prototyps. So kann ich mit weniger Aufwand ein geeignetes Verfahren
entwickeln, das am Ende relativ leicht auf den Padauk-Controller übertragen
werden kann. Das MiniC der Padauk-IDE ist ähnlich einfach gehalten wie PicoBasic, deshalb passen beide gut zusammen.
Zuerst hatte ich einen Weg versucht, der mit einer einfachen Zufallsfunktion
und Schiebebefehlen arbeiten sollte. So hatte ich das schon mal meinen Zufallsprogrammen
probiert. Der Versuch lief aber irgendwie ins Leere. Dann habe ich mit der
verbesserten Zufallsfunktion weitergemacht, die Günther Zivny vorgeschlagen
hatte.
REM
Zufall3
REM G. Zivny
0x09FF Pdir = 255
L1:
0x0283 B = 131
0x2A00 A = A + B
0x3400 B = A
0x3900 A = D
0x2A00 A = A + B
0x4500 Pout = A
0x4200 Print A
0x3800 D = A
0x3500 A = B
0x1964 Delay ms = 100
0x2001 Goto L1:
Das Programm liefert ein starkes, zufälliges Flackern. Aber das Flimmern von Sternen ist sehr viel schwächer ausgeprägt. Die
Idee war dann, dass ich zusätzlich alle Ports für eine etwas längere Zeit
einschalte. Das Flackern macht dann nur einen kleinen Teil der Gesamthelligkeit
aus. Weil insgesamt eine geringe Helligkeit das Ziel war, muss alles in einer
Schleife laufen, die mit rund 10 ms wiederholt wird. Die relative
Einschaltdauer liegt dann in der Größenordnung 0,1%, was mit sehr effizienten
LEDs voll ausreicht.
0x4500 Pout = A
0x1801 Delay µs = 1
0x08FF Pout = 255
0x180A Delay µs = 10
0x0800 Pout = 0
Die weiteren Versuche haben dann gezeigt, dass das Flimmern noch zu schnell
war. Die Lösung war eine weitere Schleife, in der jede berechnete Zufallszahl
mehrfach benutzt wurde.
0x030A C = 10
L2:
0x4500 Pout = A
0x1801 Delay µs = 1
0x08FF Pout = 255
0x180A Delay µs = 10
0x0800 Pout = 0
0x190A Delay ms = 10
0x2507 C*Goto L2:
Im Endergebnis kann ich nun die Helligkeit, die Tiefe der
Helligkeitsmodulation, die Geschwindigkeit der Helligkeitsänderungen und die
gesamte Schleifenzeit getrennt einstellen. Insgesamt muss man deutlich
unter 20 ms bleiben, sonst wird ein regelmäßiges Flackern wahrgenommen.
REM
Flimmern
0x09FF Pdir = 255
L1:
0x0283 B = 131
0x2A00 A = A + B
0x3400 B = A
0x3900 A = D
0x2A00 A = A + B
0x030A C = 10
L2:
0x4500 Pout = A
0x1801 Delay µs = 1
0x08FF Pout = 255
0x180A Delay µs = 10
0x0800 Pout = 0
0x190A Delay ms = 10
0x2507 C*Goto L2:
0x3800 D = A
0x3500 A = B
0x1905 Delay ms = 5
0x2001 Goto L 1: