Forum: Mikrocontroller und Digitale Elektronik GrafikDisplay mit LC7981; Darstellungsprobleme


von Michael P. (mipo)


Lesenswert?

Hallo!

Ich habe hier eins der Grafik-Displays von Pollin mit einem LC7981 
drauf, habe aber einige Probleme, ein korrektes Bild zu bekommen.
Ich habe einiges versucht und nutze im Moment die Library von folgender 
Seite: 
http://www.frozeneskimo.com/electronics/2007/03/30/lc7981hd61830-driver-for-el-backlit-samsung-lcd/
(das Display dort sieht fast genauso aus, wie das von Pollin, ebenfalls 
oben mit einem Glasträge und 4 Kontakten; ich vermute mal Touch-Pad :-))

Ich bekomme jetzt ein Bild, aber leider mit Fehlern (flascher 
Inhalt/doppelte Zeilen). Wenn ich am "Duty-Cyle" spiele verschiebt sich 
der Bildinhalt bzw. werden Zeilenblöcke doppelt dar gestellt. Kann mir 
das jemand erklären oder hinweise zur korrekten Wahl geben?

von Benedikt K. (benedikt)


Lesenswert?

Mach mal das Delay in der Busy Funktion größer.

von Michael P. (mipo)


Lesenswert?

Hallo Benedikt!

Danke für den Hinweis, aber daran liegt es nicht. Das mit dem Duty-Cycle 
hat sich auch geklärt, steht ganz am Ende des Datenblatts ;-)

Aber es läuft immer noch nicht richtig. Es sieht so aus, als ob entweder 
die Koordinaten-Berechnung falsch ist oder das Display intern mit 
anderen Werten rechnet bzw. die Initalisierung falsch ist.
Ich versuche ein Schachbrett-Muster darzustellen. Dabei sind die 
Y-Linien eigentlich korrekt. Die X-Linien sind aber nicht ganz richtig. 
Es gibt möglicherweise einen Versatz  oder die (RAM-Zeile) ist länger 
als ich denke.
Jedenfalls seltsam und noch genug zu tun.

Gruß, Michael

von Benedikt K. (benedikt)


Lesenswert?

Bei mir läuft das Display wunderbar, ich habe auch den Code verglichen. 
Abgesehen von den zu kurzen Delays und einer falsch eingestellten 
Zeilenzahl passt da alles.

von Michael P. (mipo)


Lesenswert?

Äh, Display läuft. Ich hatte einen Dreher bei DB6<>DB7 :-/

von Sascha F. (sascha_focus) Benutzerseite


Lesenswert?

@Benedikt

Würdest du deinen Source veröffentlichen?

Gruß Sascha

von Benedikt K. (benedikt)


Lesenswert?

Den kompletten Code kann/darf ich leider nicht veröffentlichen, aber 
wenigstens den wichtigsten Teil der Initialisierung, und die 2 
wichtigsten Funktionen.

Init:
1
lcd_writecom(0x01);      // character pitch
2
lcd_writedat(0x77);      // 8x8 chars
3
4
lcd_writecom(0x02);      // characters per line
5
lcd_writedat(19);        // 20
6
   
7
lcd_writecom(0x03);      // set duty
8
lcd_writedat(79);        // 1/80
9
10
lcd_writecom(0x08);      // startadress low
11
lcd_writedat(0x00);      // 0
12
13
lcd_writecom(0x09);      // startadress high
14
lcd_writedat(0x00);      // 0
15
16
lcd_writecom(0x00);      // mode con
17
lcd_writedat(0x32);      // display on

Adresspointer setzen (x=8Pixel Raster):
1
void lcd_setadress(unsigned char x, unsigned char y)
2
{  unsigned short adress;
3
  adress=y*20+x;
4
  lcd_writecom(0x0A);        // writeadress low
5
  lcd_writedat(adress&255);
6
  lcd_writecom(0x0B);        // writeadress high
7
  lcd_writedat(adress/256);
8
}

Ein Datenbyte wird so geschrieben:
1
lcd_writecom(0x0C);
2
lcd_writedat(data);

