LCD-Backlight über den PC steuern

Bisher musste ich die Hintergrundbeleuchtung meines LCDs immer am Display selbst ab- und ausschalten bzw. regeln. Mit der Zeit wird es allerdings nervig, dauernd den Schraubendreher zu nehmen und die Beleuchtung etwas heller oder dunkler zu machen. Diverse Anwendungen, wie jaLCDs, können die Beleuchtung zwar an- und ausschalten was man schon mit einem Transistor und ein paar Widerständen machen kann aber die Helligkeit per Software einstellen?

"Ne, ham' wir nich" würde die Programmierer wahrscheinlich sagen.

Ich habe mich hingesetzt und ein bisschen überlegt...
...da kam mir in den Sinn, dass man DB0-DB7 am Display für eine Steuerung missbrauchen könnte. Aber wie behält man den Helligkeitswert und setzt 8 Bit in einen analogen Wert um?
Zum Glück gibt es die Newsgroup de.sci.electronics! Also schnell die Frage gestellt auf die ich schon nach 20 Minuten die erste Antwort bekam.
Nun wusste ich auch, wie ein "Speicher für Logikschaltungen mit Enable" heißt: 8-Bit Latch oder in der langen Version "Octal D-Flipflop mit Latch".

Die erste Frage ist also geklärt - Aber was ist mit der Umwandlung von Analog nach Digital?

Ich habe mich ein bisschen im Internet umgesehen und bin dabei auf den IC DAC0800 gestoßen. Nach erstellen eines Stromlaufplanes mit besagtem Chip wollte ich zur Sicherheit wissen, ob die Beschaltung so richtig ist. Dank dafür an MaWin (und seine Gedult - ich hoffe, ich bin nicht in seiner Killfile ;) ). Er sagte mir, dass es so nicht funktioniert und empfahl mir, ein R-2R-Netzwerk zu verwenden.

Ok, also dann alles mit Widerständen. Also schnell Google öffnen und "R-2R" einhämmern (ich wollte Referenzen zum ASCII-Bild der Newsgroupler).
Das zweite Suchergebnis war ein Volltreffer: Eine komplette Beschreibung auf einem Uni-Server.

Also schnell nach EAGLE und einen Stromlaufplan zeichnen.
Die Schaltung war nach einem Besuch in der Elektro-Apotheke auch relativ schnell aufgebaut.

Das Testprogramm war auch sehr schnell geschrieben: Eine Scrollbar, ein Timer und die Inpout32.dll. Der Timer verschob in 1s-Schritten die Scrollbar um eine Einheit nach oben, die wiederum den Parallelport binär von 0 auf 255 hochzählte.
Um das Ergebnis nachher besser auswerten zu können, habe ich die Analogwerte mit meinem DMM gemessen, das die Werte an den PC weitergab.
Dabei entstand folgendes Diagramm:
Messreihe - was ist falsch?
Zum Vergrößern anklicken.

Ich hatte eigentlich einen (halbwegs) linearen Anstieg der Spannung erwartet. Aber das ist alles andere als Linear.
Auffällig ist, dass bei dem 2, 4, 8, 16, ... Wert der "Sprung" nach unten sehr stark ausgebildet ist.

Nach etwas nachdenken war klar, dass ich das Flachbandkabel verkehrt herum an den Parallelport angeschlossen habe.
Also noch einmal die Lötstation anwerfen und alle Adern richtig anlöten.

Und? (fast) LINEAR!

Da der Logik-IC die Hintergrundbeleuchtung aufgrund der "hohen" Stromaufnahme nicht direkt betreiben kann, muss ein Transistor her. Mit einem BC548 konnte ich eine einzelne LED schon recht gut dimmen - aber die große Hintergrundbeleuchtung?
Bei einem Versuch fand ich heraus, dass die Spannung am Transistor zusammenbrach - also muss ein stärkerer Transistor her. In der Bastelkiste fand ich einen BC237 mit dem ich die Hintergrundbeleuchtung schon einmal schalten konnte. Mit einem Widerstand vor der Basis konnte ich den Einstellbereich etwas erhöhen.

Also die Hardware ist schon mal fertig. Fast - wie ich später feststellen musste.
Damit die Beleuchtung nicht dauernd ihre Helligkeit im Takt der Displayausgaben ändert, muss das Latch noch angeschlossen werden. Spontan griff ich zu Pin 17 am Parallelport.
Leider ist dieser hardwaremäßig invertiert. Sprich: Wenn man in in der Software auf Low setzt ist er am Parallelport auf High. Wenn man anstatt des eigenen Code jaLCDs o.ä. verwendet ist das nicht das wahre, da sich die Helligkeit nicht hält. Also muss das Latch für den IC invertiert werden. Noch einen Logik-IC wollte ich aus Platzgründen nicht nehmen.
Stattdessen einen BC548 mit einem Pull-Up. Wenn am Transistor jetzt an der Basis 5V anliegt, schaltet der Transistor das Latch des ICs auf 0V, wenn an der Basis 0V anliegen sperrt der Transistor und über den Pull-Up bekommt das Latch 5V (mit geringem Strom der aber zum Schalten reicht).
 

