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