von Sascha F. (sascha_focus) Benutzerseite


Lesenswert?

@Benedikt

Danke, das hilft schon mal weiter. Ist dies für ein 160*80 Pixel 
Display?
Nutzt du den internen Font oder externen?

Versuche das Pollin LCD am PIC24HJ128 am laufen zu bekommen.

Gruß Sascha

von Benedikt K. (benedikt)


Lesenswert?

Das ist speziell für das 160x80 LCD. Ich nutze nur den externen Font, da 
der Controller nur Text oder Grafik kann, aber nicht beides 
gleichzeitig.

von Michael P. (mipo)


Lesenswert?

Ich habe jetzt meinen Code lauffähig, d.h. das Display läuft. Mein 
größtes Problem war ein gedrehtes Kabel und eine leicht falsche 
Initalisierung.
Im Moment läuft Text- und Grafik-Modus. Bei der Grafik-Ausgabe muss ich 
noch eine Font/Bitmap-Funktion einbauen, dann sollte alles komplett 
sein. Ich werde den kompletten Source dann in die Code-Sammlung stellen.

BTW, kennt jemand eine Quelle für freie 8x8-Bitmap-Fonts?

von Früher™ (Gast)


Lesenswert?

> BTW, kennt jemand eine Quelle für freie 8x8-Bitmap-Fonts?

Früher™ hat man die einfach aus seiner VGA-Karte ausgelesen :-)

von Michael P. (mipo)


Lesenswert?

Ja, aber dann sind die Fonts immer noch nicht frei©

von Sascha F. (sascha_focus) Benutzerseite


Angehängte Dateien:

Lesenswert?

Hallo,

im Textmodus läuft es jetzt. Habe dann angefangen, den Source von
http://www.frozeneskimo.com/electronics/2007/03/30/lc7981hd61830-driver-for-el-backlit-samsung-lcd/

für einen PIC18F4550 umzuschreiben. Leider werden nicht alle Zeichen 
korrekt dargestellt. Vor allem kleine Zeichen werden nicht dargestellt.

Gruß Sascha

von Sascha F. (sascha_focus) Benutzerseite


Angehängte Dateien:

Lesenswert?

Hallo,

anbei mal ein Bild, was das Display ausgibt.
In der ersten Zeile sollte stehen:
ABCDEFGHIJKLMNOPQRSTUVWXYZ
In der zweiten Zeile sollte stehen:
abcdefghijklmnopqrstuvwxyz

Gruß Sascha

von Michael P. (mipo)


Lesenswert?

Es sieht so aus, als ob Du 25 Zeichen pro Zeile darstellen willst. Das 
hat bei mir auch nicht bzw. nur mit Pixel-Fehlern funktioniert. Versuche 
mal mit
"HorizPitch8" und "20 Zeichen" pro Zeile zu initialisieren. Damit 
funktioniert es bei mir.

Gruß, Michael

P.S.: ich habe noch nicht mit der Hintergrundbeleuchtung rumgespielt. 
Bauche ich da eigentlich noch einen Inverter?

von Sascha F. (sascha_focus) Benutzerseite


Lesenswert?

> P.S.: ich habe noch nicht mit der Hintergrundbeleuchtung rumgespielt.
> Bauche ich da eigentlich noch einen Inverter?

Nö, ist eine LED Hintergrundbeleuchtung. Deinen Tip werde ich mal 
versuchen.

Gruß Sascha

von Michael P. (mipo)


Lesenswert?

Das oben gesagt gilt natürlich nur, wenn Du den TextMode des Displays 
benutzt. Oder hast Du den Grafik-Modus und gibst den Text analog zum 
Beispiel von der Internet-Seite aus? Dabei sollt man beachten, dass der 
font.h nicht den kompletten ASCII-Satz abdeckt!

von Sascha F. (sascha_focus) Benutzerseite


Lesenswert?

Michael Potthoff wrote:
> Das oben gesagt gilt natürlich nur, wenn Du den TextMode des Displays
> benutzt. Oder hast Du den Grafik-Modus und gibst den Text analog zum
> Beispiel von der Internet-Seite aus? Dabei sollt man beachten, dass der
> font.h nicht den kompletten ASCII-Satz abdeckt!

