[ lamepage · Hardware · LCD Module · lowkal06 ]

LC-Display am Parallelport

Projektname: lowkal - [L]CD C[o]ntrol [w]ith [K]eys [a]nd [L]EDs

Version 0.06 (28.08.2001)

Was ist LOWKAL?

Es gibt ja schon mehrere Projekte, um ein LC-Display am Parallelport eines IBM-Kompatiblen Rechner anzuschließen. Zum Beispiel gibt es von Nils Faerber auf http://www.home.unix-ag.org/nils/lcd.html eine Anleitung dazu und einen Kernel-Treiber, der das LCD ziemlich komfortabel ansprechen kann. (lcd-0.152.tar.gz). Auf diesem Projekt beruhen auch die hier folgenden Erweiterungen. Konkret geht es darum, einige Tasten und Leuchtdioden mit zu integrieren. In diesem Fall sind es vier Taster und vier LEDs. Die Taster sind ziemlich einfach anzuschließen; man hat ja am Parallelport genügend freie Statusleitungen, die dazu mißbraucht werden können. Die LEDs werden hingegen mit auf die unteren vier Datenleitungen geschaltet. Um diese unabhängig vom Display ansteuern zu können, wird sich eines D-FlipFlops bedient. Dieses wird wiederum mittels der RESET-Leitung gesteuert.

Was brauche ich?

Dateien im Archiv:

/COPYING			- Die GNU Genaral Public License.

/LIESMICH			- Dieser Text hier.

/README				- Dieser Text in englisch.

/driver/examples/read.pl	- Beispiel in perl.

/driver/examples/readloop.pl	- Noch ein Beispiel in perl.

/driver/README			- Nötige Änderung an lcd_module.c, dem
				  Kerneltreiber für die LCD-Ansteuerung

/driver/lcd_module.patch2	- Patch für den Treiber lcd-0.152.tar.gz

/lcdctrl/README			- Anleitung für lcdctrl.pl

/lcdctrl/README.isdn		- Hinweise zur ISDN-Konfiguration

/lcdctrl/lcdctrl.pl		- Das Perl-Program lcdctrl

/lcdctrl/lcdctrl.vars		- Einstellungen für lcdctrl

/eagle/lcdkeyb_parts		- Stückliste für die Keyboard/LED-Platine

/eagle/lcdmain_parts		- Stückliste für die Hauptplatine

/eagle/textlcd_keyb10.sch	- Schaltplan für die Keyboard/LED-Platine

/eagle/textlcd_mainb21.sch	- Schaltplan für die Hauptplatine

/postscript/lcd1_sym2.ps	- Anschlußbelegung von diversen Bauteilen.

/postscript/lcd_dimensions.ps	- Abmessungen des Conrad-Displays (16x2)

/postscript/lcd_new_sym2.ps	- Belegung der Stecker/Verbindungen

/postscript/lcdkeyb10.ps	- Schaltplan für die Keyboard/LED-Platine im
				  Postscript-Format

/postscript/lcdmain21.ps	- Schaltplan für die Hauptplatine im
				  Postscript-Format

/ppc1/ppc1.1			- Manpage von ppc1

/ppc1/makefile			- Makefile für ppc1.c

/ppc1.c				- Programm zur Steuerung des Parallelportes
				  (Es wird nicht wirklich benutzt, kann aber
				   gut zum Testen gebraucht werden.)

Die Hardware

Zunächst mal die Bilder vom fertigen Modul:

Das fertige Modul Innenansicht LCD und Tasten

Das Display wird wie im Schaltplan angegeben verdrahtet. Zu beachten ist, daß Pin 6 (Enable) an *STROBE und Pin 4 (RS) an *FEED angeschlossen werden, da der Kernel-Treiber diese Leitungen steuert. Pin 5 (R/W) wird auf Masse gelegt, da ja nur auf das Display geschrieben wird, und nicht gelesen. Der Kontrast wird über den Spannungsteiler R2, R3 eingestellt. Die Werte der Widerstände können je nach Display-Typ anders ausfallen. Da müßte dann rumexperimentiert werden.
Die Hintergrundbeleuchtung (sofern vorhanden) wird mittels *SELECT über die beiden Transistoren T1 und T2 gesteuert. Wobei T2 nur als Inverter benutzt wird. Wie ich im Nachhinein festgestellt habe, ist die *SELECT-Leitung standardmäßig gesetzt (also LOW). Man kann also im Prinzip auf T2 verzichten und direkt an T1 gehen (über den Vorwiderstand R5 natürlich). Der Basiswiderstand R4 muß dann weggelassen werden.

Zu den Tastern gibt es nicht viel zu sagen. Die Pullup-Widerstände R6, R7, R8, R9 legen die Leitungen vom Statusport (*ERROR, SelIN, PaperEnd, *ACK) defaultmäßig auf HIGH. Wird ein Taster betätigt, zieht dieser die entsprechende Leitung nach Masse (LOW). Entsprechend ändert sich der Wert im Statusregister.

Bei der Ansteuerung der LEDs wird es ein bisschen komplizierter. Um die LEDs unabhängig vom Display steuern zu können, wird hier ein D-FlipFlop (IC2, MC14175) eingesetzt, welches mittels der *RESET-Leitung über den Inverter IC1 gesteuert wird. Bei positiver Taktflanke am Clock-Eingang von IC2 werden die Daten an den Eingängen auf die Ausgänge übernommen. Das heißt, die Software muß sich darum kümmern, jeweils gültige Daten auf die Datenleitungen zu geben, und dann die *RESET-Leitung kurzfristig auf LOW (also HIGH an Clock) zu legen. Der Inverter (IC1) ist hier mit einem NAND-Gatter (74LS00) realisiert. Man kann aber auch einfach einen Transistor nehmen.

