Charlieplexing - Übersicht
Eine 7-Segment-LED-Anzeige hat neun Anschlüsse (die Segmente a..g, den Dezimalpunkt und den gemeinsamen Anschluß). Kommen mehrere dieser Anzeigen zum Einsatz, so steigt die Anzahl der nötigen Anschlüsse um ein vielfaches (für jede Anzeige sind das 9 Anschlüsse).
Meistens kommt dann das Multiplexverfahren zum Einsatz. Dort werden die LED-Segmente parallel geschaltet, nur der gemeinsame Anschluß wird für jede Anzeige einzeln beschaltet. Somit werden für 9 Anzeigen nur 17 Anschlüsse benötigt.
Charlieplexing wurde von der Firma MAXIM entwickelt. Dort werden die Anschlüsse der LED-Anzeigen nach einem bestimmten Muster zusammengeschaltet. Die Bedeutung eines Anschlusses ändert sich je nachdem welche Anzeige aktiv ist. Dazu muß der LED-Treiber aber auch den Zustand „Z“ (Tristate hochohmig) kennen. Der PIC18 kennt diesen Zustand nicht, deshalb wird in diesem Fall der entsprechende PIC-Port zu einem Eingang umprogrammiert.
Charlieplexing | Anschluß | Multiplexing | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
dp | * | dp | dp | dp | dp | dp | dp | dp | 1 | a | a | a | a | a | a | a | a | a |
g | dp | * | g | g | g | g | g | g | 2 | b | b | b | b | b | b | b | b | b |
f | g | g | * | f | f | f | f | f | 3 | c | c | c | c | c | c | c | c | c |
e | f | f | f | * | e | e | e | e | 4 | d | d | d | d | d | d | d | d | d |
d | e | e | e | e | * | d | d | d | 5 | e | e | e | e | e | e | e | e | e |
c | d | d | d | d | d | * | c | c | 6 | f | f | f | f | f | f | f | f | f |
b | c | c | c | c | c | c | * | b | 7 | g | g | g | g | g | g | g | g | g |
a | b | b | b | b | b | b | b | * | 8 | dp | dp | dp | dp | dp | dp | dp | dp | dp |
* | a | a | a | a | a | a | a | a | 9 | * | ||||||||
10 | * | |||||||||||||||||
11 | * | |||||||||||||||||
12 | * | |||||||||||||||||
13 | * | |||||||||||||||||
14 | * | |||||||||||||||||
15 | * | |||||||||||||||||
16 | * | |||||||||||||||||
17 | * | |||||||||||||||||
* je nach LED-Typ, gemeinsame Anode oder gemeinsame Kathode |
Ansteuerung, LED2 mit gemeinsamer Kathode zeigt die Ziffer 3
Pegel | Anschluß | Portrichtung | |
---|---|---|---|
dp | Z | 1 | Eingang |
g | H | 2 | Ausgang |
f | Z | 3 | Eingang |
e | Z | 4 | Eingang |
d | H | 5 | Ausgang |
c | H | 6 | Ausgang |
* | L | 7 | Ausgang |
b | H | 8 | Ausgang |
a | H | 9 | Ausgang |
Schaltplan LED-Modul
PICmicro und Charlieplexing
Für den PICmicro von Microchip habe ich eine kleine Sammlung von nützlichen Routinen erstellt. Diese können sehr einfach an die verschiedenen PIC18F-Typen angepasst werden.
Diese Sammlung beinhaltet 2 Dateien:
Charlieplexing_18F.inc = Definition der verschiedenen Konstanten
Charlieplexing_18F.asm = Verschiedene Routinen zum Ansteuern der LEDs
Zusätzlich ist ein Anwendungsbeispiel vorhanden.
Diese Programmsammlung wurde mit der Entwicklungsumgebung MPLAB von Microchip erstellt.
Anpassung in der Datei Charlieplexing_18F.inc
Je nach PIC-Typ bzw. PIC-Beschaltung müssen einige Änderungen durchgeführt werden.
; ; Konstante ; LED_Count equ 9 ; Anzahl der LED-Anzeigen LED_Type equ 1 ; Art der LED ; (0 = gem. Anode, 1 = gem. Kathode) ; ; Portbelegung ; #define LED_Pin1_TRIS TRISB, 0 ; Leitung 1 zum LED-Modul #define LED_Pin1 LATB, 0 #define LED_Pin2_TRIS TRISB, 1 ; Leitung 2 zum LED-Modul #define LED_Pin2 LATB, 1 #define LED_Pin3_TRIS TRISB, 2 ; Leitung 3 zum LED-Modul #define LED_Pin3 LATB, 2 #define LED_Pin4_TRIS TRISB, 3 ; Leitung 4 zum LED-Modul #define LED_Pin4 LATB, 3 #define LED_Pin5_TRIS TRISB, 4 ; Leitung 5 zum LED-Modul #define LED_Pin5 LATB, 4 #define LED_Pin6_TRIS TRISB, 5 ; Leitung 6 zum LED-Modul #define LED_Pin6 LATB, 5 #define LED_Pin7_TRIS TRISB, 6 ; Leitung 7 zum LED-Modul #define LED_Pin7 LATB, 6 #define LED_Pin8_TRIS TRISB, 7 ; Leitung 8 zum LED-Modul #define LED_Pin8 LATB, 7 #define LED_Pin9_TRIS TRISA, 7 ; Leitung 9 zum LED-Modul #define LED_Pin9 LATA, 7 ; ; Variablen ; cblock LED_Flags, LED_Aktuell, LED_Buffer:LED_Count endc
Beschreibung der Routinen in der Charliepexing_18F.asm
Routine | Beschreibung |
---|---|
LED_Init | Initialisierung der PIC-Ports |
LED_Clear | Der LED-Buffer wird mit 0x00 gefüllt. |
LED_GetHexLEDCode | Der L-Teil vom W-Register wird in den LED-Code übersetzt. |
LED_Refresh | Die LED-Anzeige wird aktualisiert. Diese Routine muß mind. alle 2ms aufgerufen werden. Sonst flackern die LEDs. |
Demo
LED9..LED3: Zeigen eine Animation.
LED2..LED1: 2-stelliger Zähler.
Der Zählerstand wird in Hex angezeigt.
J1: offen = LED mit gemeinsamer Kathode; zu = LED mit gemeinsamer Anode