I2C-LCD von YwRobot

Hier können Sie ihre eigenen Projekte vorstellen
Antworten
Heinrichs
Beiträge: 173
Registriert: Do 21. Okt 2010, 18:31

I2C-LCD von YwRobot

Beitrag von Heinrichs » Di 9. Apr 2013, 13:36

Wenn man das Minidisplay oder ein anderes handelsübliches LCDisplay mit Hitachi-Standard an unsere Attiny-Platine anschließt, werden dadurch mindestens 6 Portanschlüsse belegt. Für viele Anwendungen ist das unproblematisch; hin und wieder gibt es aber Anwendungen, bei denen man um jeden Portanschluss kämpfen muss. In diesem Fall bietet es sich an, auf ein LCD zurückzugreifen, das sich über einen I2C-Bus ansteuern lässt. Dies gilt um so mehr, wenn man sowieso schon andere I2C-Geräte im Rahmen der Anwendung betreibt.

ywrobot1.jpg
Abb. 1: YwRobot-Platine
ywrobot1.jpg (14.58 KiB) 49968 mal betrachtet

Inzwischen gibt es eine Reihe solcher I2C-LCDs. Meist bestehen sie aus einem Standard-LCD, welches mit einer Zusatzplatine versehen ist. Auf dieser Platine findet man in der Regel einen PCF8574-Baustein oder etwas dazu Kompatibles (Abb. 1). Dieser Baustein kann ein Byte über das I2C-Protokoll empfangen und legt es als binäres Muster an seine Ausgänge P0 ... P7.

i2c-_cd2.jpg
Abb. 2: YwRobot-Display
i2c-_cd2.jpg (10.12 KiB) 49968 mal betrachtet

Das Display aus Abb. 2 habe ich für ca. 6 Euro aus China bezogen; es hat die Bezeichnung “YwRobot Arduino LCM1602 IIC V1". Es lässt sich über die 4 Anschlüsse, welche in Abb. 1 rechts zu sehen sind , problemlos an die Buchsenleiste unserer Attiny-Platine 2.0 anschließen. Die Anschlüsse für SDA und SCL werden über Patchkabel mit PortB.5 bzw. PortB.7 verbunden. Bitte vergessen Sie nicht die Brücken zu den Pull-Up-Widerständen!

Standardmäßig werden solche I2C-LCDs nicht von BASCOM unterstützt. Es gibt aber im Internet Libraries, die hier helfen sollen. BASCOM selbst verweist auf eine Library von Kent Andersson.

Um eine Library einzusetzen, muss man

1. die Library in das LIB-Verzeichnis von BASCOM kopieren
2. Die Library in sein BAS-Programm einbinden mit: $lib "Libraryname" (ohne Gleichheitszeichen).

In diesem Fall lautet der Name der Library “lcd-i2c.lib”. Wenn man diese Library in sein BAS-Programm einbindet, sollen die üblichen LCD-Befehle von BASCOM benutzbar sein. Leider funktioniert das bei dem YwRobot-Display überhaupt nicht; nach dem Start eines einfachen “Hello-World”-Programms wird kein Text angezeigt, lediglich die Hintergrundbeleuchtung flackert sehr heftig.

Einige Recherchen ergaben zwei Gründe für dieses Fehlverhalten. Kent Andersson geht bei seiner Library von folgender Verbindung zwischen PCF-Baustein und Display aus:

P0 -> D4
P1 -> D5
P2 -> D6
P3 -> D7
P4 -> RS
P5 -> RW (not used, set to 0 to ground for write)
P6 -> E2 (on 1 or 2 line display nc)
P7 -> E1(=E)

Die Zusatzplatine von YwRobot benutzt aber folgende Zuordnung:

P0 -> RS
P1 -> RW
P2 -> E
P3 -> BT (Backlight)
P4 -> D4
P5 -> D5
P6 -> D6
P7 -> D7

Im Wesentlichen sind also die beiden Halbbytes (Nibbles) vertauscht.

Glücklicherweise gibt es bereits eine leicht modifizierte Library, die ein beliebige Zuordnung von PCF-Ausgängen zu LCD-Eingängen über das BAS-Programm erlaubt (s. u.); damit lässt sich unser Zuordnungsproblem lösen.

backlight.jpg
Abb. 3: Schaltskizze für Backlight-Kontrolle (BT)
backlight.jpg (37.56 KiB) 49964 mal betrachtet

Der Vergleich der Zuordnungstabellen macht ein weiteres Problem sichtbar: Die Backlight-Kontrolle bei YwRobot (BT) gibt es selbst bei der modifizierten Fassung von Kent Anderssons Library nicht; die entsprechende Signalleitung (E2) wird hier zur Ansteuerung einer möglichen 3. bzw. 4. LCD-Zeile benutzt. Ein Blick in die Library zeigt, dass das Signal auf dieser Leitung immer wieder seinen Pegel wechselt; dies erklärt auch das heftige Blinken des Displays beim ersten Test. Um dieses Blinken zu beseitigen, habe ich die modifizierte Library nochmals ergänzt: Bevor ein Byte mit dem i2csend-Befehl an die YwRobot-Platine geschickt wird, wird das BT- bzw. E2-Bit immer auf 1 gesetzt. Dadurch bleibt der Transistor (vgl. Abb. 3) durchgeschaltet, der Anschluss LED- des Displays bleibt auf Masse gezogen und die Hintergrundbeleuchtung bleibt eingeschaltet.

