mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Eine kleine Exkursion in die Welt der LCD Displays...


Autor: Erich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

Ich habe schonmal gepostet, und keine Antwort bekommen, darum gehe ich
die Sache jetzt einmal ein bisschen gründlicher an (und ich bitte darum
meine Rechtschreibung/Grammatik zu entschuldigen ;) ):

Ich habe LCD-Display (Hitachi LMG9520RPCC) günstig bekommen, und das
ganze war natürlich ohne einen Grafikkontroller um das Teil
anzusteuern.

Das Display verfügt über:

- 320 x 240 x 3 (8Farben) = 28.800 kbyte Displaygrösse
- C1 (byte-Takt)
- C2 (Zeilentakt)
- FLM (First Line Marker)
- 8 Datenleitungen

Ich habe mich mal zu dem Thema schlau gemacht (zum Glück habe ich
Urlaub ;) ), und bin auf folgendes gekommen:

1. Ich kann das Display über einen Standard-Controller anschliessen,
oder einen Controller über einen Microprozessor emulieren.

2. Für mein Display gibt es leider keinen Standardcontroller, weil es
wohl ein bisschen zu alt ist (3bit  pro pixel sagt schon alles, oder :)
), und eine selbstgestrickter sowieso besser (sprich: flexibler) wäre.

3. Ich brauche weiterhin eine negative Steuerspannung Vee (-23 Volt)
und einen Inverter (460 V bei 6 mA) für das Backlight.


Also, und nun guck 'mer mal:

Das einfachste zuerst: Die negative Steuerspannung für das LCD.

Auf meinem Datenblatt steht was von -23 Volt. Nun ja, ich kenne die
Spannungsregler 7920 und 7924, die eine Spannung von -20V bzw -24 Volt
erzeugen, und darum nehme ich den 7924, und hoffe mal auf's beste.


Als nächstes: brauche ich den Inverter fürs Backlight: 460V bei 6 mA,
einem Takt von 30k bis 85KHertz und mit einer "starting discharge
voltage" von 1000V . Das bedeutet wohl, das Teile sollte ohne
Belastung mehr als 1000V liefern, und unter Load dann auf ca 460V bei
einem Strom von 6mA runtergehen. Die 1000V sind dabei die
"Zündspannung",  ohne die wohl gar nix läuft. Eine ganz nette Doku
dazu hab ich unter "http://www.ergpower.com/pdf30/confer.pdf";
gefunden.

Bei Conrad habe ich so ein Teil gesehen, das von admatec ist, und ohne
Belastung 1000V liefert, danach  auf eine Spannung von 340V bei 5+-1ma
runter geht. Ich bin mir nun nicht sicher, ob der Unterschied von 340V
zu den nötigen 460V das Teil jetzt zu Dunkel bzw. funktionsunfähig
machen. Wenn ich mehr Spannung  (Vin = 11-13V) beim Eingang gebe, ist
es wahrscheinlich so (steht zumindest in der Doku, wo ich oben
angegeben habe), dass die Ausgangsspannung höher geht, aber der
Ausgangsstrom auch. Und wie ich gelesen habe, ist der Ausgangsstrom
direkt für die Lebenszeit der CCFL verantwortlich. Ich brauche jetzt
nicht, dass mir das Teil unter der Nase wegraucht...

Ich hab' mir auch schon überlegt eine einfache billige
Kaltkathodenlampe zu kaufen und das Teil auszuschlachten (die Dinger
werden einem ja in jedem Moddingladen nachgeworfen), ich kann aber die
Spannung/Taktung ohne Oszi nicht austesten, falls mal einer Erfahrungen
damit gemacht hat, dann meldet euch bitte.

Weiterhin hat das Teil bei Conrad leider nur einen Takt von 26KHertz.
Die Default-Frequenz bei meinem Display sollte wohl bei 70KHertz
(min/max bei 30 und 85) liegen, aber ich probiers halt einfach mal, und
 hoffe das haut hin. Die Frequenz hat zwar nichts mit der Helligkeit
