|
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:
|
|
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
|
|
|
RGB
(565)
|
Es
werden 5 Bit Rot/ 6 Bit Grün/ 5 Bit Blau verwendet. Das sind
2 Byte pro 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 Displayanzeige
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.