Code: Alles auswählen

' Test-Datei für Attiny-Platine 2.0 mit I2C-LCD von E. Eube, G. Heinrichs und U. Ihlefeldt
'----------------------------------------------------------------------------

$regfile = "attiny2313.dat"                                 'Attiny2313
$crystal = 4000000                                          '4 MHz
$lib "YLcd_i2c.lib"                                         'YwRobot Treiber für LCD

$hwstack = 64
$swstack = 10
$framesize = 40


'**********************************************************
'******************* Deklarationen ************************

Const Pcf8574_lcd = 78                                      'Adresse des I2C-LCDs
Dim _lcd_e As Byte
_lcd_e = 128

Const Pcf_d4 = 4                                            'Pinzuordnung PCF8574 -> LCD
Const Pcf_d5 = 5
Const Pcf_d6 = 6
Const Pcf_d7 = 7
Const Pcf_rs = 0
Const Pcf_rw = 1
Const Pcf_e2 = 3                                            '3./4. Zeile bzw. Backlight
Const Pcf_e1 = 2                                            'E

'****************** Initialisierung ***********************

Ddrb = &B11111111                                           'Standardbelegung der DDRs
Ddrd = &B01110000                                          
Portd = &B10001111                                         

Config Scl = Portb.7                                        'Konfigurieren von I2C
Config Sda = Portb.5

Config Lcd = 16 * 2
Config I2cdelay = 1

'warte bis Kondensator bei Ta0 geladen, auch für LCD-Init:
Waitms 300                                                 

'**********************************************************
'******************** Hauptprogramm ***********************

Cls
Lcd "Hello world!"
Locate 2 , 1
Lcd "2. row..."
End

Dateianhänge
YLcd_i2c.zip
BASCOM-Library für das YwRobot-I2C-LCD
(1.3 KiB) 4420-mal heruntergeladen
Zuletzt geändert von Heinrichs am Mo 25. Nov 2019, 11:39, insgesamt 2-mal geändert.

Heinrichs
Beiträge: 173
Registriert: Do 21. Okt 2010, 18:31

Re: I2C-LCD von YwRobot

Beitrag von Heinrichs » Fr 12. Apr 2013, 18:02

Ich habe den I2C-LCD-Treiber noch ein weiteres Mal überarbeitet. Die YwRobot-spezifische Pinzuordnung ist nun in den Treiber integriert worden; somit entfallen die Konstanten pcf_dx in den BAS-Programmen. Ebenso entfällt jetzt auch die Variable _lcd_e. Außerdem kann nun mithilfe einer neuen Variablen lcd_backlight die Hintergrundbeleuchtung ein- bzw. ausgeschaltet werden.

Beim Ein- bzw. Ausschalten der Hintergrundbeleuchtung ist zu beachten: Der Zustand der Variablen lcd_background wird erst durch einen folgenden LCD-Befehl (z. B. locate..., lcd "...") an das LCD übermittelt. Standardmäßig wird lcd_backlight beim Initialisieren des LCDs durch die Library auf 1 gesetzt, so dass die Hintergrundbeleuchtung beim Start automatisch eingeschaltet wird.

Ansonsten muss der Treiber wie üblich in BASCOM eingebunden werden, und es müssen die üblichen Konfigurationen für I2C und das LCD vorgenommen werden. Details findet man in dem folgenden "Hello-World"-Programm.

Code: Alles auswählen

' Datei für Attiny-Platine 2.0 mit I2C-LCD von E. Eube, G. Heinrichs und U. Ihlefeldt
' Hello-World-Programm für I2C-LCD von YwRobot
'
' Die in der Deklaration benutzten Bezeichner werden von der Library benutzt und dürfen
' nicht verändert werden.
'
' Die Hintergrundbeleuchtung kann mithilfe der Variablen lcd_backlight ein- und ausgeschaltet werden;
' allerdings wird der Zustand dieser Variablen erst durch einen folgenden LCD-Befehl
' (z. B. locate, lcd "...") an das LCD übermittelt.
' Standardmäßig wird lcd_backlight beim Initialisieren des LCDs durch die Library
' auf 1 gesetzt, so dass die Hintergrundbeleuchtung beim Start automatisch eingeschaltet wird.
'----------------------------------------------------------------------------

$regfile = "attiny2313.dat"                                 'Attiny2313
$crystal = 4000000                                          '4 MHz
$lib "YwRobot_Lcd_i2c.lib"                                  'YwRobot Treiber für LCD

