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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Peter T. (p-ummel)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
Und wo hast du die Beleuchtung angeschloßen ?

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


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
Semikolon hinter if entfernen?

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


Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.