Linux-Projekte für den Raspberry Pi
(in Python realisiert)
Ansteuerung LCD-Display [C-Berry 28]




Programmierung

Nun ging es daran 'die Bibel' zu studieren. D. h. Die Befehle des integrierten TFT-Controllers mußten erkundet werden. Schnell war klar, daß die Programmierung des bisher verwendeten monochromen Displays nicht verwendet werden konnte. Jetzt wurden die Pixel einzeln angesteuert (und zwar je Pixel mit 2 oder 3 Byte, je nach Modus).


Folgende Farbformate waren möglich:


  • 12 Bit/Pixel

RGB=(444)

Es werden immer 4 Bit für jede Farbe verwendet. D.h. (mit Füllbytes) werden 2 Bytes benötigt für 3 Pixel

  • 16 Bit/ Pixel

RGB (565)

Es werden 5 Bit Rot/ 6 Bit Grün/ 5 Bit Blau verwendet. Das sind 2 Byte pro Pixel

  • 18 Bit/ Pixel

RBG (666)

Es werden immer 6 Bit pro Farbe verwendet (Mit Füllbytes) sind das 3 Byte pro Pixel.


Ich wählte für mich den effektivsten (aber auch mit viel Arbeit verbundenen) Modus RGB 565 aus. Das hieß:

5 Bit für Rot = 2 5 entspricht 32 Farbabstufungen
6 Bit für Grün = 2 6 entspricht 64 Farbstufen
5 Bit für Blau = 2 5 entspricht wieder 32 Farbstufen.

Das bedeutete, ich kann 32 * 64 * 32 = 64k Farben darstellen. Für meine Zwecke mehr als ausreichend.


Also wurde nun der Treiber für die Punktansteuerung programmiert. Das war mit den üblichen Schwierigkeiten verbunden. Die Hintergrundbeleuchtung funktionierte sofort, aber zunächst wollte sich auf dem Display nichts zeigen. Da war guter Rat teuer.
Nach vielen, erfolglosen und entmutigenden Versuchen hat sich dann herausgestellt, daß sich in das Datenblatt des Displays ein Fehler eingeschlichen hatte.




Bildquelle: adma-tec

Hier steht unter RS register select:
H= Control
L= Data
Das ist definitiv FALSCH

Richtig ist
L (0)
= Control
H (1)
= Data



Das ist bei genauem Studium des datasheet des ST7789V Controllers (308 Seiten!!!) dort auch korrekt zu finden.

Ein weiteres Problem ergab sich bei dem Versuch, Register aus diesem Controller auszulesen. Keine Anzeige, keine Daten kein garnichts!
Und wieder einmal ging es auf Fehlersuche. Am Ende hat sich herausgestellt, daß SPI hier auf eine etwas ungewöhnliche Art genutzt wird.
Anscheinend werden die ausgelesenen Daten vom C-Berry28 Board AUCH auf der SPI-Leitung MOSI (Master OUT, Serial IN) übertragen. Nachdem ich einfach zwischen Pin 19 (MOSI) und 21 (MISO) eine Steckbrücke installiert hatte, funktionierte dann das Auslesen anscheinend.

Aber nur auf den ersten Blick. Zum Übertragen der Daten vom Raspi an das TFT-Display hatte ich, durch Versuche, die schnellstmögliche SPI-Taktrate gefunden und programmiert (liegt sogar etwas über der Angabe der maximalen Taktrate im Datenblatt). Beim Auslesen der Register muß aber ein viel niedriger Takt verwendet werden (steht auch so im Datenblatt). Nachdem auch das korrigiert war, funktionierte nun alles einwandfrei.


Neue Grafikbefehle

Weil es beim neuen Display nun echte (und viele) Farben gab, mußten auch neue Grafikbefehle erstellt werden, die diesem Umstand rechnung trugen.
Dabei wurden auch einige schon für das monochrome Display entwickelten Befehle überarbeitet oder umgeschrieben.
Auf dem neuen Farbdisplay sind nun die Pixel viel feiner als bei der monochromen Version. Daher fallen sowohl die Grafiken, als auch die dargestellten Texte nun kleiner aus.
Hieß wieder einmal 'Schluß ist noch lange nicht'. Da ich ja von hause aus faul bin (und Zeichensätze erstellen, besonders wenn es größere sind, ist eine MEEENGE Arbeit), habe ich einen Befehl für die Textvergrößerung eingebaut. Damit kann man Text in 1,2,3,...-facher Größe darstellen (Raster und Vektor). Nachdem ich schon dabei war, wurde auch die 'fill'-Funktion von Kreisen korrigiert und verbessert.

