Verständnisfragen zum ansteuern eines GLCD

Hallo, ich beschäftige mich schon seit ein paar Tagen mit einem Grafikdisplay und dessen Ansteuerung mit dem Arduino. Bei dem Grafikdisplay handelt es sich um ein 240x64 mit einem T6963C als Controller. Wie wahrscheinlich den meisten bekannt ist, bietet sich dafür die Bibliothek T6963C aus dem Playground an.

Nach ein paar Änderungen und herumprobieren funktionierte alles so wie es sollte und ich konnte Grafiken bzw. Texte ausgeben. Um jedoch gewisse Sachen zu ändern oder hinzufügen zu können, habe ich mich mal schlau gemacht wie so ein GLCD eigentlich funktioniert und wie dies in der Bibliothek realisiert ist. Dabei habe ich folgende Sachen einigermaßen verstanden:

-Initialisierung des Displays -Setzen des AddresssPointers -Den Status des GLCD abfragen

Es sind jedoch auch einige Fragen aufgekommen, die ich hier hoffentlich beantwortet bekomme:

1) Wie genau funktioniert die Daten- bzw. Befehlsübertragung zum Display? Also die Funktionen "writeData()" und "writeCommand()". Zunächsteinmal werden ja alle Pins für das Schreiben von Daten bzw. Befehlen eingestellt, aber was hat es mit dem anschließenden UND- bzw. ODER verknüpfen mit den eigentlichen Daten zu tun?

2) Wie funktioniert das setzen eines oder mehrere Pixel? Mir ist nicht ganz klar was die Berechnungen mit der "Graphic Home Address", "Graphic Area" und der "FontWidth" dabei für eine Rolle spielen. Beruhen jegliche Funktionen zum darstellen von Grafiken (z.B. Kreis, Linie oder ein BMP Bild) auf dieser Funktion oder gibt es da andere Wege?

3) Beim löschen des Text- oder Grafikspeichers spielt die Größe des "Graphic Area" bzw."Text Area" eine Rolle. Auch das ist mir nicht ganz klar.

4) Um Texte zu schreiben benutzt man ja meistens den internen oder externen CGRAM. Ist dies die einzige Möglichkeit? Was ist wenn man eine größere Schrift möchte?

5) Was genau spielt der "Font Width" für eine Rolle? Es gibt ja die beiden Möglichkeiten 8x8 und 6x8. Was ist denn der Unterschied zwischen beiden?

Ich weiß das ist ganz schön viel, aber vielleicht gibt es ja jemanden der ebenfalls diese Bibliothek benutzt und ein paar Antworten auf meine Fragen kennt.

Danke für die Antworten.

ich glaube der Toshiba Controller ist nicht so sehr verbreitet. Ich habe vor einiger Zeit einmal mit so einem Display gearbeitet und eine T6963 Bibliothek für den Due geschrieben. zu deinen Fragen:

1) writeCommand ist zur Ansteuerung des Displaytreibers, z.B. um dem Controller mitzuteilen, ob du lesen oder schreiben willst. writeData benutzt du zur eigentlichen übertragung der Bilddaten oder des Texts. Die UND/ODER-Verknüpfungen sind zur Auswahl der Pins des 8-bit breiten Datenbusses. Der Arduino Uno hat keinen ganzen Hardwareport verfügbar, höchstens 6 pins die mit einem Befehl geschrieben werden können. Daher die Bitschieberei. Will man effizient Grafikdisplays betreiben, so müsste man einen 8-bit Port nehmen.

2) Pixelbearbeitung findet folgendermaßen statt: Zuerst wird ausgerechnet, in welchem Byte liegt das Pixel im Speicher (die Pixel sind ja Bits im Speicher des T6963). Dies wird zur Addresse umgerechnet und ein 1-Byte-Readbefehl durchgeführt. Auf dem Arduino wird dann das entsprechende Bit bearbeitet und das ganze Byte wird wieder zurück ans Display gesendet. Das ganze nennt sich Read-Modify-Write (RMW). Die mitgebrachten Funktion zum zeichnen beruhen auf dieser Methode. Das ist seeeeehr langsam. Ein anderer Weg wäre, die Zeichnung auf dem Arduino zu speichern und statt RMW einen Buffer-Write zu benutzen. Das geht erheblich schneller, benötigt aber sehr viel Speicher, den eine Uno nicht hat. Bei 240*64 wären das 15360 bits = 1920 bytes. Damit sind die ganzen 2kB des Unos weg. Ich habe daher zum Arduino DUE gegriffen.

