[ lamepage · Hardware · LCD Module · lowkal ]

LC-Display am Parallelport

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

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 und Michael Engel auf http://www.home.unix-ag.org/nils/lcd.html eine Anleitung dazu und einen Kernel-Treiber, der das LCD ziemlich komfortabel ansprechen kann. 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/README.patch		- Nötige änderung an lcd_module.c, dem
				  Kerneltreiber für die LCD-Ansteuerung

/driver/lcd_module.patch	- Patch

/init.d/lcd			- Start/Stop Script

/ppc1/ppc1.1			- Manpage von ppc1

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

/ppc1.c				- Programm zur Steuerung des Parallelportes
				  (Für den Tastenstatus und die LED-Kontrolle)

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

/ps/lcd3_shema.ps		- Kompletter Schaltplan.

/ps/lcd_dimensions.ps		- Abmessungen des Conrad-Displays (16x2)
				  (Achtung: Nur pi*Daumen gemessen!)

/tcl/README			- Kurzbeschreibung von lcdt1.tcl

/tcl/lcdt1.tcl			- tcl-script zur Steuerung des Modules, der
				  LEDs und Abfrage der Tasten. Außerdem ein
				  kleines Menusystem, um z.B. Mails und den
				  Anrufbeantworter (vbox) abzufragen.
				  Verwendet ppc1 (s.u.) um den Port zu steuern. 

Die Hardware

Zunächst mal die Bilder vom fertigen Modul, dem Schaltbild usw.:

LCD Vorderseite
Vorderseite
LCD Rückseite
Rückseite
Schaltplan
Anschlußplan der ICs
Abmessungen des LCD-Modules

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.

Die LEDs werden vom FlipFlop dann über das IC3 (4066) angesteuert. Je nachdem, was für ein FlipFlop man verwendet, kann man die LEDs auch direkt an dieses anschließen. Also z.B. ein TTL-IC 74LS175 sollte die LEDs direkt treiben können. Allerdings sollten dann die Vorwiderstände R10-R13 so angepaßt werden, daß ca. 10mA Strom pro Ausgang nicht überschritten werden.

Da die Schaltung nicht sehr komplex ist, kann man sie am einfachsten auf einer Lochrasterplatine aufbauen. Bei Conrad Electronic gibt es zum Beispiel welche mit passendem Layout für zwei SUB-D-25 Buchsen (Best-Nr.: 529028).
Wenn sich jemand erbarmt, ein Layout zu erstellen, möge er mir dieses bitte mitteilen.

Bauteilliste:

LCD1    - Display mit Hitachi-Chipsatz oder kompatibel
          (z.B. von Conrad, Best-Nr.: 184594)
IC1     - NAND-Gatter 74LS00 oder einfacher Transistor in EGS
IC2     - 4-fach D-FlipFlop, z.B. MC14175 (CMOS) oder 74LS175 (TTL)
IC3     - 4-fach Schalter 4066 (CMOS)
T1-T2   - Transistor NPN, z.B. BC548
SW1-SW4 - beliebige Tasten
LED1-4  - Leuchtdioden
C1-C3   - Kondensator 100nF
R1      - 60 Ohm
R2      - 10k
R3      - 330 Ohm
R4      - 47k
R5      - 100k
R6-R9   - 4.7k
R10-R13 - 330 Ohm

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. Für die Ansteuerung der LEDs und die Tastenabfrage habe ich ein kleines Programm gebastelt, welches diese Aufgabe erledigen kann. Schöner wäre es natürlich, diese Sachen mit im Treiber zu haben, aber so weit reichen meine Programmierkenntnisse nicht aus.
Weitere Informationen zum Kerneltreiber (lcd-0.13.tar.gz) gibt es auf obiger Website und im Programmarchiv selbst.

Installation:

Als erstes sollte der Treiber gepatched, kompiliert und getestet werden. Der Patch ist wichtig, um die Hintergrundbeleuchtung beim Schreiben auf das Display nicht zu beeinflussen. Im Originaltreiber wird nämlich das Bit für die *SELECT Leitung mit gesetzt, bzw. gelöscht. Dadurch wird bei jedem Schreibzugriff die Beleuchtung eingeschaltet. Um dies zu verhindern, dient der Patch, der in der Datei "/driver/README.patch" beschrieben ist. Für die eigentliche Installation bitte die Dokumentation des Treibers begutachten.

Das Programm ppc1 wird einfach erzeugt indem man "make" eingibt. Die Beschrei- bung von diesem Programm ist in der Datei ppc1.1 (manpage) enthalten. Mit ppc1 hat man jetzt die Möglichkeit, die LEDs beliebig zu setzen und die Tasten abzufragen. Wobei das Programm nur einmal den Tastenstatus ausgibt, also muß es kontinuirlich aufgerufen werden, um keinen Tastendruck zu verpassen. Nicht sehr schön das Ganze, aber im Moment habe ich keine andere Lösung dafür. Siehe auch weiter unten bei lcdt1.tcl.

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 - - - - LED 4 LED 3 LED 2 LED 1

Weitere Möglichkeiten

Um das Ganze Unternehmen nicht zum Selbstzweck werden zu lassen, habe ich ein tcl-Programm geschrieben, welches mittels ppc1 die Tasten abfragt, die LEDs bei bestimmten Ereignissen steuert und ein einfaches Menusystem bereitstellt.
Als Funktionen habe ich dort z.B. vbox-Abfrage, mail-Anzeige, Server-load, uptime, Anzeige des letzten Anrufs usw. eingebaut. So läuft das alles zusammen schon seit einiger Zeit problemlos auf meinem privaten Server. (uptime bis jetzt 158 Tage)

Dieses Programm heißt lcdt1.tcl und ist im Archiv enthalten. Weiterhin ist noch ein start/stop-script mit drin, welches beim Rechnerstart alles Notwendige erledigt. Leider habe ich es bis heute nicht geschafft, eine ordentliche Dokumentation für lcdt1.tcl zu schreiben (keine Zeit, keine Lust), von daher ist das Programm eher für Leute gut, die sich mit tcl ein wenig auskennen. Es sind mir auch ein paar Fehler aufgefallen, zur dessen Beseitigung ich auch noch nicht gekommen bin. Also vorsicht! Immerhin kann dieses Programm noch als schlechtes Beispiel dienen ;-)