Liste der Anhänge anzeigen (Anzahl: 1)
LCD-Hintergrundbeleuchtung funktioniert nicht
Hallo zusammen,
habe ein ANAG VISION AV1640 16x4 LCD-Modul per I2C-Port-Expander PCF8574P im 4-Bit-Modus an eine C-Control Pro 128 angeschlossen - gemäß angehängtem Schaltplan.
Funktioniert alles wunderbar, nach 3 Tagen Kopfarbeit weiß ich nun auch, wie die Kommunikation abläuft und wie das LCD Befehle und Daten entgegen nimmt.
Eines will aber einfach nicht laufen: die LCD-Hintergrundbeleuchtung. Wenn ich Pin 15 mittels der Funktion LCD_EnableBL() auf high (0b10000000) schalte, sollte der BC557B doch von Emitter auf Kollektor durchschalten. Das Display bleibt jedoch dunkel, auch ein Ersetzen des Transistors durch eine Brücke hilft nicht.
Das Display sollte auf jeden Fall eine Beleuchtung besitzen, es hat ja auch 16 Pins.
Was mache ich falsch?
Wenn es hilft, hier noch mein Code:
Code:
#define I2C_PCF_ADDR 0x40 'Slave-Adresse des PCF8574P
#define LCD_BL 0b10000000 'Backlight high
#define LCD_ENABLE 0b01000000 'Enable high
#define LCD_RS 0b00100000 'RS high = Datenausgabe
#define LCD_RW 0b00010000 'R/W high = Lesemodus
Sub main()
I2C_Init(I2C_100kHz)
LCD_Init_I2C()
LCD_Clear_I2C()
LCD_EnableBL_I2C() '<-- Funktioniert nicht!
End Sub
Sub LCD_Init_I2C()
'Initialisierungssequenz für 4-Bit-Modus.
I2C_Out(0x3)
AbsDelay(1)
I2C_Out(0x3 + LCD_ENABLE)
AbsDelay(1)
I2C_Out(0x3)
I2C_Out(0x2 + LCD_ENABLE)
I2C_Out(0x2)
'*** 4-Bit-Modus ***
'DISPLAY ON/OFF CONTROL
'Display ein, Cursor aus, Blinken aus
LCD_Write_I2C(0, 0b00001100)
'FUNCTION SET
'4-Bit-Modus, 5x7 dots?, F=0?
LCD_Write_I2C(0, 0b00101000)
End Sub
Sub LCD_Clear_I2C()
'Display löschen und Cursor zurücksetzen.
LCD_Write_I2C(0, 0b00000001)
LCD_Write_I2C(0, 0b00000010)
End Sub
Sub LCD_EnableBL_I2C() '<-- Funktioniert nicht!
LCD_Write_I2C(0, LCD_BL)
End Sub
Sub LCD_Write_I2C(bRS As Byte, bData As Byte)
'RS high (bRS = 0x20) für Datenausgabe
'RS low (bRS = 0x00) für Befehlsübergabe
'bData enthält Befehle u./o. Daten
Dim bDataOut As Byte
'*** High Nibble ***
bDataOut = bRS Or (bData >> 4)
I2C_Out(bDataOut)
bDataOut = bDataOut + LCD_ENABLE
I2C_Out(bDataOut)
AbsDelay(1)
bDataOut = bDataOut - LCD_ENABLE
I2C_Out(bDataOut)
AbsDelay(1)
'*** Low Nibble ***
bDataOut = bRS Or (bData And 0b00001111)
I2C_Out(bDataOut)
bDataOut = bDataOut + LCD_ENABLE
I2C_Out(bDataOut)
AbsDelay(1)
bDataOut = bDataOut - LCD_ENABLE
I2C_Out(bDataOut)
AbsDelay(1)
End Sub
Sub I2C_Out(bData As Byte)
I2C_Start()
I2C_Write(I2C_PCF_ADDR)
I2C_Write(bData)
I2C_Stop()
End Sub
Danke für's Lesen.
Liste der Anhänge anzeigen (Anzahl: 1)
So, hier bin ich wieder. Tut mir leid, dass es eine Weile gedauert hat.
Aktueller Stand: habe leider das grüne Display mechanisch... ähm ja, ins Jenseits befördert. :-b
Das habe ich zum Anlass genommen, mir ein LCD mit LED-Hintergrundbeleuchtung zu besorgen - gleiches Modell, gleiche Größe - nur diesmal eben nicht das 18334, sondern das blau-weiße 181656 (Danke an Searcher!)
Zudem habe ich in der Zwischenzeit eine Unterbauplatine für das neue LCD gelötet und in Sandwichbauweise damit verschraubt. Schaut lecker aus und funktioniert hervorragend. :D
Der Schaltplan (angehängt) ist der gleiche wie in meinem ersten Posting, nur diesmal passt R3 mit 33 Ohm auch zum Bedarf der LCD-Beleuchtung. Diese braucht 3,5 V und 60 mA. Somit sollte auch der verbaute Transistor zum Schalten der LED-Last ausreichen.
Lange Rede, kurzer Sinn: LCD funktioniert, Beleuchtung funktioniert, allerdings kann ich sie nicht per I2C steuern. Nach dem Programmstart (C-Control Pro) geht die Beleuchtung an, d.h. wohl, dass der Startzustand des Pins P7 vom PCF8574P den Transistor durchschalten lässt. Offenbar ist also der Aufbau richtig.
Nur was muss ich tun, um ihn wieder aus- und einzuschalten?
Mein Code bewirkt gar nichts, die Beleuchtung bleibt einfach an.
Code:
#define I2C_PCF_ADDR 0x40 'Slave-Adresse des PCF8574P
#define LCD_E 0b01000000 'Enable high = Befehl/Daten übernehmen
#define LCD_RS 0b00100000 'RS high = Datenausgabe
#define LCD_RW 0b00010000 'R/W high = Lesemodus
Sub main()
I2C_Init(I2C_100kHz)
LCD_Init_I2C()
LCD_Clear_I2C()
LCD_Write_I2C(0, 0b10000000) '<-- Hier passiert leider gar nichts!
AbsDelay(2000)
End Sub
Sub LCD_Write_I2C(bIsData As Byte, bData As Byte)
Dim bDataOut As Byte
'RS high setzen falls Datenausgabe gewünscht (bRS = 1).
If bIsData > 0 Then : bIsData = LCD_RS : End If
'*** High Nibble ***
bDataOut = bIsData Or (bData >> 4)
I2C_Out(bDataOut, 1)
'*** Low Nibble ***
bDataOut = bIsData Or (bData And 0b00001111)
I2C_Out(bDataOut, 1)
End Sub
Sub I2C_Out(bData As Byte, bPulseE As Byte)
If bPulseE > 0 Then
I2C_Start()
I2C_Write(I2C_PCF_ADDR)
I2C_Write(bData + LCD_E)
I2C_Stop()
AbsDelay(1)
End If
I2C_Start()
I2C_Write(I2C_PCF_ADDR)
I2C_Write(bData)
I2C_Stop()
End Sub
Wäre toll, wenn sich das mal jemand anschauen könnte. Vielen Dank.