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?
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
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.
Äh, Display läuft. Ich hatte einen Dreher bei DB6<>DB7 :-/
@Benedikt Würdest du deinen Source veröffentlichen? Gruß Sascha
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); |
@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
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.
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?
> BTW, kennt jemand eine Quelle für freie 8x8-Bitmap-Fonts?
Früher™ hat man die einfach aus seiner VGA-Karte ausgelesen :-)
Ja, aber dann sind die Fonts immer noch nicht frei©
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
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
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?
> 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
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!
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......
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.
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.
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
Hallo, hat denn jemand das Touch Panel benutzt? Gruß Sascha
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.
Jep, beide defekt. Erklärt, warum in der Beschreibung nichts vom TouchPanel drin stand :( Gruß Sascha
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)
muss den Beitrag mal auf die vorderen Plätze rücken, um nicht vergessen zu werden
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.
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
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...
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
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...
Aha, passt gut. Nun muss ich mal versuchen, wie ich den engl. Text dazu passend übersetzen kann.
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
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
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.
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
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
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.
Hallo, kann es sein dass einfach dein Kontrast zu hoch ist!?
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
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
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.
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!
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??
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?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.