Als Abschluss habe ich noch einmal die Spannung, die direkt an der Beleuchtung anliegt gemessen.
Spannungsverlauf an der Hintergrundbeleuchtung
Dem Ausgabewert wurde pro Sekunde 1 Addiert. Der Messvorgang dauerte somit 256 Sekunden (4:16)
Die gelegentlichen Spannungseinbrüche kann ich mir selbst nicht genau erklären. Es sind keine Messfehler, sondern kommen entweder vom PC oder dem IC.

Nachtrag: Jetzt kann ich die Spannungseinbrüche erklären (Danke Robert! [IRC]):
Da meine Apotheke keine HCT-ICs da hatte, habe ich einen HC genommen (die Bezeichnung steht noch im Stromlaufplan), der eine höhere Schaltspannung hat. Daher kann es sein, dass der IC eine 1 mit einer 0 verwechselt. Also lieber den Chip wie unten (in der Bestellliste) angegeben.

Bei diesem Diagramm werden sich viele denken, dass die Helligkeit nicht Linear sondern am Anfang sehr stark und danach fast nicht mehr ändert.
Stimmt aber nicht. Die Helligkeit hängt mehr vom Strom als von der Spannung ab.

Deshalb habe ich auch den Strom, der zur Beleuchtung "fließt" gemessen:
Stromaufnahme der Hintergrundbeleuchtung
Das ist doch schon schöner. Zwar nicht 100% linear und bis zum Wert 32 auf 0mA, aber was will man mehr?

Jetzt aber weg von der "theoretischen Praxis" und auf zum...

Nachbau:

Die Bestellliste (Art-Nr. für Reichelt) lautet wie folgt:

Menge: Art.-Nr.: Beschreibung: Preis:
1 74HCT573 8-Bit Latch 0.31 €
1 BC337-25 Transistor 0.04 €
1 BC548A Transistor 0.05 €
10 Metall 10k Metallschichtwiderstände 10kW 1% 0.80 €
9 Metall 20k Metallschichtwiderstände 20kW 1% 0.72 €
1 64Y-100k Präzisionspoti 100kW 0.64 €
1 X7R-2,5 100n Vielschicht Kerko 100nF 0.12 €
    Lochrasterplatine  
    Flachbandkabel 9-Pol  
Insgesamt: 2.68 €

Der Stromlaufplan...
Stromlaufplan
Klicken zum Vergrößern

 

...und  das Platinen-Layout:
Layout

Zum abändern noch der Stromlaufplan und das Layout im EAGLE-Format:
Stromlaufplan und Platinen-Layout

Wenn es eng wird, kannst du statt den 10k-Widerständen natürlich auch ein Widerstandsnetzwerk verwenden. Ob die Genauigkeit darunter leidet ist nicht auszuschließen.

Wichtig ist, dass Pin 2 vom IC nicht an Pin 2 vom Parallelport angeschlossen wird (auch die folgenden Anschlüsse), da du sonst ein Ergebnis wie oben beschrieben bekommst.
Die Anschlussbelegung lautet wie folgt:

Parallel-Port: Anschlussleiste (!!)
2 9
3 8
4 7
5 6
6 5
7 4
8 3
9 2
17 1

Jetzt fehlt nur noch das Programm. Aber da wird dir auch geholfen ;)

'--- Beginn des Codes ---
Private Declare Sub PortOut32 Lib "inpout32.dll" Alias "Out32" (ByVal PortAddress As Integer, ByVal Value As Integer)

Const Parport As Long = 888

Private Sub VScroll1_Change()
PortOut32 Parport + 2, 8
PortOut32 Parport, VScroll1.Value
PortOut32 Parport + 2, 5
End Sub

Private Sub VScroll1_Scroll()
PortOut32 Parport + 2, 8
PortOut32 Parport, VScroll1.Value
PortOut32 Parport + 2, 5
End Sub
'--- Ende des Codes ---

Das ganze ist jedoch nur zum Testen! Um richtig von 0-100% Dimmen zu können musst du die Grenzwerte miteinbeziehen. Dies musst du mit dem Poti abstimmen (Helligkeit auf 255 einstellen und den Poti so weit drehen, bis knapp vor den Punkt, bis es dunkler wird - am besten geht dies mit einem Strommesser) und dann nachträglich auch in zwei Variablen fassen, sodass die Kennlinie der Helligkeit einen best möglichen Verlauf hat.

Dieser Code ist vollständig in das aktuelle LCD-Modul integriert.