PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : LCD-Hintergrundbeleuchtung funktioniert nicht



dariegel
15.01.2011, 00:39
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:



#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.

TrainMen
15.01.2011, 02:59
Hi,
was steht den im Datenblatt zum Display ? Wieviel Spannung brauchst Du denn für die Hintergrund Beleuchtung ? Leuchtet das Display wenn Du PIN 1 + 2 mit 16 + 15 verbindest (vorher nach Spannung gucken)
Messe doch mal nach was da am PIN 15 noch ankommt ?
MfG Trainmen

dariegel
15.01.2011, 09:46
Hallo TrainMen,

im Datenblatt (Link (http://www.produktinfo.conrad.com/datenblaetter/175000-199999/183334-da-01-ml-LCD_Modul_4x16_Zeichen_de_en.pdf)) steht:


THERE ARE THREE POSSIBILITIES TO USE LED BACKLIGHT IN ANAG VISION CHARACTER MODULES.

1. DRIVING THE LED THROUGH A CURRENT LIMITING RESISTANCE (RA) WHICH IS ALREADY INCLUDED IN THE LCM, BY EXTERNAL 5V TO J1 AND J2 BETWEEN PIN 1 AND PIN 2.

2. PROVIDING 5V BY PIN 15 AND 16 OF THE INTERFACE TO DRIVE THE LED, J15 AND J16 MUST BE SHORTENED AND RA = 3~7 OHMS IN THIS CASE.

3. PROVIDING 4.2V BY DIRECT CONNECTION TO THE LED THROUGH A CURRENT LIMITING RESISTANCE.

Was ist mit J1/J2 und J15/J16 gemeint? Sind das die Pins? Finde die Beschreibung etwas widersprüchlich.

Am Pin 15 kommt nichts an mit obigem Code und Aufbau. Und direkt Pin 15 an 5V legen traue ich mich nicht. 8-[

Searcher
15.01.2011, 11:05
Hallo,


Was ist mit J1/J2 und J15/J16 gemeint? Sind das die Pins? Finde die Beschreibung etwas widersprüchlich
J1, J2, J15, J16 sind im Datenblatt auf Seite 2, links unten unter Block "LCD CONTROL LSI" gezeichnet und ohne eigene Erfahrung verstehe ich den Text dazu trotzdem nicht.


Wenn ich Pin 15 mittels der Funktion LCD_EnableBL() auf high (0b10000000) schalte, sollte der BC557B doch von Emitter auf Kollektor durchschalten
Verstehe ich so nicht. In Deiner oben geposteten Schaltung muß P7 vom PCF8574A auf low gehen, wenn der pnp Transistor durchschalten soll. Der legt dann über R3 Vcc an PIN 15 des Displays.

Warum allerdings das Backlight dunkel bleibt, wenn Du den Transistor zwischen Emitter und Kollektor brückst, könnte an dem meiner Meinung nach zu hohem R3=33Ω Widerstand liegen.

Nach Datenblatt gilt für die LED ein Vf=4,2V und If=220mA. Bei VCC von 5V errechnet sich der R3 mit (5V - 4,2V) / 0,22A = 3,6Ω. Kannst ja mal mit 4,7Ω anfangen.

EDIT: der BC557 geht nur für einen Strom von 100mA und ist damit hier sowieso zu schwach!


Gruß
Searcher

dariegel
15.01.2011, 13:01
Danke, das hilft mir schonmal sehr weiter. Man sollte sich eben nicht blind auf Schaltungen verlassen - auch nicht in Büchern. Wenn ich soweit bin, melde ich mich wieder.


Gruß

EDIT: Weitere Verbesserungsvorschläge für Aufbau und Code sind natürlich willkommen. :)

dariegel
15.01.2011, 17:53
Verstehe ich so nicht. In Deiner oben geposteten Schaltung muß P7 vom PCF8574A auf low gehen, wenn der pnp Transistor durchschalten soll. Der legt dann über R3 Vcc an PIN 15 des Displays.

Also brauche ich einen NPN-Transistor, wenn ich bei P7 = high = 0b1000000 die Hintergrundbeleuchtung aktivieren will?

Welchen Typ würdest Du mir empfehlen, denn der BC557B verträgt ja maximal I = 100 mA zwischen C und E?

Searcher
15.01.2011, 18:36
Hallo,

ich bin jetzt nicht der Schaltungsentwerfprofi und folgender Vorschlag sollte besser nochmal bestätigt werden.


Also brauche ich einen NPN-Transistor, wenn ich bei P7 = high = 0b1000000 die Hintergrundbeleuchtung aktivieren will?
Nein, wenn Du bei low="Hintergrundbelechtung ein" machst. Die Schaltung würde ich dann unverändert lassen (mit R3 von 4,7Ω) und statt des BC557 einen BD676 oder BD678 einsetzen. Die PNP Darlingtontransistoren wären wohl etwas überdimensioniert, sollte aber gut funktionieren.

Man könnte auch zB einen BC327 nehmen. Der hat aber keine so hohe Stromverstärkung und man müßte deshalb noch den Basisvorwiderstand anpassen. Je nach Belastungsfähigkeit des PCF, der ja den Basisstrom liefern muß, wäre das vielleicht gar nicht machbar.

EDIT: ich sehe gerade im Datenblatt (http://www.datasheetcatalog.org/datasheet/philips/PCF8574_4.pdf), daß der PCF an den I/Os bei low einen Strom von 25mA abgeben kann. Damit kannst Du einen BC327 mit R4=220Ω als Basisvorwiderstand nehmen.


PS: Hab Dein Programm nicht bewerten, da von Programmierung keine Ahnung.

Gruß
Searcher

Searcher
15.01.2011, 19:11
.------------------------------.
| |
| LCD |
| |
| 15 16 |
'------------------------------'
| |
.-. |
VCC | |R3 |
+ | | |
| '-' |
'----' |
|
___ |/ BD677
von PCF P7 >-----|___|------|
4,7k |< VCC
| +
| \] |
o-----|]------'
| /]+
|
|
===
GND


