Tech-Ecke / Delphi Inhalt / INPOUT32.DLL

 

     INPOUT32.DLL (unter Delphi)

Mit Hilfe dieser Library ist es möglich den LPT-Port aus eigenen Windowsanwendungen heraus anzusteuern. Da diese Bibliothek nur zwei Funktionen hat, ist sie sehr einfach zu handhaben. Es werden alle 32Bit-Windowsversionen ab Win95 unterstützt.

Hinweis!: Die Programmierbeispiele weiter unten beziehen sich auf den LPT1 und LPT2 mit der Adresse $378h bzw. $278h. Die Adresse muss jedoch in dezimaler Schreibweise angegeben werden, also 888 beim LPT1 und 632 beim LPT2. Das ganze trifft allerdings nur auf OnBoard-LPT-Ports zu.
Moderne PCs verfügen leider nicht mehr über einen eigenen LPT-Port, er lässt sich allerdings nach wie vor noch über eine PCI-Steckkarte nachrüsten. Jedoch wird in diesem Fall mit aller größter Wahrscheinlichkeit die Port-Adresse nicht einer der oben genannten entsprechen. Dies stellt übrigens für viele ältere Programme ein Problem dar, denn oft lässt sich hier nur die Portnummer auswählen und nicht die Adressen.
Beim eigenen Programm stellt das jedoch kein Problem dar, da man hier die Portadresse selbst und nicht die Portnummer angibt. Welche Adresse nun vom System vergeben wurde erfährt man im Gerätemanager unter "Anschlüsse (COM und LPT)". Dort doppelklickt man auf den entsprechenden Port und im folgenden Fenster auf "Ressourcen".

Die im Beispiel-Bild eingekringelte Adresse ist die Hex-Adresse des LPT1. Für die Programmierung benötigt man jedoch die Dezimaladresse, welche man sich hier anhand der Hexadezimalzahl errechnen kann. In der Abbildung finden wir die Adresse $D000 welche in dezimaler Schreibweise die 53248 ist.
Eines noch: IIn Foren ist immer wieder zu finden, dass angeblich Karten mit einem NetMos-Chip am konformsten zu den alten Onboard-LPT-Port's sind bzw. am wenigsten Probleme bereiten. Ich selbst habe eine Karte von Vivanco welche zufällig einen NetMos Chip besitzt :-) Allerdings hatte ich anfangs auch mit dieser Karte Probleme, bis ich den neusten Treiber, direkt von der NetMos-Seite installiert habe (das war mit XP so um 2005). Es empfiehlt sich also also immer zuerst den neusten Treiber zu installiert, bevor man wo anders anfängt zu suchen.

Alternativ zu INPOUT32.DLL gibt es noch die HWInterface32.dll und die IO.dll welche einen identischen Syntax haben.

  HWInterface32.DLL[Beta] (Win95/NT/98/Me/2k/XP)
 
  Link zu IO.dll Homepage


   LPT-Port

Der LPT-Port ist in drei Register unterteilt, das Datenregister (8Bit), das Steuerregister(4Bit) und das Statusregister (5Bit). Für den Bastler ist eigentlich nur das Datenregister, welches 8 Ausgänge bereit hält und das Statusregister welches mit 5 digitalen Eingängen
aufwartet interessant. Am Port selbst finden wir die Ausgänge am Pin 2-9 (Data 0 - 7) und die Eingänge am Pin 10-13 und 15.

 

           
  1 Strobe 10 Acknowledge [E] 19 GND
  2 Data 0 [A] 11 Busy [E] 20 GND
  3 Data 1 [A] 12 Paper End [E] 21 GND
  4 Data 2 [A] 13 Select [E] 22 GND
  5 Data 3 [A] 14 Auto Feed 23 GND
  6 Data 4 [A] 15 Error [E] 24 GND
  7 Data 5 [A] 16 Init 25 GND
  8 Data 6 [A] 17 Select In    
  9 Data 7 [A] 18 GND    

Weitere Infos zum LPT-Port gibt es hier

Hier auch noch zwei Schaltungen zum einbinden ins eigene Projekt:


   Grundlegendes zu DLL's

