ATMega8 und LCD mittels I2C ansteuern

LK61

Neues Mitglied
10. Juli 2018
6
0
1
Hallo,

bisher steuerte ich meine LCD-Displays immer direkt im 4Bit Modus an den Portpins der ATMegas.
Beim letzten Kauf lag dem LCD-Modul 16x2 ein I2C Baustein mit dem PCF8574T bei.

Im Internet fand ich auch diesen Code zum Ansteuern des Displays.



CodeBox BascomAVR
 $lib "Lcd_i2c.lib"                                         'ersetzt die Standard LCD Library
 $regfile = "m8def.dat"
 $crystal = 8000000
 Const Pcf8574_lcd = &H40                                   'I2C Adresse
 Led Alias Portd.5
 Config Led = Output
 Config Scl = Portc.5                                       'I2C SCL Pin
 Config Sda = Portc.4                                       'I2C SDA Pin
 Dim I As Byte
 Dim _lcd_e As Byte
 _lcd_e = 128                                               'LCD im 4-Bit Mode betreiben
 Cls
                                                      'loesche das LCD Display
 Locate 1 , 1                                               'Cursor auf 1 Zeile, 1 Spalte
 Lcd "Hello Welt"                                           'String auf Display anzeigen
 Do
   Wait 1
   Toggle LED
   Waitms 10
   toggle LED
 loop
 End


A0-A2 habe ich auf Masse gelegt, damit ich die Adresse H40 verwenden kann. An SDA und SCL befinden sich jeweils 5K Widerstände gegen Ub. Wenn ich nun das Programm in den ATMega8 einspiele, blinkt der Cursor an Position 3. Das Display wird dunkel. (Die Hintergrundbeleuchtung geht aus). Mehr Effekt passiert nicht. Um das Programm und die Taktfrequenz zu kontrollieren, lasse ich dann in einer Endlosschleife eine LED im "SEKUNDENTAKT" blinken. Was diese auch erfolgreich tut.
Wenn ich die Adresse 40 ändere, passiert mit der Anzeige nichts. Daher gehe ich schon mal davon aus, dass diese korrekt ist. Ich habe mir schon das Datenblatt des PCF8574 mehrmals durchgelesen. Ich kann den Fehler nirgends entdecken. Hat das etwas damit zu tun, dass es ein PCF8574T ist? Ich finde nur Hinweise über den Unterschied zum A. Vielleicht gibt es ja jemanden, der sich damit besser auskennt als ich. Ich weiß mir zur Zeit keinen Rat mehr. Das Ganze ist auf einem Experimentierboard aufgebaut, so dass ich kein Foto der Platine posten kann.

Vielen Dank schon mal fürs Lesen.

Gruß LK
 
Hat das etwas damit zu tun, dass es ein PCF8574T ist?
Also wenn ich das so auf die Schnelle richtig aus dem Datenblatt gelesen habe...
PCF8574 ist erstmal der eigentliche IC.
Danach kann ein A folgen, oder eben nicht. Ohne A gilt als Adresse |0|1|0|0|A2|A1|A0|R/W. Mit A gilt 0|1|1|1|A2|A1|A0|R/W.
Danach folgt das Package-Kürzel:
  • P für DIP16
  • T/3 für SO16
  • TS/3 für SSOP20
Du hast also den ohne A (Adresse 0x40+[A2..A0]+R/W) als 16er SOIC...
 
Hallo,

danke erst mal für die Info. Ja, es ist ein SO16 verbaut. In dem Datenblatt steht auch PCF8574T und PCF8574AT. Deshalb ging ich auch von der Annahme ohne A aus und verwende die Adresse H40 für die Ausgabe bei A0-A2=GND. Das habe ich zur Sicherheit auch gemessen. Nun besteht der Fehler aber immer noch und ich bin keinen Schritt weiter. Vielleicht liegt der Fehler ja in der Lcd_i2c.lib. Aber in dem Beispiel wurde nichts von einem BUG geschrieben. Hat denn schon mal jemand mit dieser Libary solch Anzeige zum Laufen bekommen?

Gruß LK
 
Es sind quasi identische ICs, nur die Basis-Adresse unterscheidet sich. Das sollte auch direkt auf dem Chip stehen. PCF8575T (ohne A bei Dir).
Zu Deiner Bibliothek kann ich nichts sagen. Denkbar wäre, daß hier die 7bit-Adresse erwartet wird (also 0x20).
AFAIR gabs hier im FAQ-Bereich schon mal versuche mit LCDs an Portexpandern - vielleicht suchst Du mal da (gibt bei den FAQs 'n Übersichts-Fred).
Wir hatten vor kurzem auch mal jemanden hier, wo die Verdrahtung zwischen Display und PCF vom "Standard" abwich - da gabs auch irgend'ne anpaßbare Modifikation irgendeiner Bibliothek...
 
Hallo,

die Bibliothek Lcd_i2c.lib ist eine mit installierte von BASCOM und befindet sich im Folder LIB. Ich habe jetzt mal die Kontaktierung der Ports vom I2C zum LCD kontrolliert. Das passt absolut nicht mit den Definitionen der Bibliothek.
Ich habe 4 LCDs gekauft. Alle unterschiedliche Verkäufer.(China). Alle die gleiche Verdrahtung. Da das Zeug Massenware ist, dachte ich, das Ansprechen wäre einfacher und ich könnte auf die Erfahrungen anderer zurückgreifen. Sozusagen etwas "stibitzen" :)
Na ja, ich mach das eigentlich bloß Interessenhalber. Ich hätte mich gefreut, wenn es einfache gewesen wäre.