Mit NPN (BD677 als NPN Darlington) und high=Hintergrund aktivieren könnte es wie im code gezeichnet gehen. Da ich das LCD aber nicht kenne, ist das aber auch nur mit Vorsicht zu genießen.

Gruß
Searcher

Searcher
16.01.2011, 08:19
dein Display läßt auch mir keine Ruhe; wegen des mir nicht ganz klaren Datenblattes.

Conrad hat laut Datenblatt Seite 1 in der Fußnote vier verschiedene Displays, die sich in der Hintergrundbeleuchtung unterscheiden, im Angbot. Das Datenblatt ist das gleiche für alle.

Das erste (18334) ist ohne! :(

Welches hast Du denn genau - Bestellnummer?


Gruß
Searcher

dariegel
16.01.2011, 09:48
Stimmt, hast recht, bin da vor einiger Zeit auch drüber gestolpert, hab's dann aber wieder verdrängt. :roll:

Hab grad in die Bestellung geschaut, es ist tatsächlich das 18334. :( Das erklärt wohl so einiges... und ich weiß, dass ich ein ähnliches Display auch billiger haben könnte. Jetzt bin ich schlauer. Naja, egal, frisst eh bloß Akku. :)

Dann leg ich Pin 15 u. 16 auf GND und reiß den ganzen Transistor-Kram raus, oder?

Danke für Deine Hartnäckigkeit und Mühe. :)

Searcher
17.01.2011, 08:58
Dann leg ich Pin 15 u. 16 auf GND und reiß den ganzen Transistor-Kram raus, oder?

Jo, Transistor brauchst Du ja nicht mehr. Pin 15 u. 16 würd ich aber einfach offen lassen wenn man nicht genau weis, ob da nicht doch und wenn ja, was auf der LCD Platine dranhängt.

Gruß
Searcher

dariegel
17.01.2011, 11:14
Alles klar, dann lass ich die offen. Für den Fall, dass ich irgendwann noch ein kompatibles Display mit Beleuchtung auf die Platine mit dem PCF8574P draufstecke, kann ich dann immer noch die Transistor-Schaltung nachträglich drauflöten.

Danke Euch, habt mir sehr geholfen. :P


Grüße

PICture
17.01.2011, 16:02
Hallo!

@ dariegel

Willst du dir wirklich die ganz unnötige Arbeit mit dem Lötkolben antun ?

Ich würde es nur dann machen, wenn das wirklich meine letzte Bauteile wären, die ich sofort für anderen Zweck brauche. :)

Es reicht doch nur den Basiswiderstand vom PCF8574P ablöten, oder ? ;)

MfG

dariegel
05.02.2011, 14:26
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.




#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.

dariegel
05.02.2011, 14:44
Ähm ja, hat sich erledigt, nachdenken hilft. ;)

Ein einfaches:

I2C_Out(0b10000000, 0) 'Beleuchtung aus

bzw.

I2C_Out(0b00000000, 0) 'Beleuchtung ein

reicht aus und es funktioniert. Natürlich, da die Übertragung von High und Low Nibble nur für das Display im 4-Bit Modus da ist. Dem PCF8574P kann ich direkt per I2C_Out Bits senden.

Kopf -> Tischkante. ;)

Seht es als Resumée zur Hintergrundbeleuchtung und deren Steuerung mittels Transistor. :)

Searcher
06.02.2011, 08:19
Danke für die Lösung!


Ähm ja, hat sich erledigt, nachdenken hilft. :wink:
Hab ich schon oft festgestellt. Da, wo es nicht geklappt hat, hab ich es jemandem erzählt. Das hat oft ausgereicht, und wenn nicht, hab ich dann vielleicht gute Antworten bekommen. :-)

Viel Erfolg weiterhin
Gruß
Searcher