Hallo, seit ein paar Tagen versuche ich erfolglos ein 4-zeiliges LCD über einen I2C-Portexpander zum Laufen zu bekommen. Verschaltet ist das lcd nach "Arduino" I2C-Adresse 0x4E PCF8574 LCD 4x20 P0--------RS P1--------R/W P2--------E P3-frei P4--------DB4 P5--------DB5 P6--------DB6 P7--------DB7 Es zeigen sich mir zwei Fehler: a) die Anzeige leuchtet nicht und -> Gerne hätte ich das lcd beleuchtet b) der String "HI WORLD" tackert rückwärts in die 3. Zeile rein -> Gerne hätte ich es vorwärts in die erste Zeile Frage: wo liegt der Fehler? gruß peter
:
Bearbeitet durch User
Hi Denke, Du sprichst nicht richtig mit dem I2C-Interface. Meines hat z.B. auf Bit3 die Hintergrundbeleuchtung. (also Bit3 des Port-Expander !!, weshalb das Display im 4-bit-Modus läuft) Wobei, wenn bei Dir der Text korrekt auch wenn nur irgendwo) auf dem Display auftaucht, sollte das Groh passen. Denke, Dann hast Du 'nur' bei der Einstellung zur beschreibenden Adresse und zum Shiften einen Fehler - also, daß die ganze Anzeige verschoben wird, statt der Cursor. Zu den I2C-Adaptern: https://arduino-info.wikispaces.com/LCD-Blue-I2C?responseToken=adca7f9a704caceaac1fe248d780540f MfG Mein Display hat die gleiche I2C-Adresse, schau mal dort: // Get the LCD I2C Library here: // https://bitbucket.org/fmalpartida/new-liquidcrystal/downloads // Move any other LCD libraries to another folder or delete them // See Library "Docs" folder for possible commands etc.
:
Bearbeitet durch User
Hallo, hmm. Wenn ich das LCD kurz vom Strom nehme, dann leuchtet es und es wird mit 5V versorgt. Sein Kontrast läßt sich mit einem Trimmer einregeln. Irgendwie glaube ich, daß ab jetzt ein lcd-command für die Beleuchtung zuständig ist. peter
Hallo, tatsächlicht, Bit3 vom Expander im debug-modus gesetzt ist die Beleuchtung. Vielen Dank! Blöd ist nur dass mir im Moment eine geeignete Idee fehlt, wie ich das Bit3 außerhalb von debug dauerhaft zu setzen vermag. peter
In datei i2clcd.c:
1 | #define LCD_EMPTY_PIN LCD_BACKLIGHT_ALWAYS_ON
|
2 | |
3 | //- Write data to i2c
|
4 | void lcd_write_i2c(unsigned char value) |
5 | {
|
6 | i2c_start_wait(LCD_I2C_DEVICE+I2C_WRITE); |
7 | i2c_write(value | LCD_BACKLIGHT_ALWAYS_ON); |
8 | i2c_stop(); |
9 | }
|
oder du schreibst eine Funktion in der man Backlight ein und ausschalten kann:
1 | #define LCD_EMPTY_PIN LCD_BACKLIGHT_PIN
|
2 | static unsigned char backlight = 0; //Anfangszustand AUS |
3 | |
4 | void lcd_set_backlight(bool b){ |
5 | if(b) backlight = LCD_BACKLIGHT_PIN; |
6 | else backlight = 0; |
7 | }
|
8 | |
9 | |
10 | //- Write data to i2c
|
11 | void lcd_write_i2c(unsigned char value) |
12 | {
|
13 | i2c_start_wait(LCD_I2C_DEVICE+I2C_WRITE); |
14 | i2c_write(value | backlight); |
15 | i2c_stop(); |
16 | }
|
Hi Da der von mir oben gepostete Link (aus der Lib) nirgends hin zeigt ... https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/Home Da dürftest Du schon Mehr finden :) Das mit der Hintergrundbeleuchtung ist doch gar nicht so kompliziert: Bei jedem zu übertragenem (Halb-)Byte hast Du Bit3 gesetzt. Mehr ist es wirklich nicht (hätte ich aber so auch nicht erwartet). In der verlinkten Lib ist Das direkt integriert (quasi per 'oder Backlight' wird das Bit gesetzt). MfG
:
Bearbeitet durch User
Hallo, dass das gar nicht so kompliziert ist stimmt schon. Am kniffligsten war für mich jetzt PD3 am Expander herauszufinden. Ich habe halt Schwierigkeiten mich zu orientieren. Das liegt einfach daran, weil mir zu viel neu ist bzw. ich sowas zu selten anpacke. Inzwischen kam ich durch zweimal Ausprobieren auch auf die zentrale Funktion lcd_write_i2c(). Vielen Dank für den Code, ich werde mein Gestoppel mal mit deinen Vorschlägen vergleichen. Vielleicht kann ich zum Abschluß sogar ein OSI-Schichtenmodell erkennen und diesbezüglich meine a/d-wandlung und mein Fast-PCM mit Rampe für AC-Motor überdenken, bevor ich als nächstes NMEA0183 (RxD/TxD) anpacke. Was noch komplett fehlt wäre eine CAN-SSt auf normalen Datenports. Aber das ist mir im Moment wirkich zu viel. Davor mache ich erst mal einen Regelkreis mit Filtern zur Kompensation. Peter
Hallo, ich hab mal wieder vor dem Programm gesessen. Neben noch entfernten Bugs muß ich wohl eine Funktion aus i2clcd.c neu schreiben: lcd_getlr(), weil ich statt einem 16-spaltigen ein 20-spaltiges Display nutze. Dabei scheitere ich zur Zeit an der Hürde, mit if einen Intervall abzufragen: lcddata=0x54; PORTC=lcddata; if ((lcddata >= LCD_LINE1)&&(lcddata < (LCD_LINE1+LCD_ROWS)));// 0x00 ... 0x14 { *line=1; *row=(lcddata-LCD_LINE1)+1;// 0x01 PORTC=(lcddata-LCD_LINE1)+1;// 0x00 - 0x00 + 0x01 return true; } Leider springt mein Programm mit dem Wert 0x54 in die if-Sequenz rein, was aber nur bei Werten zwischen 0x00 bis 0x13 passieren soll. Wie ginge das Können zum Wollen? Gruß Peter
Beitrag #4933969 wurde vom Autor gelöscht.
Hallo, ganz genau, ein Bug durchs Kommentieren, Mist. Vielen Dank! Noch eine Frage, es hakt immer noch der Zeilenvorschub, i2clcd.c ab Zeile 242: //- Go to nextline (if next line > LCD_LINES return false) bool lcd_nextline(void) { unsigned char line = 0x00, row = 0x00; lcd_getlr(&line, &row); PORTC=line; // siehe lcd_main, erwünschter Ausgabewert: 0x01, 0x02, 0x03 // aaber: // original mit switch/case: lcd_getlr zählt 0x01, 0x02, 0x00 // meine eigene, mit if: lcd_getlr zählt 0x01, 0x02, 0x01 if (!lcd_gotolr(line + 1, 1)) return false; else return true; } Womit habe ich mich jetzt übernomen? Irgendwie komme ich mit der Adressierung bzw. der Adressenabfrage der LCD noch nicht klar
Hallo, ich finde, auffällig ist das Datenauslesen aus dem LCD. Könnte es sein, dass ich zweimal hintereinander das höherwertige Nibble abfrage (statt zuerst das höherwertige und dannach das niederwertige) und aus den beiden Nibbeln dann ein fehlerhaftes Byte zusammensetze? Peter
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.