GrafikDisplay mit LC7981; Darstellungsprobleme

OP #1014417
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?
OP #1014602
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
#1027494
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);
OP #1027531
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?
Persönliche Seite #1029125
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
Angehängte Dateien:
OP #1029262
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?
Persönliche Seite #1029276
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......
#1029372
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.
#1030128
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.
Gast #1312033
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)
#1327131
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.
Angehängte Dateien:
#1328994
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...
Gast #1334591
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
#1353021
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
Gast #1369137
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.
(Firma: codes4web) #1519472
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
Angehängte Dateien:
Gast #1539161
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.
Gast #1541229
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
Gast #2121485
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!
Angehängte Dateien:
Gast #2122378
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??
Gast #2471202
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?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren