Forum: Mikrocontroller und Digitale Elektronik 4x20-LCD läuft nicht richtig


von Peter T. (p-ummel)


Angehängte Dateien:

Lesenswert?

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
von Stefan (Gast)


Lesenswert?

Und wo hast du die Beleuchtung angeschloßen ?

von Patrick J. (ho-bit-hun-ter)


Lesenswert?

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
von Peter T. (p-ummel)


Lesenswert?

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

von Peter T. (p-ummel)


Lesenswert?

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

von aSma>> (Gast)


Lesenswert?

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
}

von Patrick J. (ho-bit-hun-ter)


Lesenswert?

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
von Peter T. (p-ummel)


Lesenswert?

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

von Peter T. (p-ummel)


Lesenswert?

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

von Pete K. (pete77)


Lesenswert?

Semikolon hinter if entfernen?

Beitrag #4933969 wurde vom Autor gelöscht.
von Peter T. (p-ummel)


Angehängte Dateien:

Lesenswert?

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

von Peter T. (p-ummel)


Lesenswert?

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
Noch kein Account? Hier anmelden.