oder der Langlebigkeit des Backlights zu tun, aber es könnte evtl.
Störungen/Interferenzen mit der Darstellung geben. Da das ganze aber
ein recht primitives Display ohne Grafikengine ist, und der
Frequenzbereich sowieso schon so gross ist, hoffe ich hier auch wieder
mal aufs beste :) ... Trotzdem, falls einer da mehr weiß, wäre ich für
jede Info sehr Dankbar.

Hier ist der Link zum Datenblatt des Inverters bei Konrad:

http://www.produktinfo.conrad.com/datenblaetter/17...



Und jetzt geht's ans eingemachte: Die Logik !

Ich hab hier einige threads dazu gelesen, und die waren teilweise auch
recht lang, aber wie es aussieht will jeder, soweit er kann, einen
fertigen LCD-Controller verwenden. Leider gibt es für mein Display
keinen, darum hab ich mir versucht selber was einfallen zu lassen.
Dabei kam ich auf ein paar Gründe, die für beide Vorgehensweise
sprechen:

fertige Logik:

- Einfach anzuschliessen
- vielzahl an Steuerfunktionen (Blit, panning, etc..)
- kompakt


Eigene Logik:

- man lernt etwas dabei ;)
- konfigurierbar wie man will (2,3,4 Displays/backbuffer, etc.. )
- billiger
- komponenten leicht zu beschaffen
- Displaytricks für höhere Farbzahl (8 -> 4096, etc..) leicht machbar
- simple Logik die mit kleinen Variationen auf viele Displays angepasst
werden kann

Ich finde es sprechen viele Gründe dafür einen eigenen Kontroller zu
bauen, obwohl ich zugeben muss, dass, in meinem Falle, der Grund, dass
es für mein Display nunmal keinen Controller (mehr) gibt, doch recht
zwingend war... :)

Ich habe dazu mich mal umgeschaut, und die Idee das Teil direkt mit
einem Mikrokontroller anzusteuern ist doch recht ansprechend. Jemand
hatte die Idee das mit einem Atmel Mega128 zu machen, und das klang
ganz interessant.

Bei meinem Display bedeutet das;

320 x 240 x 3bpp / 8bit = 28800Kb * 70fps = ca 2Mbyte pro Sekunde.

Bei 16Mips des Mega128 und 8bit Dateninterface des LCD-Diplays wären
das wohl 8 Befehle bzw. 500ns pro Pixel. Das müsste an sich doch recht
einfach zu machen sein.

Also habe ich mir die Ganze Sache mal durch den Kopf gehen lassen:

- 2 SRam Bausteine für den Speicher (eines zum Darstellen und eines zum
beschreiben)
- 1 Microprozessor um die Daten darzustellen
- evtl. 1 Microprozessor um die Daten reinzuschreiben (vielleicht
unnötig)

Bei den SRam bausteinen könnte ich jetzt 2x 32Kb nehmen, was bei meinen
28,8K pro Page völlig reichen würde, oder z.B.: 2 128K Bausteine mit 4
Pages zum cyclen oder 2 512er mit 16 Pages zum cyclen nehmen. Ich habe
da von dem Trick gehört (Als Amiga-Veteran ;) ), dass wenn man die
Pages aus alternierenden Memoryblöcken holt so bei 16Pages von 8 Farben
auf 4096 interpolieren kann, und das ist doch 'ne ganz feine Sache.
die Verschiedenen Pages könnte man auch ganz einfach über den
Adressbereich der ICs ansteuern und wären, jedem dem die alte x86
Assemlerhoblerei geläufig ist, bekannt.

Zur Einfachheit versuche ich es aber erst einmal mit nur 2 Pages: Eine
zum lesen, eine zum schreiben. Dazu brauche ich:

- 2 * 15 Adressbits (2^15 = 32768)
- 2 * 8 Datenbits (fürs schreiben der LCD-Daten)
- 2 mal chipselect/Outputenable und writeenable der Srams
- die Steuersignale des LCDs:  flm (Bildstart), c1 (nächste Zeile), c2
(nächstes byte)

