Sechs LEDs an drei Ports    


Elektronik-Labor   Projekte  AVR 

 

Multiplexen kennt jeder, aber Charlieplexen ist mehr. Das Verfahren habe ich gerade erst von Gerd Sinning und seiner LED-Uhr gelernt. Und dann habe ich es noch  in einem neuen Arduino-Buch entdeckt. Der Name stammt vom Erfinder Charlie Allen. Und ich dachte auch, ich hätte das Verfahren  schon verstanden. Aber dann wollte ich es jemand erklären und musste feststellen, da ist noch ein Trick dabei, den ich zuerst noch übersehen hatte. Inzwischen habe ich es kapiert, der Trick ist, dass die gerade nicht benutzten Leitungen in den hochohmigen Zustand geschaltet werden.

Jetzt wollte ich das Prinzip einmal in Bascom mit drei Portleitungen eines Tiny13  ausprobieren. Beim Charlieplexing kann man mit N Leitungen bis zu N * (N - 1) LEDs ansteuern. Das macht sechs LEDs für drei Leitungen, 12 LEDs für vier Leitungen, 20 LEDs für fünf Leitungen usw. Im Prinzip legt man jeweils zwei LEDs antiparallel zwischen zwei Leitungen. Alle gegen alle außer sich selbst ergibt die obige Formel. Zum Vergleich: Beim Multiplexen bekommt man mit 8 Leitungen nur 4 * 4 = 16 LEDs, beim Chalieplexen sind es 8 * 7 = 56 LEDs.
Allerdings kann beim Charlieplexen zu einer Zeit nur eine LED leuchten, beim Multiplexen können mehrere gleichzeitig eingeschaltet sein.



Das Schaltbild zeigt den Anschluss der sechs LEDs mit ihren drei Widerständen. Die momentanen Spannungen zeigen einen von sechs möglichen Zuständen. PB2 ist high, PB4 ist low, die markierte LED leuchtet gerade. Damit keine andere LED mitleuchten kann muss PB3 als hochohmiger Eingang geschaltet werden. Hier stellt sich eine mittlere Spannung ein. Im Prinzip sind zwar zwei weitere LEDs in Durchlassrichtung angeschlossen, aber jede von ihnen bekommt nur 1 V, weil die aktive LED die Spannung auf 2 V begrenzt. 1 V liegt aber noch deutlich unter der Diodenschwelle, und deshalb leuchtet tatsächlich nur eine LED.

Das folgende Programm lässt die sechs LED einzeln nacheinander aufleuchten. Das Datenrichtungsregister Ddrb legt dabei fest, welche beiden Leitungen gerade Ausgänge sein sollen, das Portb-Register welche einzelne Leitung gerade high sein soll.

 'ATtiny13 6 LEDs an 3 Ports
$regfile = "attiny13.dat"
$crystal = 1200000
$hwstack = 8
$swstack = 4
$framesize = 4

Config Portb = Input
Portb = 0

Do
Ddrb = 00001100
Portb = 00001000
Waitms 500

Ddrb = 00001100
Portb = 00000100
Waitms 500

Ddrb = 00011000
Portb = 00010000
Waitms 500

Ddrb = 00011000
Portb = 00001000
Waitms 500

Ddrb = 00010100
Portb = 00000100
Waitms 500

Ddrb = 00010100
Portb = 00010000
Waitms 500
Loop
End

Hier ein kleiner Youtube-Film. Wenn man ganz genau hinsieht, erkennt man eine LED, die mit geringerer Leuchtkraft zur falschen Zeit mitleuchtet. Das liegt daran, dass der Port B2 auf dieser Platine aus dem Lernpaket Mikrocontroller nicht völlig frei liegt, sondern über einen Widerstand an der Schnittstelle hängt.




http://www.youtube.com/user/bkelektronik


Schaltungsvariante von Arne Rossius

Wie beim Multiplexing auch kann das Display in "Zeilen" und "Spalten" eingeteilt werden, so dass immer eine ganze Zeile (oder Spalte, je nach Ansteuerung) zugleich leuchten kann. Jede Zeile und jede Spalte hat bei Charlieplexing mit n Pins dann genau eine LED weniger als bei Multiplexing mit 2*n LEDs (quadratische Matrix). Ich habe Charlieplexing in diesem Projekt verwendet:

https://wiki.blinkenarea.org/index.php/LED-23

Dort wird immer eine Spalte auf Masse gelegt, die restlichen Ausgänge des AVR sind dann entweder hochohmig (LED aus) oder high (LED an). Damit sich keine Helligkeitsunterschiede je nach Anzahl der eingeschalteten LEDs ergeben müssen die Kathoden aber direkt (ohne Vorwiderstand) an die Portpins des Controllers angeschlossen sein, also anders als bei dir im Artikel gezeigt.




Bei der Gelegenheit habe ich gleich noch zwei Skizzen erstellt, wie aus einer Multiplexing-Matrix eine Charlieplexing-Matrix wird.




Charlieplexing-Verstärker, von Jens Grabner  



Angeschlossen ist das bei mir an einem Arduino-mini-pro mit dem LOL-Shield. Softwaretechnisch ist es so, das es nicht genügt den Matrixtreiber von Output-High auf Eingang (Tri-State) zu schalten, weil .... durch den Vorwiderstand (R3) geht die Schaltung in Selbsthaltung.  Wichtig: Den Matrixtreiber von Output-High auf Output-Low schaltem (immer niederohmig) -- umgekehrt den Matrixtreiber ohne Last einschalten, weil es sein kann, das der Ausgang vom µC nicht die Last aller Led treiben kann (das soll ja auch der Mosfet machen ;-) ).



Nachlesen kann man es hier: http://www.mikrocontroller.net/topic/201582 Ob der Aufwand gerechtfertigt ist muss jeder selbst entscheiden -- ELV verwendet im "Info-Display ID100" einen ähnlichen Aufwand für die Matrixtreiber. http://www.elv.at/id100-info-display-tischanzeige-bausatz.html



Elektronik-Labor   Projekte  AVR