Forum: Compiler & IDEs I2C LCD an ATmega8 - Eichelmann Libary


von Udo (Gast)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

ich versuche vergebens ein LCD am I2C Bus mittels PCF8574 zum laufen zu 
bekommen.

Dazu verwende ich die Libary von Nico Eichelmann und Thomas Eichelmann.

Leider bekomme ich aber keine Zeichen auf das Display...
Die Belegung des PCF <> LCD ist bei mir etwas anders als in dem Beispiel 
der Libary.

Meine Belegung:
PCF >  7   6   5   4   3    2  1   0
LCD > DB7 DB6 DB5 DB4 Light E R/W  RS

Beispiel Belegung:
PCF >  7   6    5   4   3   2   1   0
LCD >  E Light R/W  RS DB7 DB6 DB5 DB4

Die LCD Befehle in der i2clcd.h habe ich dementsprechend angepasst.

Das LCD ist HD44780 kompatibel und die Kommunikation zum PCF 
funktioniert auch, die Hintergrundbeleuchtung kann ich schalten.

Vielleicht kann mir ja einer von euch helfen.

Gruße Udo

von Oliver S. (oliverso)


Lesenswert?

Udo schrieb:
> Beispiel Belegung:
> PCF >  7   6    5   4   3   2   1   0
> LCD >  E Light R/W  RS DB7 DB6 DB5 DB4
>
> Die LCD Befehle in der i2clcd.h habe ich dementsprechend angepasst.

Hast du nicht.
1
#define LCD_E_PIN      2


Oliver

von Udo (Gast)


Lesenswert?

Oliver S. schrieb:
> Hast du nicht.
> #define LCD_E_PIN      2


Meine Belegung:
PCF >  7   6   5   4   3    2  1   0
LCD > DB7 DB6 DB5 DB4 Light E R/W  RS

Passt doch?!

Udo

von Oliver S. (oliverso)


Lesenswert?

Ah, ok, ich habs andersrum verstanden.

Oliver

von Falk B. (falk)


Lesenswert?

@ Udo (Gast)

>PCF >  7   6   5   4   3    2  1   0
>LCD > DB7 DB6 DB5 DB4 Light E R/W  RS

Funktioniert nicht! Die Lib ist an der Stelle eine schöne Verarschung! 
Die Daten-Pins sind NICHT frei konfigurierbar wie z.B. bei Peter Fleurys 
LCD Ansteuerung! Die Defines sind irreführend!

Die Datenbits MÜSSEN auf P0-P3 liegen, allerdings sind die Steuerpins 
RS, RW und E dann auf den oberen Bits frei konfigurierbar.

PCF >  7   6   5   4   3    2  1   0
LCD > Light E R/W  RS DB7 DB6 DB5 DB4

von Falk B. (falk)


Lesenswert?

Ach ja, es ist auche in netter Bug drin, der nur deshalb nicht auffällt, 
weil die LCDs SEHR laaaaangsam sind bzw. 0ns Hold Zeit benötigen. Wer 
findet den Bug? ;-)
1
//-  Write byte to display with toggle of enable-bit
2
void lcd_write(unsigned char value)
3
{
4
  lcd_write_i2c(value | LCD_E);    //-  Set enable to high          
5
  lcd_write_i2c(value | LCD_E);    //-  Send data, keep enable high     
6
  lcd_write_i2c(value & (!LCD_E));  //-  Set enable to low  
7
}

Hier ist ein Leidensgenosse ebenfalls am Werk, wenn gleich auch nicht 
sonderlich erfolgreich, was vor allem an dem reichlich chaotischen 
Vorgehen liegt.

Beitrag "LCD am I2C Bus"

von Karl H. (kbuchegg)


Lesenswert?

Falk Brunner schrieb:
> Ach ja, es ist auche in netter Bug drin, der nur deshalb nicht auffällt,
> weil die LCDs SEHR laaaaangsam sind bzw. 0ns Hold Zeit benötigen. Wer
> findet den Bug? ;-)

Der ! müsste ein ~ sein.

Aber wo hast du den Ausschnitt her?
Im Zip-File des TO sieht die lcd_write so aus
1
void lcd_write(unsigned char value)
2
{
3
  lcd_write_i2c(value | LCD_E);    //-  Set enable to high          
4
  lcd_write_i2c(value | LCD_E);    //-  Send data, keep enable high     
5
  lcd_write_i2c(value & (LCD_E ^ 0xFF));  //-  Set enable to low    
6
  //lcd_write_i2c(value & (!LCD_E));  //-  Set enable to low  
7
}
ist also schon korrigiert.

Die Sache mit den Datenbits stimmt allerdings.
Das ist Verarsche. Die sind nicht konfigurierbar. Sonst müsste das hier
1
void lcd_putchar(unsigned char value)
2
{
3
  unsigned char lcddata;
4
  lcddata = value;
5
  lcddata >>= 4;
6
  lcddata |= LCD_RS;
7
  lcd_write(lcddata);
8
  lcddata = value;
9
  lcddata &= 0x0F;
10
  lcddata |= LCD_RS;
11
  lcd_write(lcddata);
12
}
ein bischen anders aussehen. Das geht dann nicht mehr so einfach mit um 
4 Bits shiften bzw verunden mit 0x0F

: Bearbeitet durch User
von Udo (Gast)


Lesenswert?

Vielen Dank für Eure Antworten!

