Charlieplexing-Display mit PicoBasic
Elektronik-Labor
Projekte
Mikrocontroller PicoBasic
Die Charlieplexing-Displays
aus gebrauchten E-Zigaretten enthalten nur LEDs und keine weitere
Elektronik. Trotzdem kommt man mit sechs Portleitungen aus, um alle
Segmente anzusteuern. Die wenigen Anschlüsse passen gut zu PicoBasic.
Allerdings ist die Software aufwendiger. Zum Vergleich: Eine
zweistellige Siebensegmentanzeige braucht im Mulktiplexbetrieb neun
Leitungen. Der alte Kosmos-Mikrocontroller kommt mit fünf Leitungen aus, weil zwei Siebensegment-Decoder im Display eingebaut sind. Das neue Kosmos-Paket mit Mikrocontroller
braucht noch weniger Leitungen, weil intern zwei Schieberegister die
Segmente ansteuern. Viele moderne Displays verwenden den I2C-Bus mit
nur zwei Leitungen, was allerdings mit höheren Kosten verbunden ist.
Das Display wurde über sechs Widerstände mit 100 Ohm an die sechs
höheren Portpins angeschlossen, sodass P0 und P1 noch für andere
Aufgaben frei bleiben. In einem ersten Versuch wurden nur die farbigen
Balken des Displays angesteuert. Für jedes Segment dürfen nur die
beiden zugehörigen Anschlüsse als Ausgänge geschaltet werden, alle
anderen Pins müssen hochohmig bleiben. Im Fall der farbigen LEDs liegen
alle Anoden an dem gemeinsamen Port 3, der mit Pout = 8 eingeschaltet
wird.
0x0800 Pout = 0
0x0900 Pdir = 0
0x0A00 Pullup = 0
0x0B00 Pulldown = 0
L2:
0x0808 Pout = 8
0x0918 Pdir = 24
0x1A01 Delay s = 1
0x0928 Pdir = 40
0x1A01 Delay s = 1
0x0948 Pdir = 72
0x1A01 Delay s = 1
0x0988 Pdir = 136
0x1A01 Delay s = 1
0x2004 Goto L2:
Als
nächstes sollten die Segmente der beiden Ziffern angesteuert werden. Als
Orientierungshilfe diente das vorhandene Steuerprogramm für einen Arduino Nano.
Hier sollten die sieben Segmente einzeln aufleuchten. Es wurden im Interesse
der leichteren Lesbarkeit Hexadezimalzahlen verwendet. Damit das Ergebnis
leichter zu kontrollieren war, wurden Wartezeiten von einer Sekunde
eingebaut. Im ersten Versuch wurde nur die linke Ziffer angesteuert.
0x0800 Pout = 0
0x0900 Pdir = 0
0x0A00 Pullup = 0
0x0B00 Pulldown = 0
L2:
0x0960 Pdir = 0x60
0x0820 Pout = 0x20
0x1A01 Delay s = 1
0x0960 Pdir = 0x60
0x0840 Pout = 0x40
0x1A01 Delay s = 1
0x0930 Pdir = 0x30
0x0820 Pout = 0x20
0x1A01 Delay s = 1
0x0950 Pdir = 0x50
0x0840 Pout = 0x40
0x1A01 Delay s = 1
0x0948 Pdir = 0x48
0x0840 Pout = 0x40
0x1A01 Delay s = 1
0x0928 Pdir = 0x28
0x0820 Pout = 0x20
0x1A01 Delay s = 1
0x0918 Pdir = 0x18
0x0810 Pout = 0x10
0x1A01 Delay s = 1
0x2000 Goto L 1:
Die Erweiterung auf zwei Ziffern macht das Programm schon relativ
lang. Bei der Gelegenheit ist aufgefallen, dass bei der Speicherung ins
EEPROM noch ein Fehler passierte, wenn das Programm eine bestimmte
Länge überschreitet. Der Fehler ist inzwischen korriguert (siehe Update 14.10.24).
Die Wartezeit für jedes Segment wurde auf 200 µs verkleinert, sodass
insgesamt eine flackerfreie Anzeige entsteht. Das zweite Segment der
linken Ziffer wurde im Bespiel durch ein Nop ganz ohne Wartezeit
angesteuert und bleibt daher unsichtbar. Das Ergebnis ist die Zahl 68.
0x0800 Pout = 0
0x0900 Pdir = 0
0x0A00 Pullup = 0
0x0B00 Pulldown = 0
L2:
0x0960 Pdir = 0x60
0x0820 Pout = 0x20
0x18C8 Delay µs = 200
0x0960 Pdir = 0x60
0x0840 Pout = 0x40
0x4A00 Nop
0x0930 Pdir = 0x30
0x0820 Pout = 0x20
0x18C8 Delay µs = 200
0x0950 Pdir = 0x50
0x0840 Pout = 0x40
0x18C8 Delay µs = 200
0x0948 Pdir = 0x48
0x0840 Pout = 0x40
0x18C8 Delay µs = 200
0x0928 Pdir = 0x28
0x0820 Pout = 0x20
0x18C8 Delay µs = 200
0x0918 Pdir = 0x18
0x0810 Pout = 0x10
0x18C8 Delay µs = 200
0x09C0 Pdir = 0xC0
0x0840 Pout = 0x40
0x18C8 Delay µs = 200
0x09C0 Pdir = 0xC0
0x0880 Pout = 0x80
0x18C8 Delay µs = 200
0x09A0 Pdir = 0xA0
0x0820 Pout = 0x20
0x18C8 Delay µs = 200
0x09A0 Pdir = 0xA0
0x0880 Pout = 0x80
0x18C8 Delay µs = 200
0x0990 Pdir = 0x90
0x0810 Pout = 0x10
0x18C8 Delay µs = 200
0x0990 Pdir = 0x90
0x0880 Pout = 0x80
0x18C8 Delay µs = 200
0x0988 Pdir = 0x88
0x0880 Pout = 0x80
0x18C8 Delay µs = 200
0x2000 Goto L 1:
Elektronik-Labor
Projekte
Mikrocontroller
PicoBasic