Hallo

Als Fan des Charlieplexing (weil es so minimalistisch ist) habe ich mir darüber noch ein paar Gedanken gemacht:
...aber das Tastverhältnis wird irgendwann gruselig, oder?
Für neun LEDs an 4 Pins kann man das erwartete 1:9-Verhältniss eigentlich recht einfach auf 1:3 verbessern. Das funktioniert einfach, weil das hier nicht stimmt:
Nochmal der Hinweis: Beim Charlieplexing brennt... immer nur eine LED!
Am Beispiel 4 Ports/12 LEDs erklärt: Die 12 LEDs sind eigentlich in vier 3er-Gruppen zusammengefasst, je gesetztem Ausgang entsprechen drei nicht gesetzte oder hochohmige Ausgänge der jeweils leuchtenden LED. Bei vier Ausgängen A0 bis A3 sieht der Aufbau der ersten Gruppe so aus: Je eine LED mit Vorwiderstand von A0 nach A1,A2 und A3, alle Anoden an A0. Ein Programm zur einzelnen Ansteuerung muss folgende Ausgangsmuster erzeugen:

LED0: A0=1, A1=0 A2=x A3=x (1 ist Ausgang high, 0 ist Ausgang low und x ist Eingang ohne PullUp)
LED1: A0=1, A1=x A2=0 A3=x
LED2: A0=1, A1=x A2=x A3=0

Die anderen drei Gruppen sind analog mit A1, A2 und A3 als Anodenanschluss aufgebaut. Bei jedem Aufruf der ISR wird jeweils nur eine Kombination ausgegeben und es leuchtet deshalb auch nur eine LED. Um nun alle LEDs anzusteuern muss die ISR 12 mal aufgerufen werden.

Einfacher und schneller geht es wohl (ich habe es noch nicht getestet) wenn man die LEDs gruppenweise ansteuert:

If(gruppe==0)
{
A0=1
if(LED0) A1=0 else A1=x
if(LED1) A2=0 else A2=x
if(LED2) A3=0 else A3=x
}
If(gruppe==1)
{
A1=1
if(LED3) A0=0 else A0=x
if(LED4) A2=0 else A2=x
if(LED5) A3=0 else A3=x
}
...

Man benötigt so nur 4 ISR-Aufrufe um alle 12 Leds auszugeben, bzw. 3 Aufrufe für 9 LEDs. Nachteil: Der gemeinsame Pin muss bis zu drei LED-Stöme treiben, das muss man bei der Auswahl der Vorwiderstände berücksichtigen. Ich hoffe, dass funktioniert auch in der Praxis.

Gruß

mic