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