Sollte es nicht gehen, da ich die LCD Kommandos in der header Datei 
angepasst habe?

Gibte es sonst einen anpassbare Quellcode den ihr mir empfehlen könnt?
Oder gibt es eine möglichkeit diesen so anzupassen das es funktioniert?

Gruß

von Karl H. (kbuchegg)


Lesenswert?

Udo schrieb:
> Vielen Dank für Eure Antworten!
>
> Sollte es nicht gehen, da ich die LCD Kommandos in der header Datei
> angepasst habe?

Was, genau, hast du denn jetzt eigentlich geändert und wie sieht die 
Sache jetzt aus? (Code + Verdrahtung)

Und warum vergreifst du dich an irgendwelchen Kommandos (was auch immer 
du damit meinst). An dem Teil gibt es nichts anzupassen oder zu 
verändern.

Es gibt nur 2 Möglichkeiten
Entweder du schliesst die Datenpins wie vorgesehen an den Pins 3 bis 0 
an, oder du schreibst die beiden Byte-Ausgabefunktionen so um, dass sie 
mit geänderter Pinbelegung klar kommen.
Für eines der beiden musst du dich entscheiden.
(Oder aber eine andere QUelle suchen, deren Programmierer nicht 
schlampig waren)

: Bearbeitet durch User
von Falk B. (falk)


Lesenswert?

@ Karl Heinz (kbuchegg) (Moderator)

>Der ! müsste ein ~ sein.

Spielverderber! Dass DU den Fehler findest stand ja wohl ausser Frage 
:-(

>Aber wo hast du den Ausschnitt her?
>Im Zip-File des TO sieht die lcd_write so aus

Ja, das ist aber nicht das Original aus dem Netz, da hat schon jemand 
dranrumgeändert. Und ich hätte einfach das ! gegen ~ getauscht. Nicht 
nur, weil es weniger Tipparbeit ist, sondern vor allem weil es 
inhaltlich "korrekter" ist. Denn ein ~0xFF invertiert ALLE Bits, auch 
die Daten. Damit ändern sich die EIngangssignal gleichzeitig zum E 
SIgnal am LCD. Es GEHT, weil die Haltezeit (Hold time) <=0ns ist, aber 
schön ist es nicht.

von Karl H. (kbuchegg)


Lesenswert?

Falk Brunner schrieb:
> @ Karl Heinz (kbuchegg) (Moderator)
>
>>Der ! müsste ein ~ sein.
>
> Spielverderber! Dass DU den Fehler findest stand ja wohl ausser Frage
> :-(

Ich muss gestehen, ich hab ein paar Sekunden gebraucht und wenn du nicht 
darauf aufmerksam gemacht hättest, hätte ich den wohl ein paar mal 
überlesen.

Aber zurück zu Udo

Wie sieht es denn jetzt aus?
Hast du die Datenleitungen umgelötet?
Das wäre der pragmatische Ansatz der einfachsten Veränderung (aus deiner 
Sicht)

Diese Änderung muss nicht bedeuten, dass dein LCD danach funktioniert. 
Da gibt es noch genug andere Möglichkeiten. Aber es ist eine der 
Voraussetzungen, dass es überhaupt je mit diesem Code funktionieren 
kann.

: Bearbeitet durch User
von Jörg L. (joelo_2014)


Lesenswert?

@ Udo

Hallo Udo,

zu deinem aktuellen Problem mit der Eichelmann Lib kann ich Dir jetzt 
auch nicht helfen. Dazu reichen meine Kenntnisse noch nicht aus.

Ich hatte aber wohl ein ähnliches Problem eine Lib für die LCD 
Ansteuerung via I2C zu finden. Außer LiquidCristal für Arduino war nix. 
Habe dann aber eine m.E. gute Lib gefunden:

http://davidegironi.blogspot.de/2013/06/an-avr-atmega-library-for-hd44780-based.html#.Uyw4gGd7MWM

Mit der habe ich sogar problemlos die billigen i2c LCD Adapter aus der 
Bucht für 2 Eus ans laufen gebracht. Vielleicht hilft es dir ja.

Gruß Jörg

von Udo (Gast)


Lesenswert?

Hallo zusammen,

danke für eure Antworten!
Bin leider heute erst wieder zum programmieren gekommen...

Besonderer Dank nochmal an Jörg, mit der Libary aus deinem Link hat es 
funktioniert!

Gruß Udo

von tomas (Gast)


Lesenswert?

Is this library usable for Atmega32? What i must do for it? I am newbie. 
Sorry for my english.

von Falk B. (falk)


Lesenswert?

Yes it is. There is no need for modifications, just connect to the real 
SDA/SCL pins of your AVR.

von Achim S. (achims)


Lesenswert?

Hallo Falk
deine Info ist falsch. Habe das Teil in den Griff bekommen. Es war 
eigentlich nur ein kleiner Fehler. Von Chaos kann man auch nicht 
sprechen. Du hattest die Arbeitskopie bekommen mit allen möglichen 
auskommentierten Versuchen. Es hat aber keiner angegeben was alles in 
den i2clcd.d/.c usw. geändert werden muss, so wie 16 Mhz oder so was wie 
"" statt <>. Der blödeste Fehler war aber lcd_init und i2clcd_init in 
der reihenfolge vertauscht war. Wie gesagt es geht jetzt wunderbar und 
das Chaos ist auch beseitigt.
achim

von Falk B. (falk)


Lesenswert?


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.