Ja ich nutze es im Grafik-Modus. Aber kleine Buchstaben und auch die 
großen sollte der Font können. Kleine werden aber gar nicht angezeigt.
Die großen sind ab dem R fehlerhaft.

Gruß Sascha

PS. Text-Modus funktioniert ja......

von Benedikt K. (benedikt)


Lesenswert?

Keine Ahnung wie das bei den PICs ist, aber kann es sein, dass die 
Tabelle zu groß ist für das Flash/RAM und dass daher irgendwas 
durcheinander kommt? Es sieht ja stark nach einem Überlauf irgendwo aus, 
denn er fängt nach dem R wieder vorne in der Zeichentabelle an.

von Benedikt K. (benedikt)


Lesenswert?

Ich würde sagen dein Compiler hält sich nicht an die ANSI C Normen und 
rechnet nur mit 8 statt 16bit, daher gibts hier:
1
if (Font5x7[FONT_WIDTH*fontIndex+i] & (1<<j))
einen Überlauf. R müsste der 51. Buchstabe sein wenn ich mich nicht 
verzählt habe. 51 Zeichen * 5 Bytes/Zeichen -> 255 Bytes. Danach kommt 
Mist raus.
Wenn
1
if (Font5x7[(unsigned int)FONT_WIDTH*fontIndex+i] & (1<<j))
funktioniert, dann würde ich den Compiler wechseln. Nichts ist nerviger 
als ein Compiler der sich nicht an die elementarsten C Standards hält.

von Sascha F. (sascha_focus) Benutzerseite


Lesenswert?

Benedikt K. wrote:
> if (Font5x7[(unsigned int)FONT_WIDTH*fontIndex+i] & (1<<j))

Du bist mein heutiger Held :)

Jetz funktioniert es. Nutze den C18 von Microchip.

Gruß Sascha

von Sascha F. (sascha_focus) Benutzerseite


Lesenswert?

Hallo,

hat denn jemand das Touch Panel benutzt?

Gruß Sascha

von Benedikt K. (benedikt)


Lesenswert?

Jain. Die sind zu >90% kaputt. Mess mal den Widerstand zwischen jeweils 
den äußeren beiden Anschlüssen. Wenn du da keine 300 bzw. 700 Ohm misst, 
Pech gehabt. Bei 1 von 15 Displays war der Touchscreen OK.
Das Problem liegt vermutlich am Kleber mit dem das Folienkabel am Glas 
befestigt ist. Nachdem ich das Kabel entfernt hatte, konnte ich am Glas 
die Widerstände messen.

von Sascha F. (sascha_focus) Benutzerseite


Lesenswert?