Die neuen, erweiterten Grafikbefehle sind nun


Befehl

Bedeutung

display()

Die Daten aus dem Zwischenspeicher werden an das Display gesendet und angezeigt

MEM_clear()

Der Inhalt des Zwischenspeichers wird geleert (die Display­anzeige bleibt dabei aber erhalten)

licht()

Die Hintergrundbeleuchtung wird umgeschaltet (an=> aus und aus => an)

fill_set(status)

Fill-Status (0 = keine Füllung/ 1= Füllung bei Kreisen oder Rechtecken)

TXTmagn(multi)

Setzt den Vergrößerungsmaßstab bei Texten (ganze Zahlen 1, 2, 3,....)
Macht aber nur bis zu einer gewissen Größe Sinn.

fontlist()

Gibt die Liste der vorhandenen Zeichensätze aus

fontset(fontsoll)

Setzt den neuen Zeichensatz 'sollfont'

textR(txt)

Druckt Text mit Raster-Zeichensätzen

textV(txt)

Druckt Text mit Vektor-Zeichensätzen

lineR(xplus, yplus)

Zeichnet relative Linien (von den letzten Koordinaten aus).

line_neu(xypaare)

Zeichnet Linien von X1,Y1 nach X2,Y2

line(xstart, ystart, xende=None, yende=None)

Zeichnet Linien von x1,y1 bis x2,y2. Wird xende/ yende nicht angegeben, gleiche Funktion wie LineR

box(self, xstart, ystart, xende, yende)

Zeichnet ein Rechteck von xstart/ ystart bis xende/yende

circle (xpoint, ypoint, radius)

Zeichnet einen Kreis mit Radius um Mittelpunkt xpoint/ypoint

point(xstart, ystart)

Setzt die neuen Koordinaten (xstart, ystart) für den virtuellen Cursor

setcol(farbe)

Setzt die neue Schreibfarbe 'farbe'

setcolBG(farbe)

Setzt die neue Hintergrundfarbe 'farbe'

pen(farbe)

Gleiche Funktion wie setcol

penBG(farbe)

Gleiche Funktion wie setcolBG

TFTreset()

Setzt das display zurück

invers(stat)

Display-Anzeigemodus setzen
stat= 0 => normal
stat= 1 => invertierte Farben

LCDonoff(stat)

TFT selbst per Software an/ausschalten
(NICHT die Hintergrundbeleuchtung)
stat= 0 => Displaydarstellung findet nicht statt
stat= 1 => Displayinhalt wird angezeigt




Farbtabelle

Um nicht jedesmal die RBG-Werte von Farben eingeben zu müssen, habe ich gleich noch eine vordefinierte Farbtabelle erstellt. Diese besteht aus 32 Einträgen (Schwarz/ Grauwerten/ Weiß und den Standardfarben, mit Variationen). Einfach mal ausprobieren!



Geschafft! Endlich!

Jetzt ging es noch an die Implementierung der Grafiken. Die entsprechenden Projekte finden sich auf der Startseite



Hier mal ein paar Beispiele von Grafiken/ Anzeigen auf dem Farbdisplay:





8-Kanaliges Voltmeter




Mini Oszilloscope




Vektor-Text




Raster-Text

Habe ich doch gesagt: die endlose Vergrößerung macht keinen Sinn!



Datum/ Uhrzeit

Die Sekunden 'laufen' im unteren farbigen Balken



Zwei HomeMatic Temperaturverfäufe



Thermometer (HomeMatic Einzelanzeige)



Farbtest mit einigen Grafikmustern



Farbpalette (4 Streifen á 8 Faben)



Farbverlauf


Das sind die ersten Diagramme und Testbilder, die auf dem farbigen Display angezeigt werden.


Alle diese Bilder wurden mit dem selbst erstellten Programm 'LCDcopy___' erzeugt, das ursprünglich für ein monochromes LCD-Display erstellt wurde und in der Aufbereitung der Rasterdaten anders behandelt werden mußte.
Die Zusammenführung beider Aufbereitungen habe ich noch nicht realisiert. Daher ist das hier vorgestellte LCDcopy-Programm momentan nur für den monochromen Bruder anwendbar.


Ich weiß, an vielen Grafiken muß noch gearbeitet werden. Aber das ist ein erster Anfang und ich wollte nur zeigen, daß man die C-Bibliotheken, die man zu dem Display herunterladen kann, nicht benötigt. Außerdem ist mir C nicht komfortabel genug und man muß jede Kleinigkeit 'von Hand' machen.