Forum: Mikrocontroller und Digitale Elektronik LED-Matrix-Ansteuerung mit serieller AB- oder ABC-Zeilenadressierung


von Der Zahn der Zeit (🦷⏳) (Gast)


Lesenswert?

Ich schreibe das hier, weil ich erstaunlicherweise zu diesem Thema im 
WWW praktisch keine hilfreichen Informationen bekommen habe. Etwas mehr 
gab es allerdings hier, in meinem anderen Thread zu dem Thema. Ich nehme 
an, dass ich nicht der Einzige auf der Welt bin, der Informationen dazu 
gesucht hat, also hoffe ich, dass ich Anderen hiermit helfen kann. Und 
dass die Suchmaschinen auf diesen Beitrag verweisen. Es ist auch als 
Abschluss des Threads "Nochmal: Ansteuerung LED-Matrix 64 x 32 aus 
China" (Beitrag "Re: Nochmal: Ansteuerung LED-Matrix 64 x 32 aus China") gedacht, 
nur möchte ich das nicht auch dort noch hinten dran kleben, denn das 
Thema hat sich doch stark verändert.

Es gibt in großen Mengen LED-Matrizen, vermutlich alle aus China. Ich 
kenne unterschiedlichste LED-Größen von 2 mm ("P2") bis 10 mm ("P10"), 
Außenabmessungen und Ausführungen zu - wen wundert es - erstaunlich 
geringen Preisen. Ich wollte solche Dinger einfach mal kennenlernen, 
damit spielen und sie zum Leben erwecken. Es gab und gibt auch immer 
noch kein weiteres konkretes Ziel. (Was nicht ist, kann ja noch werden.)

Alle diese Matrizen werden mit einer Schnittstelle, genannt HUB75, 
angesteuert. Ich setze die Grundlagen dieser Schnittstelle hier voraus, 
denn es gibt reichlich Dokumentation dazu. Die ersten Matrizen, mit 
denen ich gespielt hatte, waren 64 x 32 Pixel P4, also 1:16 
gemultiplext. Dafür gibt es die statischen Zeilenadress-Eingänge A, B, C 
und D. Mit einem einfachen Controller auf der Basis eines TI MSP430, den 
ich speziell dafür gemacht habe, hat das alles wie erwartet 
funktioniert. Der nächste Schritt sollten zwei 128 x 64 Pixel P2 
Displays sein, also 1:32 gemultiplext. 16384 LEDs. Für solche Displays 
wird bei statischer Ansteuerung statt einer der Masseleitungen auf der 
HUB75-Stiftleiste ein weiterer Zeilenadress-Eingang E vorgesehen. Eine 
simple Erweiterung für die Firmware, dachte ich, aber dann kam es ganz 
dick:

Auf den HUB75-Anschlüssen meiner neuen Displays gab es nur die 
Zeilenadress-Eingänge A, B und C! Wie sollte das gehen? Bild dazu: 
https://www.mikrocontroller.net/attachment/526531/IMG_0002.JPG. Im 
Angebot stand davon nichts, und den Verkäufer zu fragen, wäre wohl ein 
absolut hoffnungsloses Unterfangen. Zurück schicken? Erst mal nicht. Die 
Suche nach Informationen im WWW war sehr wenig ergiebig (danke für 
hilfreiche Antworten hier). Was sich noch finden ließ und mir neu war, 
war die Information, dass es sich um eine anscheinend eher seltene 
serielle Eingabe der Zeilenadressen handelt. Aber bei diesen wenigen 
Hinweisen dazu handelte es sich immer nur um AB-, aber niemals um 
ABC-Adressierung. Auch wie das funktioniert, also Takt, Daten, 
Datenformat etc., wurde nicht einmal für AB erwähnt. Bei allen 
Informationen stieß ich immer wieder auf die Information von H. Zeller, 
der sich scheinbar als Einziger überhaupt damit befasst und auch einen 
(AB-)Treiber für einen Raspi geschrieben hat. Z. B. 
https://github.com/hzeller/rpi-rgb-led-matrix, Stichwort "led-row-addr". 
Das half wenig, nur dass ich nun sicher wusste, dass es auch serielle 
Adressierung gibt. Immerhin etwas.

Die Zeilentreiber-ICs, bei denen des Rätsels Lösung zu finden sein 
müsste, waren auf den Displays unter dem Rahmen versteckt. Ungern habe 
ich den abgeschraubt, aber darunter fand ich ICs vom Typ D5958SSP. 
Während Infos zu allen anderen ICs meiner Displays leicht zu finden 
waren, fand ich zu diesem IC nur ein (schlechtes) Bild von dessen 
Pinbelegung, aber nichts bezüglich seiner Funktion. Zumindest war zu 
erkennen: DIN, LCK, DOUT, DIR und BK. Also ein 8-Bit Schieberegister mit 
8 Leistungs-P-Channel-Ausgängen. Für die Anschlüsse A, B und C an meinem 
Display kamen Data In, Clock und vermutlich Blank in Frage, und 
tatsächlich:

A = Clock (nicht zu verwechseln mit dem Clock-Signal für die RGB-Daten)
B = Blank (bzw. wahrscheinlich = Data In bei AB-Adressierung)
C = Data In (bzw. = Masse bei AB-Adressierung)

4 der D5958SSP gibt es für jede Bildhälfte, das ergibt 2 x 32 Ausgänge. 
Nicht zuletzt weil es weiter keine Adressdecodierung gibt, war 
offensichtlich, dass nicht 5 Adressbits (5 Bit codiert) sondern für jede 
Zeile ein Bit in ein 32 Bit-Schieberegister eingeschoben werden musste, 
also die Zeilenadresse "one-hot" codiert ist. Die Schieberegister für 
die obere und untere Bildhälfte sind natürlich parallel geschaltet.

Der Rest musste experimentell ermittelt werden:

Data In = high: Zeilentreiber enabled
Erstes Bit der Ausgabe: Oberste Zeile
Clock: Polarität unbekannt, aber weil zu jedem Bit ein Clock-Puls (= 2 
Flanken) gehört, ist es zumindest bei mir egal, ob der negativ oder 
positiv ist.
Blank: Es gibt offensichtlich ein Datenregister vor den parallelen 
Ausgängen des Schieberegisters. Mit dem Signal Blank werden die Daten 
übernommen, während gleichzeitig mit Blank = high die Ausgänge disabled 
sind.

Datenregister an den Schieberegister-Ausgängen und eine Blank-Funktion 
sind in dieser Applikation prinzipiell nicht erforderlich, deshalb hat 
man offensichtlich bei AB-Adressierung darauf verzichtet. Ggf. kann für 
diesen IC-Eingang auch nOE oder LAT der Schnittstelle genommen werden.

Daraus ergibt sich folgender Algorithmus zur Adressierung der Zeilen. 
Das Schieberegister wird zu Beginn als leer (alle Bits low) angenommen:
1
Für jeweils 32 Zeilen:
2
1. Datenausgabe der RGB-Signale für eine komplette Zeile, wie üblich
3
2. Data In = high bei der 1. Zeile, = low bei allen anderen Zeilen
4
3. Clock high, dann low (oder umgekehrt)
5
4. Blank high, dann low (nur bei ABC-Adressierung)
6
Nächste Zeile
Im Prinzip hat das dann so auch geklappt, aber dann gab es noch ein 
anderes fieses Problem: Wechselnde Pixelfehler, abhängig von leichten 
Änderungen der Betriebsspannung! Der Grund dafür ist meines Erachtens 
nach ein böser Design-Fehler der Displays: Deren Eingangsbuffer (MW245) 
sind HCMOS ICs, die mit 5 V betrieben werden. Das bedeutet, dass lt. 
Spezifikation für eine einwandfreie Funktion ein High-Signal mindestens 
eine Spannung von 0,7 * VCC, also 3,5 V haben soll. Moderne Logik 
arbeitet aber mit nur 3,3 V Betriebsspannung, das ist schon weniger als 
gefordert, und wenn dann noch die Signale nicht ganz sauber sind, sind 
auch die Sicherheitsreserven schnell aufgebraucht. Mit einem 12 
Bit-Pegelkonverter 3,3 V LV-CMOS auf 5 V HCMOS (2 x 74HCT541) für den 
ABC-HUB75, war das Problem auch gelöst.

Wären die Eingangsbuffer-ICs der Displays nicht äquivalent zu den 
74HC245, sondern zu den 74HCT245, würde dieses Problem gar nicht erst 
entstehen. Genau aus diesem Grund gibt es schließlich die 'HCT-Serie - 
aber das wusste der Designer offensichtlich nicht.

Es gibt noch einen Unterschied bei den beiden vorhandenen Displays: 
Während die Spaltentreiber-ICs FM6124 meines ersten Displays für die 
Funktion "LATCH" tatsächlich ein transparentes Latch haben, dass 
dauerhaft mit high angesteuert werden kann, sind die Spaltentreiber-ICs 
des zweiten Displays mit ICND2038S ausgerüstet, bei denen der Eingang, 
der hier auch Latch genannt wird, aber ein flankengesteuertes Register 
betreibt, das mit jeder Zeile getaktet werden muss.

DZDZ

von MaWin (Gast)


Lesenswert?

Der Zahn der Zeit (🦷⏳) schrieb:
> also 1:32 gemultiplext