Jep, beide defekt. Erklärt, warum in der Beschreibung nichts vom 
TouchPanel drin stand :(

Gruß Sascha

von Wolfgang-G (Gast)


Lesenswert?

Ich habe das Programm, welches unter
http://www.frozeneskimo.com/electronics/2007/03/30... steht,
für einen MSP430 nachempfunden und es läuft soweit problemlos.
Toller Pinguin !
Benedikt schreibt:
>Ich nutze nur den externen Font, da der Controller nur Text oder Grafik kann,
> aber nicht beides gleichzeitig.
Dazu einige Fragen:
Auf der letzten Seite des Datenblattes ist die Tabelle des 
Zeichengenerators zu sehen.
Mit welchen Befehlen (bevorzugt in C) bekomme ich diese Zeichen auf eine 
festzulegende Stelle auf die Anzeige?
Oder ist das zu einfach, sodass niemand dazu was sagt?
Ziel soll sein,  Messwerte  evtl. auch Gleitkommazahlen, und auch Text
(z. B. Fehlermeldungen) auszugeben. (Programmierung mit mspgcc)

von Wolfgang-G (Gast)


Lesenswert?

muss den Beitrag mal auf die vorderen Plätze rücken, um nicht vergessen 
zu werden

von Tobias L. (morslucis)


Angehängte Dateien:

Lesenswert?

Servus,
Ich häng mich mal hier ran, weil ich auch Darstellungsprobleme mit 
besagtem Display habe.

Und zwar folgendes:
Das Display gibt mir die erste Zeile, die ich reinschreibe auch aus, mit 
der korrekten Startposition und allem.
Das Problem ist nur, dass es alle weiteren Zeilen ignoriert (egal, was 
ich mit dem Cursor anstelle), und das Display komplett mit der ersten 
Zeile auffüllt. Und obwohl ich eine Zeichengröße von 8x10 eingestellt 
habe, produziert es lauter 8x5er Zeichen, bzw Zeilen mit einer Höhe von 
5, sodass sich die Zeichen überlappen.
Ich habe den Code mal angehängt, vieleicht findet ja wer den Fehler.


Die Fehlerbeschreibung war jetzt vielleicht etwas ungenau, daher bin ich 
offen für Rückfragen.

von Tobias L. (morslucis)


Lesenswert?

OK, ich habe den Fahler gefunden...
Es lag am DisplayDuty, und der Kontrastspannung...
Ich hatte V0 einfach an 5V geklemmt, und den DisplayDuty auf 1/4...
Jetzt funktioniert alles

von Tobias L. (morslucis)


Lesenswert?

Wolfgang-G schrieb:

> Dazu einige Fragen:
> Auf der letzten Seite des Datenblattes ist die Tabelle des
> Zeichengenerators zu sehen.
> Mit welchen Befehlen (bevorzugt in C) bekomme ich diese Zeichen auf eine
> festzulegende Stelle auf die Anzeige?
> Oder ist das zu einfach, sodass niemand dazu was sagt?
> Ziel soll sein,  Messwerte  evtl. auch Gleitkommazahlen, und auch Text
> (z. B. Fehlermeldungen) auszugeben. (Programmierung mit mspgcc)

Nötige Cursoradresse ausrechnen, diese ans Display weitergeben, und dann 
die Zeichen nachschicken.
Immer wenn du aktualisiert wieder an die richtige Cursoradresse denken.
Sollten die Zahlen mal kürzer und mal länger werden, musst du halt ein 
paar Blanks vorschicken.

Cursor Low: 0x0A
Cursor High:0x0B
Daten:      0x0C
Das sind die Befehle, die jeweils vorgeschickt werden, um den Controller 
vorzuwarenen, welche Art Daten als nächstes kommt. Aber das steht ja 
auch alles im Datenblatt...

von Wolfgang-G (Gast)


Lesenswert?

Jetzt funktioniert auch bei mir der Textmodus. Es lag an der Einstellung 
der Zeichenfeldgröße. (Angabe für vertikale Ausdehnung fehlte, so dass 
nur eine horizontale Zeile angezeigt wurde)

Noch eine Frage:
Was bedeutet die untenstehende Einstellung? (bitte keine wörtliche 
Übersetzung).

4. Set Number of Time Divisions (Inverse of Display Duty Ratio):
Nx indicates the number of time divisions in multiplex display.
1/Nx is the display duty ratio.
A value of 1 to 128 (decimal) can be set to Nx.

MfG

von Tobias L. (morslucis)


Lesenswert?

Das ist die Zeilenzahl deines Displays. Also nicht Textzeilen, sondern 
Pixelzeilen.
Da lag bei mir auch der Hund begraben, ich hielt das für sowas wie ne 
Kontrasteinstellung...

von Wolfgang-G (Gast)


Lesenswert?

Aha, passt gut.
Nun muss ich mal versuchen, wie ich den engl. Text dazu passend 
übersetzen kann.

von Mario G. (rodenberger)


Lesenswert?

Hallo,
lese gerade sehr gespannt diesen Artikel, da ich auch gerade versuche 
das Grafik-Displays von Pollin mit dem KS0108 zum laufen zu kriegen.

Es soll eigentlich erst mal nur ein Test sein ob es auch funktioniert.
Nun habe ich allerding nur einen PIC18F2620 hier und nutze als Datenport 
PortB und für den Rest PortA (RA0-RA5).
Mein Problem ist aber auch, das ich mit Assembler (C18) so gut wie noch 
nichts gemacht habe (Nur Pic 16F in Assembler).

Mein größtes Problem ist aber folgender Fehler.
Beim einschaltet tut sich erst mal nichts.
Der Quarz schwingt auch nicht. Habe in MPLAB schon verschiedenes 
probiert (XT / HS) und auch einfach mal andere Quarze genommen, geht 
nicht.
Dann bin ich mit den Fingern auf die Datenleitungen gekommen und der 
Quarz meldet sich gelegentlich mal und am Display habe ich dann eine 
grobe Anzeige von dem was es anzeigen soll.
Der Quarz schwingt auch ohne das Display nicht(richtig).
Solche Probs hatte ich mit den 16F nicht.

Bin ich hier in eine typische Anfänger/Umsteigerfalle getreten???

Ich hoffe ich habe nichts übersehen (ANALOG/DIGITAL IO) an PortA.
Denn im Code finde ich gar nichts dazu kopfkratz

Vielen Dank für jeden Hinweis!

Gruß Mario

von Mario G. (rodenberger)


Lesenswert?

Hallo,
schade, kann meinen Beitrag nicht löschen.
Das Problem mit dem Quarz ist behoben.
LVP war enable und RB5 offen. Das passiert einem hoffentlich auch nur 
einmal.
Das Display funktioniert dann auch.

Gruß Mario

von Tobias P. (Gast)


Lesenswert?

Könnte jemand vielleicht den kompletten C Code reinstellen um das Ding 
zum laufen zu kriegen?

Wenn ich den Quellcode von 
http://www.frozeneskimo.com/electronics/2007/03/30/lc7981hd61830-driver-for-el-backlit-samsung-lcd/ 
nehme compiliert er zwar alles, aber wenn ich dann den ATmega32 
beschreiben will kommt folgende Fehlermeldung:

make.exe: *** No rule to make target `program'.  Stop.


Kann mir da jemand helfen? Wäre sehr nett. Danke schonmal.

von ewe (Gast)


Lesenswert?

make install ;)

von drckone (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

Habe folgendes Darstellungsproblem auf nem POllin GL16080 (LC7981):
Im GraphicMode läuft alles Top.
Nur Im Textmode ist in Spalte 14 "der Wurm drin".
Habt Ihr das auch?

Danke

von Tobias T. (Firma: codes4web) (roverfreak)


Angehängte Dateien:

Lesenswert?

Hey Leute ich habe ein kleines Problem!

Wenn ich einen Pixel setze, dann setzt das Display (beim Setzen eines
zweiten Pixel) 8px neben das erste auch wieder einen Pixel. Das liefert
mir einen unangenehmen "Schatten ^^" ...

Ich verwende LCD7981_Simple von Benedikt K., trotzdem anbei das
vermutlich verantwortliche C-File!

Danke
Lg
Tobias

von Ingo (Gast)


Lesenswert?

Hallo zusammen,

kann mir eventuell einer einen Tipp geben was ich falsch mache?

Wenn ich mein Display anschließe wird es komplett gefüllt und ich 
bekomme keine Zeichen drauf.

Kann mir eventuell auch einer sagen wie ich es richtig anschließen muss?
Was kommt an Pin3 (V0) ich habe diesen Pin mit Pin 18 Verbunden und das 
ding wird schwarz.

von Mario (Gast)


Lesenswert?

Hallo,

kann es sein dass einfach dein Kontrast zu hoch ist!?

von Thomas F. (igel)


Lesenswert?

Pin 18?
Meinst du evtl. Pin 17: Negative Voltage out?

An Pin 17 kommt ein Poti. Die andere "Seite" des Potis kommt an Masse. 
Der Mittenabgriff des Potis kommt dann an Pin 3.

Ich habe am Pin 3 eine Spannung von -8,3 V gegen Masse.

Thomas

von Ingo (Gast)


Lesenswert?

Vielen Dank für die Hilfe..

Wie schnell sind eure AVR's? Wenn ich das Display mit 8 MHz ansteuer 
(über nen Port Expander (I2C)) wird das Bild nicht wirklich schnell 
aufgebaut.

Oder mach ich was falsch?

Danke & Gruß

Ingo

von Εrnst B. (ernst)


Lesenswert?

Ingo schrieb:
> Oder mach ich was falsch?

Ja:
> über nen Port Expander (I2C)

Überleg mal, wie lang dein Expander braucht um auch nur ein Bit wackeln 
zu lassen.

von Riccardo Salzer (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Leute

habe auch ein LC7981 Display mit 240x128 pixel, habe mir schon code 
besorgt
jedoch habe ich ein Problem das das Display nicht richtig auf die 
240x128pixel initialisiert und es Vertikal nur 100 pixel genommen 
werden, danach wird einfach alles wieder geschrieben (siehe Bild)

Leider finde ich bei der initialisierung den fehler nicht, bzw. kann nur 
bei initialisierung liegen oder??

code liegt dabei!

wäre sehr dankbar wenn wer einen tipp hätte für mich!

LG Richi!

von Riccardo Salzer (Gast)


Lesenswert?

habe jetzt den code angesehn


also die initialisierung sieht jetzt so aus

<code>
  LCD_DATA     = 0;
  LCD_CTRL     = 0;
  LCD_CRTL_DDR |= (1 << LCD_RS) | (1 << LCD_RW) | (1 << LCD_EN) | 
(1<<LCD_CS) | (1<<LCD_RESET);
  _delay_us(100);
  LCD_CTRL     |= (1<<LCD_RESET);
  _delay_ms(100);


  lcd_en_passive();
  lcd_rs_data();
  lcd_rw_write();
  LCD_DIR_WRITE();




  lcd_mode = LCD_GRAPHIC_MODE;

    lcd_write_command(0x00,0x32);
    lcd_write_command(0x01,0x07);
    lcd_write_command(0x02,0xF0); // LCD Graph Widht --> 240/8 -1 set 
240!
    lcd_write_command(0x03,0x80); // LCD_GRaph- high --> war 80 set 128!
    lcd_write_command(0x08,0x00);
    lcd_write_command(0x09,0x00);
    lcd_write_command(0x0A,0x00);
    lcd_write_command(0x0B,0x00);


</code>


passt das so??

von Roland (Gast)


Lesenswert?

Ich hänge mich mal an den Thread an.

Ich habe das Display (Samsung LJ41-00192A_R2 Chassis) an einem 
16MHz-Controller hängen. Ich möchte das Display jetzt auslesen.

Die Prozedur läuft so ab:
1. Cursor an die Leseposition setzen. (Funktioniert auch)
2.
bic.b  #R_W, Control_Port
bis.b  #R_S+Enable, Control_Port
mov.b  #c_rd_data, Data_Out ; Kommando für Lesen schreiben
bic.b  #Enable, Control_Port ; Daten Lesen gesendet

3.
read_data_first_busy_check
call    #check_busy
bit.b   #0x80, R12        ; Busy?
jnz     read_data_first_busy_check

4.
bis.b  #Enable, Control_Port
bic.b  #R_S, Control_Port
bic.b   #Data_Pins, Data_Dir  ; Datenport auf Eingang
bis.b   #R_W, Control_Port
bic.b  #Enable, Control_Port
clr.b   Data_Out
mov.b   Data_In, R12
bic.b   #R_W, Control_Port    ; Display wieder auf Empfang
bis.b   #Data_Pins, Data_Dir  ; Datenport auf senden

Bis 3. funktioniert auch alles brav. Das Busy ist sauber auswertbar. 
Aber bei jedem Lesevorgang (4.) bekomme ich als Antwort nur 0x7f 
angeboten...

Zwischen Display DB0..7 und dem MSP sitzt ein 74HVC245/8, der auch 
korrekt umgeschaltet wird, wenn die R/W-Leitung des Displays auf "lesen" 
geht.

Hatte das schon mal jemand? Wie kritisch reagiert das Display auf 
Timings?

von Roland (Gast)


Lesenswert?

P.S: Ja, auch bei weiteren Lesevorgängen ohne die Schritte 0..3 kommt 
immer 0x7f zurück...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.