Da die Schaltung nicht sehr komplex ist, kann man sie am einfachsten auf einer Lochrasterplatine aufbauen. Seit der Version 0.06 dieser Anleitung sind die Tasten und die LEDs auf einer extra Platine untergebracht, um diese an einer Frontplatte montieren zu können. Diese Platine und auch das Display sind jeweils mit Stiftleisten und Flachbandkabeln mit der Hauptplatine verbunden.

Bauteilliste:

LC-Display	- 16x2 Display mit Hitachi-Chipsatz oder kompatibel
          	  (z.B. von Conrad, Best-Nr.: 184594)
Gehäuse
Flachbandkabel und passende Stecker (10, 16 und 26 polig)

Hauptplatine:

C1, C2	- Kondensator 100nF
IC1     - NAND-Gatter 74LS00 oder einfacher Transistor in EGS
IC2     - 4-fach D-FlipFlop, z.B. MC14175 (CMOS) oder 74LS175 (TTL)
KEYB	- Stiftleiste ML10
LCD	- Stiftleiste ML16
PORT	- Stiftleiste ML26
R1	- 60 Ohm
R2	- 10k
R3	- 330 Ohm
R4	- 47k
R5	- 100k
SL1	- Stiftleiste M02 (oder Kabel direkt anlöten)
T1-T2   - Transistor NPN, z.B. BC548

Keyboard-Platine:

D1-D4	- Leuchtdioden
R6-R9	- 4.7k
R10-R13	- 330 Ohm
S1-S4	- beliebige Tasten
SV1	- Stiftleiste ML10 (oder Kabel direkt anlöten)

Die Software

Wichtiger Bestandteil der Software ist der Kerneltreiber lcd.o von http://www.home.unix-ag.org/nils/lcd.html. Er ist komplett für die Ansteuerung des Displays verantwortlich. Um die Tasten abfragen zu können, die LEDs und das Backlight zu steuern, habe ich den Treiber ein bisschen erweitert. Der nötige Patch befindet sich im Archiv im Verzeichnis /driver.

Installation des Treibers:

Als erstes sollte der Treiber gepatched, kompiliert und getestet werden. Dazu geht man folgendermaßen vor:

1. Kopiere den Patch (lcd_module.patch2) in das Verzeichnis des
   Originaltreibers (lcd-0.152/driver).

2. Gehe in dieses Verzeichnis und gebe folgendes auf der Commandline ein:
   patch <lcd_module.patch2
   
3. Fertig.
Danach muß der Treiber natürlich noch kompiliert werden. Wie das geht, und welche Einstellungen man noch vornehmen muß, steht in der Dokumentation des Treibers selbst.
Ist der Treiber fertig und geladen (insmod lcd.o), kann man ein paar Tests machen.

Um das Backlight zu steuern benutzt man z.B. folgenden Befehl:

echo -e -n "\033b\1" >/dev/lcd.

Schaltet das Licht ein, und

echo -e -n "\033b\0" >/dev/lcd

schaltet es wieder aus.

Um die LEDs zu steuern benutzt man z.B.:

echo -e -n "\033l\1" >/dev/lcd

Dies schaltet LED 1 ein, usw.

Wenn man den Tastenstatus abfragen will, liest man einfach vom Port /dev/lcd. Siehe dazu auch die 2 Beispiel in dem Verzeichnis /driver/examples.

ppc1:

Das Programm ppc1 stammt noch aus früheren Zeiten, wo die Tasten noch nicht über den Kernel-Treiber ausgelesen werden konnten. Es wird also für den normalen Betrieb nicht benötigt. Allerdings kann es für Testzwecke ganz nützlich sein, deshalb ist es auch noch mit im Archiv enthalten.
ppc1 wird einfach erzeugt indem man "make" eingibt. Die Beschreibung von diesem Programm ist in der Datei ppc1.1 (manpage) enthalten.

Hier mal eine übersicht, wie die Register des Parallelportes mißbraucht werden: (Hilfreich für die Benutzung von ppc1)

Registerbelegung vom Statusport
Bit 7 6 5 4 3 2 1 0
Belegung BUSY *ACK PAPEREND SELIN *ERROR - - -
Funktion - Taste 4 Taste 3 Taste 2 Taste 1 - - -
Registerbelegung vom Controlport
Bit 7 6 5 4 3 2 1 0
Belegung - - ExtModeDir IRQ *SELECT *RESET *FEED *STROBE
Funktion - - I/O - Beleuchtung Übernahme LCD LCD
Registerbelegung vom Datenport
Bit 7 6 5 4 3 2 1 0
Belegung DATA 7 DATA 6 DATA 5 DATA 4 DATA 3 DATA 2 DATA 1 DATA 0
Funktion LCD LCD LCD LCD LCD LCD LCD LCD
Funktion - - - - LED 4 LED 3 LED 2 LED 1

Weitere Möglichkeiten

Um das Ganze Unternehmen nicht zum Selbstzweck werden zu lassen, habe ich ein Perl-Programm geschrieben, welches ein Menu-System bereitstellt und bei bestimmten Ereignissen die LEDs ansteuert. Hiermit können dann z.B. vbox-Nachrichten abghört und diverse Status-Infos (load, etc.) abgefragt werden. Das Programm heißt lcdctrl.pl und ist im Archiv im Verzeichnis lcdctrl enthalten.