Sicher nicht, solche Spitzenströme halten die LEDs nicht aus, schon 1:16 
ist überzogen.

Der Zahn der Zeit (🦷⏳) schrieb:
> Wie sollte das gehen

1:8 Muliplex, dafür 4 x längere Zeilen. Oder eben Schieberegister, wie 
du sie vorgefunden hast.

Der Zahn der Zeit (🦷⏳) schrieb:
> Moderne Logik arbeitet aber mit nur 3,3 V Betriebsspannung

Nö, HUB75 ist 5V. Selber schuld wer nur 3.3V Signale anlegt.

Der Zahn der Zeit (🦷⏳) schrieb:
> Genau aus diesem Grund gibt es schließlich die 'HCT-Serie

Schlechtere Störimmunität.

Lass die Chinesen mal machen, die wissen schon, wie es geht.

von Harry L. (mysth)


Lesenswert?

Der Zahn der Zeit (🦷⏳) schrieb:
> Der nächste Schritt sollten zwei 128 x 64 Pixel P2
> Displays sein, also 1:32 gemultiplext.

Die Display-Größe (in Pixel) hat NICHTS mit dem Multiplex-Verhältnis 
zu tun!
Jede Größe gibt es von 1:8 bis 1:32. (je nach gewünschter Helligkeit - 
die 1:8 sind deutlich heller als die mit 1:32)

Der Zahn der Zeit (🦷⏳) schrieb:
> neuen Displays gab es nur die
> Zeilenadress-Eingänge A, B und C!
indem die SR einfach länger und auf mehr als eine Zeile verteilt sind.

Bei meinem 64x64-Display mit 1:8 gibt es 3 Adressleitungen (A,B und C)
Die SR sind 256 bit lang, und es werden 4 Zeilen zu 64 LEDs in einem 
Durchgang gefüllt.

: Bearbeitet durch User
von Harry L. (mysth)


Lesenswert?

MaWin schrieb:
> Der Zahn der Zeit (🦷⏳) schrieb:
>> also 1:32 gemultiplext
>
> Sicher nicht, solche Spitzenströme halten die LEDs nicht aus, schon 1:16
> ist überzogen.

Natürlich gibts die mit 1:32!
Diese "Spitzenströme" sind nicht gewollt, da diese Displays für 
Indoor-Einsatz gedacht sind, und die mit 1:8 dafür deutlich zu hell 
sind.

von MaWin (Gast)


Lesenswert?

Harry L. schrieb:
> da diese Displays für Indoor-Einsatz gedacht sind, und die mit 1:8 dafür
> deutlich zu hell sind.

Niemand zwingt dich den Strom auch 1/8 der Zeit an zu lassen, du kannst 
dimmen (wenn du programmieren kannst, sonst kannst du natürlich nicht).

von Harry L. (mysth)


Lesenswert?

MaWin schrieb:
> Harry L. schrieb:
>> da diese Displays für Indoor-Einsatz gedacht sind, und die mit 1:8 dafür
>> deutlich zu hell sind.
>
> Niemand zwingt dich den Strom auch 1/8 der Zeit an zu lassen, du kannst
> dimmen (wenn du programmieren kannst, sonst kannst du natürlich nicht).

Ja....könnte man, aber dann wirds schwieriger mit dem PWM, da dann die 
kürzesten Pulse so kurz werden, daß man bei grösseren Installationen 
sehr schnell Probleme mit dem Timing und der Signalqualität bekommt...

: Bearbeitet durch User
von Der Zahn der Zeit (🦷⏳) (Gast)


Lesenswert?

Ui, noch Antworten so spät am Abend... 😊

MaWin schrieb:
> Der Zahn der Zeit (🦷⏳) schrieb:
>> also 1:32 gemultiplext
> Sicher nicht, solche Spitzenströme halten die LEDs nicht aus, schon 1:16
> ist überzogen.
Na ja, wenn der Hersteller 1:32 schreibt, muss was Wahres dran sein. Es 
ist ja letztendlich auch tatsächlich so. Zur Info: Ich habe die 
Stromaufnahme gemessen. Aktueller Aufbau: 2 Displays. Insgesamt 256 x 64 
(oder 128 x 128) Pixel, 50% der Pixel sind an (ähnlich einem 
Farbbalken-Testbild). Stromaufnahme: 4,4 A. Also auch 4,4 A pro Zeile 
Spitzenstrom, wobei eine Zeile aus 256 LEDs der oberen und 256 LEDs der 
unteren Bildhälfte (bzw. 128 LEDs in jedem Bildviertel) besteht (aber 
nur 50% an sind). 4,4 A / 256 LEDs = 17 mA Spitzenstrom pro RGB-LED, 
also 6 mA pro LED-Chip. _Spitzenstrom, nicht Mittelwert!_ Der ist 0,2 mA 
pro LED-Chip. Es sind ja nur ganz kleine LEDs, aber es kommt mir 
trotzdem nicht sehr viel vor. Ohne besondere Luftzufuhr, auf dem Tisch 
liegend, werden die hellen (weißen) Bereiche schon 30° wärmer, als die 
Umgebung. Das sollte man nicht vernachlässigen.