Ergo: 2*(15+8+3) +3 = 55 Datenleitungen !!!

Nunja das geht so nicht !

Also, dann hängen wir mal den Optimierer raus:

Die Adressbits der beiden srams kann ich zusammenfassen. Ich steuer die
dann beide zwar gleichzeitig an, muss dann aber mit z.B.: einer Reihe
Und-Gatter den Mikroprozessor und die SRams entkoppeln, so dass ich nur
das Lese-Ram ansteuere, und das schreibe-Ram seperat ansteuern kann. 15
Leitungen gespart, eine zum Ansteuern verschendet, Netto: 14 gespart.

Die gleiche Leitung mit dem die Und-Gatter gesteuert werden, kann ich
quasi negiert als Writeenable für das Schreibe-Sram und nicht negiert
für das Lese-Sram verwenden, und das ganze negiert für die
outputenables (sram 1: we-ja oe-nein & sram2: we-nein oe-ja) : 4
Steuerleitungen gespart.

Das Schreiben und Lesen trenne ich wohl doch in 2 Prozessoren auf,
schon allein wegen der Performance. Vom 2. Prozessor steuere ich dann
auch die Leitung der Und-gatter, die den 1.Microprozessor und das Sram
entkoppeln, und schalte damit zwischen den beiden Srams vom 2.
Microprozessor aus hin und her, und mache diesen Somit zum
Steuerprozessor. Das chipenable des lese-rams kommt dann auch auf
diesen : 8 Datenleitungen + 2 Steuerleitungen gespart.

Jetzt stechen nur noch die dicken 15 Adressleitungen raus, und da hatte
ich eine Idee: da gibt es doch die Möglichkeit anstatt alle Adressen
(0-28799) nacheinander anzusprechen einfach einen zähler zu nehmen, den
man dann durchtaktet. Leider gibt es den nicht in einem Baustein, aber
2x8er zähler in Kaskade tun es doch auch. Man brauch dann eine Leitung
für den Reset, aber die kann man mit der Steuer-Leitung für das Display
zum Seitenaufbau verbinden. Das hat auch noch den netten Nebeneffekt,
dass dann die Entkoppelung des Microprozessors und der SRams gnadenlos
vereinfacht wird, und zwar von 15 auf 1 Pin :), ergo: 15
adressleitungen + 1 lcd-steuerleitung gespart, 1-Resetleitung für
zähler + Display verschwendet, netto: 14 gespart.

Da man nun einen quasi 16-bit Zähler anstatt eines 15-bit zählers hat,
könnte man nun das Ram ab Leitung 1-15 des Zählers beschalten und
Leitung 0 als Steuerleitung c2 (Datenbyte übernehmen) für das
LCD-Display verwenden. Man muss dann doppelt so viele Pulse (28800 * 2)
geben, aber ob man jetzt einen Puls für den Zähler und dann noch einen
für die Steuerleitung gibt, oder 2 Pulse für die Zähler gibt ist ja
letztendlich eigentlich egal. Aufpassen muss man nur auf die
Geschwindigkeit der Zählerbausteine, denn wenn die bei 10ns pro Ausgang
liegt, kommen da ganz schnell 150ns (15Leitungen) zusammen, und das
entspricht etwa 3 Takten, wo der Prozessor still stehen muss (nop) und
das sind immerhin 30% der Gesamten Zykluszeit pro Pixel. Man könnte
hier noch eine Leitung sparen, aber das kostet dann doch zuviel Zeit
(bis zu 160ns !), die man aber evtl. Parallelisieren könnte.

Ausserdem kann man die Leitung c1 für das LCD-Display, mit der das Ende
der Zeile Signalisiert wird einigermassen elegant sparen: Mein Display
ist 320 Bildpunkte breit, bei 3 farben sind das 120 byte. Wenn ich
jetzt das 120. byte übertrage, kann ich das mit einer Und-verknüpfung
zwischen den Datenleitungen 3,4,5,6 den Puls zusätzlich auf die
Steuerleitung c1 des LCD-Displays übertragen, um hiermit einen
Zeilenumbruch anzuzeigen. Und dafür gibt es einen schönen Cmos Baustein
mit 2 Und-Gattern und je 4 Eingängen mit dem Ergebnis: 1 Steuerleitung
gespart.

