LCD Controller

LCDs aus alten Notebooks bekommt man überall für wenig Geld oder gar umsonst. Nur deren Ansteuerung ist nicht ganz einfach und erfordert einen relativ teueren Displaycontroller wie den S1D13704 der einige 10€ kostet und nur in einem winzigen SMD Gehäuse erhältlich ist.

Die Ansteuerung ist prinzipell einfach, nur die große Datenmenge macht alles etwas schwierig.
Ein schneller RISC Controller wie die AVRs, ein schnelles SRAM (z.B. Cache RAM aus einem alten Mainboard) und noch ein paar (A)HCMOS ICs und fertig ist der LCD Controller.
Der Mikrocontroller empfängt Daten und Befehle über ein paralleles 8bit Interface, verarbeitet diese und speichert die Daten ins SRAM. Dieses wird kontinuierlich etwa 60 mal pro Sekunde ans LCD ausgegeben. Dies ergibt eine Datenmenge von etwa 2,5MByte/s.

Bei der Wahl des Speichers und der HCMOS ICs muss man etwas auf die Geschwindigkeit achten. Das SRAM (entweder 64kByte oder 2x32kByte) muss weniger als 55ns haben wenn ein 74AHC573 bzw. 74AC573 verwendet wird. Setzt man einen normalen 74HC573 ein, dann muss das SRAM noch schneller sein. Dasselbe gilt für den 74HC02.
Wenn ein 64kB SRAM verwendet wird, dann entfällt der Inverter der an A15 liegt, und A15 wird direkt an A15 angeschlossen, CS\ kommt dann an GND.

 

Auf der Schaltung ist wirklich nicht viel mehr drauf:

Zwei Transistoren schalten die LCD Spannung, um eine Zerstörung des LCDs bei aussetzender Ansteuerung zu verhindern. Daher sollte man bei dem Mikrocontroller die Brownout Detection aktivieren, damit der Mikrocontroller bei Unterspannung abschaltet und so auch das LCD stilllegt.

Bei den Fusebits sollte man auch darauf achten, dass CKOPT aktiviert ist, ansonsten funktioniert die Schaltung nicht richtig und der Controller hängt sich regelmäßig auf.

Zusätzlich habe ich noch einen Spannungswandler auf die Platine gepackt, der aus der 5V Betriebsspannung die LCD Spannung von etwa -15 bis -20V erzeugt. Diese lässt sich über den PWM Ausgang des Mikrocontrollers regeln.

 


Die Ausgabe der Daten auf dem LCD erfordert etwa 50% der Rechenleistung. Die restlichen 50% reichen aus um etwa 150kByte/s an Daten in den Controller zu laden. Werden häufiger aufwendige Befehle verwendet, dann sinkt die Datenrate, da der Controller länger beschäftigt ist. Zu diesem Zweck dient der Busy Ausgang, der vor jeder Datenübertragung abzufragen ist.
Eine Datenrate von 150kByte/s reicht aus, um auch einen Film (mehr oder weniger) flüssig darzustellen.


 

 

 

 

Wenn eine hohe Übertragungsrate erforderlich ist, dann kann man das LCD auch über USB an einen PC anschließen. Die geschieht über einen beliebigen USB-Parallel Wandler, wie z.B. der FT245 von FTDI, der 1MByte/s unterstützt.
Da der uC sehr viel Rechenleistung für die Ansteuerung des LCDs benötigt, erreicht man In der Praxis etwa 150kByte/s.
Für Vollbildanimationen reicht das zwar nicht ganz, aber um ab und zu aktualisierte Informationen darzstellen ist es ideal.

Weiterhin besitzt diese Schaltung nun einen Spannungswander der die vom LCD benötigte Spannung von -15 bis -20V erzeugt. Maximal lassen sich so (je nach Belastung) etwa -22V erzeugen, was für die meisten VGA LCDs ausreicht. Diese Spannung lässt sich über einen PWM Ausgang per Software einstellen, um leicht den Kontrast anpassen zu können.

 

 

 

Hier eine kleine Liste der zur Verfügung stehenden Versionen:
Von all diesen Versionen wird nur noch die USB Version aktualisiert, da der Rest sich nicht bewährt hat.

  Single Scan (4bit) Dual Scan (8bit)