Eine DLL Datei (Dynamic Link Library ) ist eine Library welche Programmroutinen enthält, die man für sein eigenes Programm nutzen kann. Zum Einbinden der DLL fügt man die unten aufgeführten Zeilen, direkt hinter implementation im eigenen Programm ein. Dabei muss jeder "Befehl" den man aus der DLL nutzen möchte separat angegeben werden. In diesem Beispiel wären dies die beiden Befehle Out32(x) und INP32(x). Wir gehen davon aus, dass die DLL im gleichen Verzeichnis wie das Programm liegt, bzw. die DLL im Windows- Systemverzeichnis platziert wurde. Das angeben des Pfades ist somit nicht notwendig.

  implementation

{$R *.dfm}

// inpout32.dll für LPT-Ansteuerung laden
procedure Out32(Addresse:Integer; Wert:byte);stdcall;export;
external 'INPOUT32.DLL'; // Die Datei 'INPOUT32.DLL' liegt hierbei im Programmverzeichnis
function Inp32(Addresse:Integer):Byte;stdcall;export;
external 'INPOUT32.DLL';

 

   Out32  (Ausgang - Datenregister)

Der Befehl zum Ansteuern der Ausgänge, also des Datenregisters lautet Out32(XXX,y). Setzt man mit OUT einen Bit im Datenregister des LPT-Ports, so kann man am entsprechenden Pin eine Spannung von +5V messen. Folgende Tabelle zeigt welcher Bit welchen Pin unter Spannung setzt.

Out32(888,x) 1 2 4 8 16 32 64 128
Pinbezeichnung Data 0 Data 1 Data 2 Data 3 Data 4 Data 5 Data 6 Data 7
+5Volt an Pin 2 3 4 5 6 7 8 9

Beispiel:

 

 Out32(888,1); // Setzt den ersten Bit im Datenregister des LPT1
 Out32(632,1); // Setzt den ersten Bit im Datenregister des LPT2

 

Um mehrere Ausgänge gleichzeitig zu schalten, nimmt man die Quersumme der Werte in Zeile 2. Möchte man also den Ausgang 2 und 5 Schalten so ist der Wert 18 (2 + 16)

 

 Out32(888,18);

 

Die so gesetzten Werte bleiben immer solange erhalten bis sie durch einen anderen überschrieben werden. Um alle Ausgänge wieder auf "Null" zu setzen (alles aus) setzt man "0"

   Out32(888,0);
 

Achtung!
Der LPT-Port ist eine sehr empfindliche Schnittstelle, er kann nur wenige mA verkraften. Eine stärkere LED reicht bereits aus um ihn in die "Ewigen Jagdgründe" zu schicken. Keines falls kann man hier Relais oder sonstige Verbraucher direkt anschließen. Dazu bedarf es einer Signalverstärkung die mittels Transistoren oder dem IC ULN2803 erledigt werden kann. Eine passende Schaltung hierfür werde ich demnächst auf der Tech-Ecke bereitstellen.

 

   Inp32  (Eingang - Statusregister)

Um nun Informationen von Außen in den PC und somit in sein eigenes Programm zu schleusen benutzt man die Bits des Statusregisters, welches die Pins 10-13 und 15 umfasst. Das Statusregister liegt eine Adresse oberhalb des Datenregisters, also 889 statt 888 beim LPT1 und 633 statt 632 beim LPT2.

 

var
            Wert: Integer;

Wert := Inp32(889); // liest das Statusregister des LPT1 in die Variable Wert
Wert := Inp32(633); // liest das Statusregister des LPT2 in die Variable Wert

 

Sind mehrere Eingangspins mit Masse (GND) beaufschlagt (10-13 und 15) so wird sich der Wert der Variablen entsprechend ändern.

Hinweis!
Wie schon oben erwähnt ist der LPT-Port eine sehr empfindliche Schnittstelle und verzeiht keine Überlastung oder gar Kurzschlüsse. Um einen Dateneingang zu realisieren empfehle ich Masse (Pin 18-25) an den entsprechenden "Eingangs-Pin" (Pin 10-13 und 15) zu legen. Es können auch mehrere Pins gleichzeitig beanschlagt werden.

Die Option Drucken funktioniert erst ab Netscape V4.0 bzw. I-Explorer 5.0 !

[letzte Aktualisierung 25.01.2007]