Man kann jetzt sogar das 2. Und mit 4 Eingängen des Cmos zum Reset für
das LCD-Display & die Adressierungs-Zähler verwenden, indem man die
bits 7,12,13 und 14 zusammenschaltet, das ergibt nämlich 28800, genauso
viele bytes, wie das Display pro Seite hat. Beim ersten Einschalten,
dann einfach einmal den Puls ein bisschen verzögert (warten muss man
bei dem LCD-Displays sowieso) oder ähnliches auslösen, und ab dann wird
er jedesmal beim Seitenende erneut automatisch ausgelöst.


Mittlerweile sind nur noch wenige Leitungen bei dem Lese-Prozessor
übrig:

1 Puls für 2x8 = 16 stufiger zähler zur Ansteuerung der
Lese-SRam-Adressierung
1 Chip-enable für das Lese-Ram
1 C2 für das LCD-Display (Takt für Byte übernehmen)

Aus 55 mach 3, aber dafür einen Prozessor ?

Man könnte jetzt einen leicht Quarz mit 16 oder 20 Mhz nehmen, das Ding
mit ein paar zähler/schieberegister (wie auch immer) ausstatten, um die
Befehlsfolge zu timen, und man hätte die Darstellungslogik für das
auslesen völlig Microprozessor frei, und weit unter 5 Euro für die
Bauteile, fertig.

Das Reinschreiben mit dem Prozessor müsste nun doch auch nur noch ein
Kinderspiel sein, oder ?

Nunja, kommt darauf an, ob man gezielte Adressierung will, oder einfach
die Seiten jedesmal ganz reinknallt, aber das könnte man so oder so
ganz bequem ohne Timingprobleme machen, da die Logik immer auf das
Lese-Sram zugreift, und man quasi alle Zeit der Welt hat, da man ja
selber die SRams flippt.


Falls jemand da irgendwo in meinen Überlegungen einen Fehler entdeckt
hat, dann lasst es mich bitte wissen. Rein logisch gesehen müsste alles
stimmen (mal abgesehen von der Rechtschreibung ;) ), und ich hoffe,
dass das Teil so funktionieren wird, da sind aber immer noch ein paar
Themen, bei denen ich, durch mangelnde Informationen, ein bisschen auf
schwammigem Boden stehe:

1. –24 V für Vee (anstatt default –23) sollte doch klargehen, oder ?
2. Die Taktrate + Spannung/Strom für den Inverter weichen doch ein
bisschen weit von den Specs ab, sind sie aber trotzdem noch innerhalb
der akzeptablen Grenzen (vor allem Takt) ?
3. Wäre ein 0/8/15 Inverter einer Kaltlichtkathodenlampe
(Moddingbereich und so) vielleicht besser ?
4. Da meine Hardware-Zeit doch schon recht lange hinter mir liegen,
könnte mir beim Design der Auslese-Logik hier ein grober Schnitzer
unterlaufen sein...

Da ich mir soviel Mühe gemacht habe, mein Idee von dem ganzen mal
zusammenzufassen, hoffe ich doch auch auf ein paar Antworten... ;-)

Erich

Autor: Mark de Jong (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Siehe mal die Thread Farbdisplay.
http://www.mikrocontroller.net/forum/read-1-52477.html

Der controller kannst Du auch benutzen.

oder auf http://www.uc-projects.com/

Grüße Mark,

Autor: Marcel Meyer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo,
habs mir ganz durchgelesen, klingt recht interessant, aber warum willst
du die ganzen fetten logikbausteine verwenden? wie wäre es mit 1-2 (bei
bedarf größeren) gal´s? die teile sind super simpel und vor allem flott
dabei, zudem sind sie kleiner, und verknüpfungen lassen sich einfacher
ändern

Mfg
Marcel

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.