3) Löschen funktioniert einfach durch beschrieben des ganzen Speichers mit 0. Der Textspeicher ist, da er die Zeichencodes speichert, kleiner als der Grafikspeicher.

4/5) Der T6963 hat EINE eingebaute Schriftart. Die ist 6*8 pixel groß. "Font width" legt lediglich den Abstand der Buchstaben fest, nicht die Größe. Einmal sind die Buchstraben in 8*8 und einmal in 6*8 Raster angeordnet. Die Textanzeige und die Grafikanzeige sind komplett unabhängig voneinander. Man kann sich das wie zwei verschiedene Displays vorstellen, ein Grafikdisplay und eine DotMatrix-Textdisplay, die übereinander liegen. Andere, größere Schriftarten gehen nur auf dem Grafikdisplay. Das wird dann mit "Bitmaps" der Buchstaben gefüttert. Das ist natürlich dann wieder entsprechend langsam.

Für den Arduino Uno empfehle ich dir die u8glib (klick), die kann sehr viele Displaytreiber (auch den T6963) und hat schon viele Schriftarten und passende Darstellungsfunktionen mitgeliefert.

Wenn du eine schnelle Framerate brauchst (z.B. für Spiele oder Animationen) ist das aber nicht so gut, da es auch auf RMW basiert. Da musst du dann wohl auch zum Due greifen.

Ich hoffe das war nicht zu kompliziert erklärt.

Gruß, Marv

Hallo, danke für die schnelle Antwort. Das hilft mir schon ein ganzes Stück weiter und bestätigt teilweise meine Vermutungen. Um das ganz zusammen zu fassen:

Bevor man das GLCD nutzen kann, muss es zunächst einmal softwareseitig Initialisiert werden. Dies geschieht in dem man zuerst alle Datenports auf OUTPUT setzt und gleichzeitig die Kontrolleitungen entsprechend konfiguriert. Danach setzt man die Graphic- und Text Home Address, auf den entsprechenden Anfangswert. Zum Schluss wird noch die Graphic- und Textarea gesetzt. Ist es eigentlich egal wo die beiden Bereiche beginnen, solange sie die benötigte Größe für die Daten haben?

So weit so gut.

Nun ist der Speicher in einen Textbereich, einen Grafikbereich und in einen CGRAM bereich eingeteilt. Die Adressen im Grafikbereich, kontrollieren jeweils 6 Bit bzw. Pixel auf dem GLCD. Je nach dem welche Informationen in die jeweilig Adresse geschrieben werden. Würde man also den Addresspointer auf die, vorher definierte, Graphic Home Address von z.B. 0xA00 setzen und im Anschluss die Binärendaten 111111 in die Adresse schreiben, so leuchten die ersten 6 Pixel in der linken oberen Ecke des GLCD auf. Bei der Folge 010101 wäre es jedes zweite, Richtig? Erhöht man nun die Adresse auf 0xA01 oder 0xA02 (wobei dies ja, bei jedem schreiben automatisch geschieht) betrifft dies die jeweils 6 bzw. 12 dahinterliegenden Pixel.

Doch wenn ich jetzt ein einzelnes Pixel, irgendwo auf dem Display setzen möchte, woher weiß ich zu welcher Adresse das entsprechende Pixel gehört und welchen Binärcode ich setzen muss?

Read-Modify-Write kenne ich nicht. Ist meine vorgehensweise Falsch? Wie funktioniert es?

Was meinst du mit Buffer-Write?

Wie sieht denn das schreiben von Daten im Detail aus. Werden die Datenports nur entsprechend auf HIGH und LOW gesetzt?

Vielen Dank für den Tipp mit der Bibliothek, auch die kannte ich noch nicht. Werd ich mir bei Gelegenheit mal näher anschauen. Vielleicht weißt du ja auch auf meine anderen Fragen noch eine Antwort. Eigentlich dachte ich dass der T6963C eines der verbreitetsten Controller ist.

Gruß , Idefix