Serielle Ansteuerung (FT232)   Schaltung
Software (Hex)
Parallele Ansteuerung (LPT)   Schaltung
Software (Hex)
FT245
Schaltung
Software (Hex)
LCDHype Treiber
Schaltung
Software (Hex)
LCDHype Treiber
FT245
(aktuellste Version)

Schaltung
Software (Hex)


Bei dem uC müssen folgende Einstellungen der Fuse Bits gemacht werden:

Fuse Bit High: 11001001 = 0XC9 (CKOPT enabled)
Fuse Bit Low: 00101110 = 0x2E (externer Quarz, BOD enabled)

 

Unterstützte Befehle:

Befehlsbyte Funktion Beschreibung
001 (0x01) Set Cursor Gefolgt von zwei Parametern, nämlich der Zeilen und Spaltenadresse.
Die Zeilenadresse liegt im Bereich 0-239, und die Spaltenadresse im Bereich 0-79 (plus 128, falls die Position in der unteren Displayhälfte liegt.)
002 (0x02) Set PWM Stellt das Tastverhältnis des PWM Ausgangs OC1B ein.
Das Tastverhältnis folgt auf diesen Befehl als Parameter (Bereich 0-255).
003 (0x03) Set X Start Stellt den Startwert für den Zeilenbeginn ein.
Damit lässt sich ein Ausschnitt aus dem virtuellen 1000x480 Bild im Speicher auf dem LCD anzeigen.
011 (0x0B) Clear LCD Dieser Befehl löscht das LCD in extrem kurzer Zeit.
Aber er benötigt einiges an Zeit um den kompletten Speicher zu löschen. Das LCD Timing wird zwar nicht ganz eingehalten, aber man bemerkt dies fast nicht,
da ab und zu Dummy Daten ans LCD gesendet werden.
012 (0x0C) Read Byte Ein Byte aus der aktuellen Adresse wird gelesen und über USB an den PC gesendet. Die Adresse wird anschließend erhöht. (wird nicht von allen Versionen unterstützt)
014 (0x0E) Escape Dient zur Unterscheidung zwischen Daten und Befehlen: Vor jedem Befehl muss Escape gesendet werden. Sollte ein Datenbyte oder Parameter den Escape Wert haben, so muss dieser Wert zweimal gesendet werden.
016 (0x10) Setze Pixel 0 Setzt Pixel 0 des Datenbytes an aktueller Adresse (wird nicht von allen Versionen unterstützt)
017 (0x11) Setze Pixel 1 Setzt Pixel 1 des Datenbytes an aktueller Adresse (wird nicht von allen Versionen unterstützt)
018 (0x12) Setze Pixel 2 Setzt Pixel 2 des Datenbytes an aktueller Adresse (wird nicht von allen Versionen unterstützt)
019 (0x13) Setze Pixel 3 Setzt Pixel 3 des Datenbytes an aktueller Adresse (wird nicht von allen Versionen unterstützt)
020 (0x14) Setze Pixel 4 Setzt Pixel 4 des Datenbytes an aktueller Adresse (wird nicht von allen Versionen unterstützt)
021 (0x15) Setze Pixel 5 Setzt Pixel 5 des Datenbytes an aktueller Adresse (wird nicht von allen Versionen unterstützt)
022 (0x16) Setze Pixel 6 Setzt Pixel 6 des Datenbytes an aktueller Adresse (wird nicht von allen Versionen unterstützt)
023 (0x17) Setze Pixel 7 Setzt Pixel 7 des Datenbytes an aktueller Adresse (wird nicht von allen Versionen unterstützt)
192 (0x0C) Display Character Mit diesem Befehl wird ein ASCII Zeichen mittels des interenen Character Generator dargestellt. Das gewünschte Zeichen wird als Parameter übergeben. Die Darstellung erfolgt als 8x8 Zeichen. Die Schriftart entspricht der auf einem PC im 640x480 Grafikmodus.
     
Daten Write Byte Nach dem Senden eines Datenwertes wird dieser in den Speicher geschrieben, und der Adresszähler anschließend erhöht.
Jedes Byte enthält 8 nebeneinanderliegende Pixel. Im SRAM werden dagegen 4 nebeneinander liegende Pixel aus der oberen, und 4 nebeneinander liegende Pixel aus der unteren Hälfte gespeichert. Das mach das Laden von Daten etwas komplizierter, vereinfacht und beschleunigt die Ausgabe auf dem LCD aber um ein Vielfaches.


Zurück