Danke für Deine Mühe. Ich werde jetzt versuchen, die Lib anzupassen. Wenn ich da scheitere, weiß ich auch nicht weiter.

Ciao LK
 
Hallo,

ich habe mal die Pins dieser Schaltung ausgemessen.

PCF - LCD
P0 = RS
P1 = RW
P2 = E
P3 = (An Transitor Hintergrundbeleuchtung)
P4 = D4
P5 = D5
P6 = D6
P7 = D7

Vielleicht interessiert es ja jemanden...

Gruß LK
 
Noch was.
$lib "i2c_twi.lbx" ist für Hardware TWI geschrieben. Somit deine Pin Belegung okay. Würde aber noch folgendes einfügen.
Config Twi = 100000 ' Init TWBR und TWSR
und
TWI gleich einschalten, das macht Bascom ansonsten erst beim I2CStart !
TWCR = &B00000100 ' nur TWEN setzen

Im Anhang noch ein Anschlussbildchen.

Natürlich auch ein LCD- Text in die Hauptschleife einbinden.
Gruß
 

Anhänge

  • Bild.jpg
    Bild.jpg
    146,5 KB · Aufrufe: 30
Hallo,

danke für den Tipp, aber die i2c_twi.lbx hab ich schon gesucht. Die finde ich nur für 13 EUR als Kaufversion. Dein Anschlußbildchen stimmt mit meiner Belegung leider nicht überein.

@LotadaC Danke - da muss ich mich erst mal durcharbeiten. Sieht erst mal kompliziert aus...
 
Hallo,

ich möchte allen danken, welche mich hier so freundlich unterstützt haben.

Die EBAY-Module weichen tatsächlich von der Standard-Verdrahtung ab.

Es gibt eine Bibliothek, welche diese unterstützt.

Dieser Code als Beispiel funktionierte auf Anhieb bei mir mit einem ATMega8



CodeBox BascomAVR
$regfile = "m8def.dat"                                      'ATMega8
$crystal = 8000000                                          '8 MHz
$lib "YwRobot_Lcd_i2c.lib"                                  'YwRobot Treiber für LCD
$hwstack = 64
$swstack = 10
$framesize = 40

'**********************************************************
'******************* Deklarationen ************************
Const Pcf8574_lcd = &H40                                    'Adresse des I2C-LCDs  A0 - A2 =0
Dim Lcd_backlight As Byte                                   '1 = an; 0 = aus. Wird erst durch einen LCD-Befehl umgesetzt!
'****************** Initialisierung ***********************
Config Scl = PortC.5                                        'Konfigurieren von I2C
Config Sda = PortC.4
Config Lcd = 16 * 2                                         'nicht unbedingt nötig
Config I2cdelay = 1
Waitms 300                                                  'warte bis LCD-Initialisiert ist!


'******************** Hauptprogramm ***********************
Cls
Lcd "Hallo BASCOM LK"
Wait 1
Lcd_backlight = 0
Locate 2 , 1
Lcd "Thanks for help"
Wait 2
Lcd_backlight = 1
Locate 1 , 1                                                'Damit Backlight-Zustand an LCD übermittelt wird
Do
nop
Loop
End


Mittlerweile habe ich es auch mit einem 4x20 LCD getestet. Ebenfalls problemlos.
 
Zuletzt bearbeitet:
Hallo LK61,

auch wenn dieses Thema schon etwas älter ist, nutze ich diesen Beitrag, weil ich mit meinem LCD
Display (4*20 Zeichen am Pcf8574) ähnliche Probleme habe.

Ich nutze auch die "YwRobot_Lcd_i2c.lib". Leider stürzt mein Display häufiger ab (2 weiße Balken oder wirre Zeichen)
Das passiert meistens, wenn ich Programmänderungen auf den Chip "brenne" und dem Neustart des Chips.

Da hilft oft nicht mal ein Resett des Chips.
Erst nach Aus- und Wiedereinschalten der Stromversorgung des Boards funktioniert das Display wieder normal.

Oft funktioniert es auch auf Anhieb.

Gibt es da mittlerweile eine bessere Libary, oder kann ich noch etwas anders überprüfen?

Gruß Ds1074
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)