$hwstack = 64
$swstack = 10
$framesize = 40


'**********************************************************
'******************* Deklarationen ************************

Const Pcf8574_lcd = 78                                      'Adresse des I2C-LCDs
Dim Lcd_backlight As Byte                                   '1 = an; 0 = aus. Wird erst durch einen LCD-Befehl umgesetzt!

'****************** Initialisierung ***********************

Ddrb = &B11111111                                           'Port B als Ausgangsport
Ddrd = &B01110000                                           'D4, D5, D6 als Ausgang; Rest als Eingang
Portd = &B10001111                                          'Eingänge auf high legen

Config Scl = Portb.7                                        'Konfigurieren von I2C
Config Sda = Portb.5

Config Lcd = 16 * 2                                         'nicht unbedingt nötig
Config I2cdelay = 1

Waitms 300                                                  'warte bis Kondensator bei Ta0 geladen, auch für LCD-Init!


'**********************************************************
'******************** Hauptprogramm ***********************

Cls
Lcd "Hello world!"
Wait 1
Lcd_backlight = 0
Locate 2 , 1
Lcd "2. row..."
Wait 2
Lcd_backlight = 1
Locate 1 , 1                                                'Damit Backlight-Zustand an LCD übermittelt wird
End
Dateianhänge
YwRobot_Lcd_i2c.zip
BASCOM-Library für das YwRobot-I2C-LCD (Version 2)
(1.11 KiB) 5186-mal heruntergeladen
Zuletzt geändert von Heinrichs am Sa 18. Feb 2023, 11:46, insgesamt 1-mal geändert.

sunny12
Beiträge: 1
Registriert: So 8. Apr 2018, 14:25

Re: I2C-LCD von YwRobot

Beitrag von sunny12 » Di 10. Apr 2018, 18:49

Hallo Heinrichs,

Super Arbeit. Die letzte Lib funktioniert super mit meinem Display.

nur das habe ich in meinem Programm geändert damit es funktionierte

$regfile = "m2560def.dat"
$crystal = 16000000
$hwstack = 40
$swstack = 16
$framesize = 32
$lib "YwRobot_Lcd_i2c.lib" 'YwRobot Treiber für LCD




'**********************************************************
'******************* Deklarationen ************************

Const Pcf8574_lcd = 78 'Adresse des I2C-LCDs
Dim Lcd_backlight As Byte '1 = an; 0 = aus. Wird erst durch einen LCD-Befehl umgesetzt!

'****************** Initialisierung ***********************

'Ddrb = &B11111111 Auskommentiert 'Port B als Ausgangsport
'Ddrd = &B01110000 Auskommentiert 'D4, D5, D6 als Ausgang; Rest als Eingang
'Portd = &B10001111 Auskommentiert 'Eingänge auf high legen


'Konfigurieren von I2C
Config Sda = Portd.1
Config Scl = Portd.0
Config Lcd = 16 * 2 'nicht unbedingt nötig
Config I2cdelay = 1

Waitms 300 'warte bis Kondensator bei Ta0 geladen, auch für LCD-Init!


'**********************************************************
'******************** Hauptprogramm ***********************

Cls
Lcd "Hello world!"
Wait 1
Lcd_backlight = 1
Locate 2 , 1
Lcd "2. row..."
Wait 2
Lcd_backlight = 1
Locate 1 , 1 'Damit Backlight-Zustand an LCD übermittelt wird
End




Da das Display über I2C angesprochen wird, gibt es da nicht eine Möglichkeit
deine YwRobot_Lcd_i2c.lib soweit zu verändern, das man damit 2 oder mehere
I2C-Display´s ansprechen kann?

Ich habe mir mal deine Lib im editor angeschaut. Leider kann ich kein ASM.

Ich habe auch versucht die "Const Pcf8574_lcd = 78" Adresszuweisung über eine Variable
zu realisieren
Dim I2C_Adresse as Byte
Dim LCD1_I2C_Adresse as Byte
Dim LCD2_I2C_Adresse as Byte
Dim LCDx_I2C_Adresse as Byte

Do usw.

z.B. Pcf8574_lcd = I2C_Adresse
Loop

End


Aber leider geht das so nicht in Bascom
Kannst du mich verstehen was ich meine?

MIt deiner Lib ist das Ansprechen des I2C LCD so einfach wie das ohne I2C Display.

Danke für Deine Hilfe.

Viele Grüße

Sunny12

Heinrichs
Beiträge: 173
Registriert: Do 21. Okt 2010, 18:31

Re: I2C-LCD von YwRobot

Beitrag von Heinrichs » Mo 25. Nov 2019, 11:36

Es gibt eine Reihe von weiteren I2C-LCD-Adapter, welche dieselbe Pinzuordnung wie bei dem YwRobot-Modul benutzen. Hier eine (vermutlich unvollständige) Liste
  • YwRobot
  • FC-113 - QAPASS
  • MH - QAPASS
Bei diesen Boards können Sie die oben angegebenen Libraries benutzen.

Antworten