> Der Zahn der Zeit (🦷⏳) schrieb:
>> Wie sollte das gehen
> 1:8 Muliplex, dafür 4 x längere Zeilen. Oder eben Schieberegister, wie
> du sie vorgefunden hast.
1:8 hatte auch damals schon  Harry L erwähnt. Aber 1. sind dafür 4-mal 
so viele Spaltentreiber erforderlich, was bei großen Displays (P10) kein 
Problem und sicherlich sinnvoll ist, aber hier nicht in Frage kam, weil 
eben 1:32 spezifiziert war und auch nicht mehr Spaltentreiber vorhanden 
waren.

Die Frage "Wie sollte das gehen" habe ich mir beim Empfang der Sendung 
gestellt. Die Antwort "Schieberegister" kannte ich zu dem Zeitpunkt 
nicht als offensichtliche Alternative. Deswegen hatte ich die Frage 
gestellt. Manchmal weiß ich halt zu Anfang nicht gleich alles😞

> Der Zahn der Zeit (🦷⏳) schrieb:
>> Moderne Logik arbeitet aber mit nur 3,3 V Betriebsspannung
> Nö, HUB75 ist 5V. Selber schuld wer nur 3.3V Signale anlegt.
Kann gut sein. Hast du Specs? Oder ist das eine Erfahrung? Mein älteres 
Display hat auch nur HC-Treiber, da hat es keine Fehler gegeben. Das ist 
halt alles hart an der Grenze.

Und wie sind die üblichen Controller gebaut? Sicherlich nicht mit 5 
V-Logik. Ich sehe auf Fotos FPGAs, die machen höchstens 3,3 V. Also 
brauchen sie Pegelkonverter. Kann ja sein, dass es die grundsätzlich 
gibt. Hast du da Erfahrung?

Aber viele Hobbyprojekte arbeiten mit Raspi. Der hat doch auch 
sicherlich nur 3,3 V? Bei meinen Recherchen wurden die immer direkt 
angeschlossen ("Selber schuld wer nur 3.3V Signale anlegt."). Oder ESP? 
Zumindest habe ich noch nie einen Hinweis auf diese Inkompatibilität 
gefunden. Arduino müsste mit 5 V laufen, meine ich - kenne mich in der 
Welt aber nicht aus.

> Der Zahn der Zeit (🦷⏳) schrieb:
>> Genau aus diesem Grund gibt es schließlich die 'HCT-Serie
> Schlechtere Störimmunität.
Das wäre ein Argument. Die 5 V Betriebsspannung sind aber sicherlich 
wegen der blauen LEDs zwingend erforderlich, die Störimmunität wäre 
dagegen nur ein "nice to have".

Harry L. schrieb:
> Die Display-Größe (in Pixel) hat NICHTS mit dem Multiplex-Verhältnis
> zu tun!
> Jede Größe gibt es von 1:8 bis 1:32. (je nach gewünschter Helligkeit -
> die 1:8 sind deutlich heller als die mit 1:32)
Wie ich eben schrieb, danke für die Info - das hätte ich nicht erwartet, 
ist aber naheliegend. Aber es konnte bei mir nicht sein, weil 1. 1:32 
spezifiziert (ok, hätte ja gelogen sein können), und 2. auch nur für 
1:32 Zeilentreiber vorhanden waren.

Harry L. schrieb:
> Ja....könnte man, aber dann wirds schwieriger mit dem PWM, da dann die
> kürzesten Pulse so kurz werden, daß man bei grösseren Installationen
> sehr schnell Probleme mit dem Timing und der Signalqualität bekommt...
Es lässt sich leicht ausrechnen, wie viele LEDs maximal zu einem 
Teildisplay bzw. einem HUB75-Anschluss gehören dürfen, um z. B. bei max. 
20 bis 30 MHz Pixeltakt 256 Helligkeitsstufen mit 100 Hz Bildfrequenz zu 
erreichen (~2000, wenn ich mich nicht irre). Für ein vollwertiges 
Full-HD-Display (2 M Pixel) also ca. 1000 Controller-Ausgänge. (Habe ich 
mich verrechnet???) Und für die Werbe-Wände in Fußballstadien... Die 
haben 10 mm LEDs (P10) und sind vermutlich 128 Pixel hoch, habe ich mal 
versucht zu zählen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.