I2C-LCD von YwRobot

Hier können Sie ihre eigenen Projekte vorstellen

I2C-LCD von YwRobot

Beitragvon Heinrichs » Di 9. Apr 2013, 11: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) 10108-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) 10108-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.

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) 10104-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) 1142-mal heruntergeladen
Heinrichs
 
Beiträge: 70
Registriert: Do 21. Okt 2010, 16:31

Re: I2C-LCD von YwRobot

Beitragvon Heinrichs » Fr 12. Apr 2013, 16: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) 1224-mal heruntergeladen
Heinrichs
 
Beiträge: 70
Registriert: Do 21. Okt 2010, 16:31


Zurück zu Projekte

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast

cron