2048 Pixel RGB-LED-Matrix: LED-Boards und Tiva EPI

Eigentlich wollte ich weniger auf die Matrizen selbst eingehen, weil schon so viel im Netz darüber geschrieben steht. Einiges was geschrieben steht, war jedoch nicht für die Panels zutreffend die ich bestellt habe oder schlichtweg falsch.

Leider gibt kein verfügbares Datenblatt für die Panels und so konnte ich nur probieren und spekulieren.

Was immer wieder im Netz zu lesen ist, das mit 5 Volt versorgte LED-Panel, lässt sich mit 3,3 Volt problemlos ansteuern. Das kann ich definitiv bestätigen. Ich gehe davon aus, dass ein Pegelwandler direkt auf dem Panel verbaut ist, oder alle verbauten Schieberegister problemlos 3,3 Volt als High-Pegel erkennen.

Die Eingangsbelegung des Pfostensteckers ist auf der Platine aufgedruckt. Bei der P6 Variante (6 mm Pixelabstand) nur leider etwas ungünstig vom Rahmen des Modules verdeckt. Wer mal einen Blick darauf werfen möchte, bei Adafruit gibt es ein passendes Bild.

Bild des Pfostensteckers

Ich möchte nun kurz auf die Funktionsweise der Panels mit 1/8 scan eingehen.

Dabei steht 1/8 scan für die Multiplexrate. Um ein komplettes Bild darzustellen, muss so schnell zwischen den Zeilen hin- und hergeschalten werden, dass für das Auge ein zusammenhängendes Bild entsteht.

Dazu kann man bei dem Module, mit seinen 16 Zeilen, immer zwei Zeilen zur selben Zeit leuchten lassen. Welche Zeilen gerade angesteuert werden, wird über die Adresspins A,B,C entschieden. Dabei ist bei A = 0, B = 0, C = 0 beispielsweise die erste und die neunte Zeile aktiv.

Bevor jedoch eine Zeile aufleuchten kann, muss sie mit Daten versorgt werden. Die Daten werden mit Hilfe des Clock Pins in die Schieberegister der Anzeige eingetaktet. Bei jeder High-Flanke des Clock Pins werden an den Pins R1, G1, B1 die Farben für die obere Zeile eingeschoben und R2, G2, B2 sind für die untere Zeilenfarbe zuständig. Eine Zeile besteht aus 32 Bits pro Farbe, die gesetzt oder nicht gesetzt werden können. Eine ‚1‘ bedeutet, LED-Farbe an und eine ‚0‘ aus.

Sind 32 Clock-Flanken vorüber, können wir den Latch-Pin (LAT) kurz High setzen und gleich wieder Low. Dies sorgt dafür, dass die soeben eingetakteten Daten ausgegeben werden. Wir bleiben auf der Zeile 1&9 und takten wieder neue Ein-Aus-Befehle für die 64 RGB-LEDs ein. Wir tun dies insgesamt 256 mal und erhalten so eine 8 Bit Pulsweitenmodulation an den LEDs. Das Auge nimmt das an- und abschalten der LED-Farben als Helligkeitsunterschied war.

Nun ist es an der Zeit auf die nächste Zeile zu wechseln. Wir clock’n Daten für die neue Zeile in die Schieberegister und latchen diese. Zeitgleich schalten wir die Zeile auf 2&10 mit A=1, B=0, C=0 um. Wir senden nun auf dieser Zeile die ausstehenden 255 Daten und wiederholen das Spiel, bis alle 2 x 8 Reihen ihre Farben bekommen habe. Damit das ganze für das menschliche Auge schön geschmeidig abläuft, sollte man mit einer möglichst hohen Frequenz die Anzeige neu beschreiben. Der Tiva Mikrocontroller schafft es die komplette Anzeige 270 mal in der Sekunde zu setzen.

Der Output-Enable Pin (OE) übernimmt noch eine wichtige Funktion. Dadurch das nicht exakt zeitgleich umgeschalten werden kann und sich parasitäre Kapazitäten auf den Leitungen befinden, kommt es zum sogenannten „ghosting“. Dabei leuchten einige LEDs nach ihrer eigentlichen Ansteuerung noch etwas nach und sorgen für leichte Bildunschärfe oder (wie der Name schon sagt) Geisterbilder. Um diesen Umschalteffekt zu entschärfen, habe ich bei jedem latch zusätzlich das Output-Enable aktiviert. Besonders relevant ist das OE bei einem Zeilenwechsel. Hier braucht ein MOSFET der eine Zeile ein- und ausschaltet, mindestens 75 ns um zu schließen. Wäre hier der Ausgang aktiviert, hätte man für einen kurzen Zeitraum auf zwei benachbarten Zeilen die selben Bilddaten.

Dieses Erscheinung verhindert auch, dass schnelle Wechseln der Zeilen. Dadurch muss die PWM erst für eine Zeile fertig eingespielt werden, um zur nächsten zu schalten.

Der OE-Pin hat noch eine andere nette Funktion. Man kann mit seiner Hilfe die Anzeige farbverlustfrei dimmen, indem man die LEDs zeitiger wieder abschaltet.

Zur Orientierung auf der Anzeige, habe ich (nur) in Paint eine kleine Skizze gezeichnet. Es kann durchaus sein, dass der DATA IN Connector auf der anderen Seite sitzt. Damit würde der erste Pixel der eingeschoben wird, auch auf der gegenüberliegenden Seite liegen.

 

mobile_single_color_led_matrix_display_module

 

Ein Mikrocontroller ist nicht dafür geeignet, große Datenmengen parallel zu verarbeiten. Da er meist alles nur einmal besitzt, müssen die Aufgaben nacheinander abgearbeitet werden. Meistens ist ein Controller jedoch schnell genug die Aufgaben so zu erledigen, dass es den Anschein erwecken könnte, er hat dies alles auf einmal erledigt.

Glücklicherweise haben gut ausgestattet Controller, neben ihren unzähligen Seriellen-Baugruppen, ein Paralleles-Interface. Meist wird hier Speicher in Form von S-RAM oder SD-RAM angesteuert. Im Grunde, übernimmt das einmal initialisierte Interface die komplette Ansteuerung des Speichers. Am Ende erhält der Programmierer des Controllers eine einfache Variable, die den Speicher des RAMs repräsentiert.

Die LED-Matrix ist nicht viel anders als ein Speicher, den man nur befüllen kann. So erhält man nach geschickter Initialisierung der Tiva EPI, einen einfachen C-Pointer, der auf die erste und neunte Zeile der Matrix zeigt.

Um LED-Daten in die Schieberegister zu schieben, braucht man nur noch die richtigen Adresse beschreiben. Das eigentliche wechseln der Zeilen/Adressen übernimmt nun das Parallele-Interface.

//beschreiben der 1&9 Zeile

pointer[0] = 0xFF;

//beschreiben der 2&10 Zeile

pointer[32] = 0xFF;

Natürlich wird im eigentlichen Programm, die EPI vom DMA mit Daten versorgt. So das keine CPU gebraucht wird.

Jetzt spreche ich seit einigen Posts davon, dass kaum mehr CPU gebraucht wird, da fast alles per DMA erledigt wird. Was hat denn die CPU überhaupt noch zu tun?

Um die Matrix-Module mit Daten zu versorgen, müssen diese fertig aufbereitet im SRAM des Tiva Cortex-M4 liegen. Gehen wir davon aus, dass Bilddaten 25 mal die Sekunde eintrudeln. Müssen wir ein neues Bild in spätestens 40 ms errechnet und gespeichert haben.

Die eingehenden Pixeldaten liegen wie bei WS2801 üblich, linear im Speicher und sollten nach 32 Pixel-Daten wieder vorn, in der nächsten Zeile, beginnen (wie eine Schreibmaschine):

R0,G0,B0,R1,G1,B1……R31,G31,B31

R32,G32,B32……

…..

Dieser Speicher wird nun in einer Funktion durchlaufen und bei nur einem angeschlossenem Panel, immer sechs Farbwerte herausgezogen und Bitweise verglichen und abgelegt. In den Bitdaten sind auch LAT und OE Bits enthalten. Die ebenfalls in dieser Funktion gesetzt werden.

Am Ende sind es 8 Bit große Daten, die auf das EPI gelegt werden müssen -> R1,G1,B1,R2,G2,B2,LAT,OE.

Um nun zusätzlich ein zweites Panel ansteuern zu können, musste der Matrix-Buffer von 8 Bit auf ein 16 Bit Datentypen erweitert werden. So konnten die 6 zusätzlichen Farbwerte des zweiten Panels mit aufgenommen werden. LAT, OE verhalten sich bei beiden Panels gleich. CLK und die Adress-Pins A,B,C werden automatisch vom EPI-Controller erzeugt und sind ebenfalls für beide Panels gleich.

Wer mehr über die Bilderstellung erfahren möchte, sollte sich im Quellcode die make_pwm Funktion anschauen.

Das AND-Gatter welches verbaut werden soll, geht auf eine etwas unangenehme Eigenschaft des EPI am Tiva zurück. Der Clock-Pin kann als „free running“ oder „gated“ benutzt werden. Dabei bedeutet „free runnning“ so viel wie, Clock ist immer an. „gated“ heißt, Clock-Pin toggelt nur, wenn Daten zum senden vorhanden sind.

Da nur die „gated“ wirklich Sinn bringt, habe ich mich für diese entschieden. Leider musste ich auf dem Oszi sehen (und im Datenblatt steht es auch), dass ein zusätzlicher Clock am Anfang des Datenpaketes eingefügt wird. Nicht besonders sinnvoll für diese Anwendung oder für irgendeine andere?!

Glücklicherweise gibt es noch ein zweites Signal am EPI: „Write Enable“ (WE). Dieses wird nur High, wenn auch wirklich die Nutzdaten am Interface anliegen. Ergibt nun folgende Logik:

WENN „WE“ == 1 UND „CLK“ == 1 DANN „CLK_MATRIX“ = 1 SONST „CLK_MATRIX“ = 0  die für ein brauchbares Clock-Signal sorgt.

Man kann das externe AND-Gatter auch weglassen, wenn man nicht die höchsten Datenraten fahren möchte. Das am Anfang zusätzliche eingefügte Bit in den Schieberegistern, fällt nach 32 normal eingetakteten Bit wieder hinten raus. Dazu müssen aber die 32 Bit unterbrechnungsfrei eingetaktet werden und das ist nicht immer der Fall, bei der schnellen Datenrate des EPI. Die Lösung kann sein, die Sendegeschwindigkeit des EPI zu drosseln, so das der FIFO nicht leer wird. Dadurch reduziert sich leider auch die Bildwiederholrate.

Advertisements
Dieser Beitrag wurde unter Allgemein, LED-Matritzen abgelegt und mit , verschlagwortet. Setze ein Lesezeichen auf den Permalink.

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s