Zurück zum Menü 5
5.2.3 LPT-Port mit Profan steuern     (Userport.exe)

Erste Fassung im Sommer 2006


Immer wieder wird gefragt, wie man mit an einem PC den Druckerport ansteuern kann. Nun ich habe in den vergangenen Jahren auch herumprobiert und herumprobiert. Sicherlich gibt es ganz geniale Lösungen, aber die sind für Anfänger auch sehr schwer nachzuvollziehen.

Daher hier nun eine einfache Variante:

Die strippenstrolch.de-LED-Lauflicht-Profan-WIN-XP-Variante.

Gut, gut, zunächst sollten wir unsere LED-Platine bauen. Die Schaltung ist so einfach, dass man sie getrost auf einer Lochrasterplatine aufbauen kann.

Hier mal eine einzige Stufe, die dann acht mal aufgebaut werden muss:



Wenn Du die komplette LED-Ausgabestufe sehen möchtest, insbesondere an welche Pins die Anschlüsse gehören, dann benötigst du den SPlan60Viewer (keine Installation nötig) und den Schaltplan. Das alles ist in folgendem Paket zum download bereit:
  • Download LPT Ausgabe Paket 1 ( ZIP, 1,5 MB )
Der Viewer hat eine ausgezeichnete Druckqualität, so dass du dir astreine Unterlagen herstellen kannst.

Wenn Du die Schaltung aufgebaut hast, so kannst du eine 4,5 Volt Flachbatterie anschließen und die Anzeigen testen, indem Du jeden Einagngswiderstand nacheinander mit Plus verbindest. (Dabei darf der PC-Stecker natürlich auf keinen Fall aufgesteckt sein.) Wenn Der jeweilige Eingang mit Plus verbunden ist und die zugehörige LED leuchtet, so ist alles in Ordnung.

Wenn das alles funktioniert, dann können wir ja weiter machen.

Wenn dieser Test nicht funktionieren sollte, so untersuche genau Deine Platine, denn wenn du trotzdem weiter machst, kannst du Deinen PC eventuell beschädigen !

Funktioniert es nun ?  Gut... :-)

Schauen wir uns zunächst einmal den Druckerport an und gucken, welche Pins wir belegen müssen. Ich mahche das mal am Beispiel eines männlichen SUB-D-25-Steckers, der passt dann nämlich schonmal genau in die Buchse des PCs:



Wie wir sehen, hat diese Schnittstelle zahlreiche verschiedene Anschlüsse. Wir brauchen aber für unseren Versuch nur "Data 0" bis "Data 7" und einen "Ground"-Anschluss.

Als Beispiel für den Anschluss einer Leuchtdiode zeichne ich mal nur einen ausgang als beschaltet, will man 8 LEDs betreiben, müssen natürlich alle acht Ausgänge beschaltet und die zugehörige Schaltung 8 mal aufgebaut werden.



Wenn Du also den vollen Port beschalten möchtest, so musst du das gelbe Kästchen 8 mal aufbauen und mit Pin 2 bis Pin 9, sowie Masse ( Ground ) verbinden. Die Batterie kann durch ein 5 Volt Netzteil ersetzt werden.

Also weiter:

Wenn Du Windows NT oder XP benutzt, dann verhindert das Betriebsystem, dass Du auf den Druckerport als User zugreifen darfst. Das müssen wir also noch ändern.

Zunächst guckst Du unter

Systemsteuerung -- System -- Hardware -- Gerätemanager -- Anschlüsse Com und LPT -- Druckeranschluss -- Ressourcen,


auf welcher Adresse Deine parallele Druckerkarte angemeldet ist. Diese Zahlen schreibst du auf ein Blatt Papier und bewahrst es gut auf, denn Du benötigst es noch später zum Progammieren des Lauflichtes.

Du sollst nur diese Adressen auf einem Zettel notieren, weiter keine Einstellungen verändern. Dann kannst du die ganzen Fenster wieder schließen und hier weiterlesen.

Nun musst du einen Treiber installieren, um Windows XP mitzuteilen, dass auf bestimmte Systemadressen im Usermodus zugegriffen werden darf. Dazu lädtst du die Datei "Userport.zip" hier herunter. Diese Datei entpackst du in ein Verzeichnis deiner Wahl.

Die Userport-Homepage findest Du hier.


Daraufhin kopierst du die Datei "Userport.sys" in den Ordner "Deine Partition (C:)\windows\system32\drivers\".

Danach klickst du dann auf "Userport.exe":



Daraufhin erscheint folgendes Menü:



Hier kannst du mit Deinen Notizen vergleichen, ob deine parallele Druckerkarte in dem angegebenen Standard-Adressbereich liegt. Wenn ja, dann startest du den Treiber so lange, bis angezeigt wird:

 

Dieses wiederholte Klicken , bis das Hinweisfenster erscheint, dient dazu, feststellen zu können, ob der Treiber auch wirklich gestartet ist. Es wird bei einem einzelnen Klick nämlich nicht gesondert angezeigt.

Eine von mir übersetzte PDF-Datei erläutert die Vorgänge noch einmal mit Erlaubnis des Programmierers auf Deutsch:


UserPort-Installation-Deutsch-Kurzanleitung --- Download --- (PDF, 30 kB)

Diese Datei liegt aber auch dem Treiberpaket bei.

Nun sind die angegebenen Adressbereiche für den User-Zugriff frei geschaltet und wir können mit Profan unter Windows XP auf diese Adressen mit den eingebauten In- und Out-Befehlen zugreifen.

Übrigens muss der Treiber nur ein einziges mal gestartet werden und er wird bei allen folgenden Starts von Windows mit installiert, so dass eigene Software am LPT danach sofort lauffähig ist.

Um nun in Profan programmieren zu können, genügt für unsere Zwecke die Version 5.0 NT, die auch unter dem neuesten Windows XP läuft. Du kannst diese Version hier herunter laden, sie ist Freeware und darf kostenlos frei weiter gegeben werden.

Alle Downloads sind noch einmal gesammelt und als Liste im Menü 7 zu sehen.

Nach dem Download installierst du z.B. Profan 5.0 und öffnest den Editor. Danach öffnest du im Editor eine neue Datei und tippst "OutPB 888,16" in das Editorfenster ein.

Warum "888" ? Nun, dies ist die Standard-Adresse der parallelen Druckerkarte in dezimaler Schreibweise. Der Adressbereich der Druckerschnittstelle wird aber vom System in hexadezimaler Schreibweise angegeben:



Die hier abgebildete LPT-Karte liegt also auf Adresse hex0378 bis hex037F. Hmm... was nun ?

Das ist ganz einfach. Wir nehmen uns sogleich den mit Windows mitgelieferten Taschenrechner und stellen ihn in die wissenschaftliche Darstellung um:



Jetzt wechseln wir in die Schreibweise "hex" und geben unsere LPT-Karten-Adresse ein. Das ist die erste Zahl in der ersten Reihe. Daraufhin wechseln wir nur noch in die Dartellung "Dezimal" und unsere "888" wird angezeigt. Das funktioniert natürlich auch mit jeder anderen Hexadezimalzahl, logisch.

Nun zurück zu unserem Profan-Editor-Fenster:

OutPB 888,16
End

Die Dezimalzahl "888" ist nur ein Beipiel meiner Karte, die ich gerade installiert hatte. dein Wert kann davon abweichen.



Dieser Befehl gibt sofort nach Ausführung im Interpretermodus die Zahl "16" am Druckerport aus. Wenn wir also unsere Platine aufgesteckt haben und eine Batterie angschlossen haben, müsste die fünfte LED leuchten, denn die Wertigkeit ist ja 1-2-4-8-16-32-64-128. Für die Dezimalzahl 16 leuchtet also die LED Nummer fünf.

Wir können nun jede beliebige LED aufleuchten lassen:

OutPB 888,8 ---> LED Nr. 4
End

OutPB 888,128 ---> LED Nr. 8
End

Und so weiter.

Oder mehrere LEDs in Kombination:

OutPB 888,9 ---> LED Nr. 1 und 4
End

OutPB 888,15 ---> LEDs Nr. 1 bis 4
End

Wenn wir jetzt geschickt programmieren und eine Endlosschleife laufen lassen, so haben wir unser Lauflicht bereits fertig gestellt.

Beachte bitte dabei: Je nach der Geschwindigkeit deines Rechners müsste noch jeweils eine Pause eingebaut werden, damit man die Umschaltung der LEDs auch wirklich sieht. Bei ganz schnellen "Rennmaschinen" würden sonst nur alle LEDs flimmern.

Natürlich lassen sich auch Relais auf diese Weise schalten. Anstatt der LEDs mit ihren Vorwiderständen  verbauen wir  Relais mit jeweils einer Freilaufdiode. An diese Relais ließen sich dann 230 Volt Lampen anklemmen und ein richtiges Lauflicht wäre fertig.

Achtung !


Gleich noch ein Tipp hinterher:

Wenn Du vor hast, Maschinen mit deinem PC steuern zu wollen, so solltest Du absolut vorsichtig sein und die Maschine  erst einschalten, wenn Du sicher bist, dass du den LPT-Port abgeschaltet hast. Beim Hochlaufen von Windows XP wird können nämlich der gesamte Port oder Teile davon eingeschaltet werden.

Achtung !
    • Maschinen steuern mit dem PC kann lebensgefährlich sein !
    • Steuere daher nur kleinste Maschinen, die als Modell gedacht sind.
    • Schalte die Maschine erst ein, wenn du sicher bist, dass der LPT-Port auf Null gesetzt ist.
Aber wir wollen hier ja nicht das Schlimmste annehmen, sondern basteln ! Genau ! Also habe ich mir gedacht, ich bringe hier ein paar Codeschnipsel für deinen selbstgebauten  LED-Ausgabebaustein.

So. Als erstes sollten wir mal einen Wechselblinker bauen. Es sollen also 2 LEDs abwechselnd aufleuchten. Den Vorgang, wie du den richtigen Port (die richtige Adresse) herausfindest, hast du ja schon gelesen. Also folgt hier nun das Listing, wie in den guten alten C-64er Zeiten, die Du vielleicht noch gar nicht erlebt hast. du kannst hier also nachvollziehen, wie dein Vater oder sogar Opa dereinst mit dem C64 die ersten Schritte unternommen haben:


Damals (so etwa 1980) gab es auch schon Computerzeitschriften, und in denen standen nur "Listings". Man musste alles selber in seinen Homecomputer eintippen. Hatte man sich vertippt, so musste man auch selber nach dem Tippfehler suchen. Je länger das Listing, desto schwieriger wurde das.

Das sollst du hier nun einmal nacherleben, viel Spaß:

Listing 1:

"Wechselblinker mit LEDs am Parallelport eines Standard-PCs unter Windows XP / Profan 5.0 NT"


declare zeit%

cls
print "Wechselblinker mit 2 LEDs"
print "Zum Beenden das Fenster wegklicken."

while @lt(zeit%,15000)
let zeit% = @Add(zeit%,1)
endwhile
let zeit% = 0

outpb 956,0

schleife:
outpb 956,1
cls
print "LED 1 ein"

while @lt(zeit%,10000)
let zeit% = @Add(zeit%,1)
endwhile
let zeit% = 0

cls
print "LED 1 aus"
outpb 956,0

while @lt(zeit%,10000)
let zeit% = @Add(zeit%,1)
endwhile
let zeit% = 0

outpb 956,16
cls
print "LED 5 ein"

while @lt(zeit%,10000)
let zeit% = @Add(zeit%,1)
endwhile
let zeit% = 0

outpb 956,0
cls
print "LED 5 aus"

while @lt(zeit%,10000)
let zeit% = @Add(zeit%,1)
endwhile
let zeit% = 0

goto "schleife"

end

Für die Adresse "956" ist in diesem Listing natürlich die von Dir ermittelte Adresse einzusetzen, jede Windows XP-Konfiguration  kann da etwas andere  Adressangaben  haben. Auch ist es in gewissem Umfange möglich, die Adressen der LPT-Karte manuell zu ändern. (Gerätemanager)

Achtung ! Manche Antispy-Software blockiert hartnäckig auch den vorgeschlagenen Treiber, so dass dieser Versuch dann nicht möglich ist.

Nun kommt aber der Clou:

Wir können  das Programm nun compilieren, dann läuft es ganz eigenständig, ohne jeglichen Interpreter. Es wird daraus eine richtige xxx.EXE Datei.

Um das auszuprobieren, erweitern wir unser Listing:

Listing 2:

declare zeit%,dezadresse%

cls
print "Gibt die dezimale Adresse der LPT-Karte ein: ";
input dezadresse%

cls
print "Wechselblinker mit 2 LEDs"
print "Zum Beenden das Fenster wegklicken."
print "Start = beliebige Taste."
waitkey

while @lt(zeit%,15000)
let zeit% = @Add(zeit%,1)
endwhile
let zeit% = 0

outpb dezadresse%,0

schleife:
outpb dezadresse%,1
cls
print "LED 1 ein"
while @lt(zeit%,10000)
let zeit% = @Add(zeit%,1)
endwhile
let zeit% = 0
cls
print "LED 1 aus"
outpb dezadresse%,0
while @lt(zeit%,10000)
let zeit% = @Add(zeit%,1)
endwhile
let zeit% = 0
outpb dezadresse%,16
cls
print "LED 5 ein"
while @lt(zeit%,10000)
let zeit% = @Add(zeit%,1)
endwhile
let zeit% = 0
outpb dezadresse%,0
cls
print "LED 5 aus"
while @lt(zeit%,10000)
let zeit% = @Add(zeit%,1)
endwhile
let zeit% = 0
goto "schleife"
end

Nun compilieren wir das Programm:

  • In der Menüleiste:
    • Profan --> compilieren
dann linken wir es zu einer EXE-Datei:
  • In der Menüleiste:
    • Profan --> EXE-Datei erstellen...
Nun können wir es ausprobieren:
  • Datei --> Programm aufrufen... --> Programm wählen.

Jetzt erscheint sofort ein Fenster mit den Hinweistexten. Die aufgerufene EXE-Datei läuft nun ganz allein ohne Profan. Das kannst Du testen, indem du Profan schließt und die EXE-Datei startest.

Jetzt wollen wir unser Listing zu einem richtig kleinen Lauflicht erweitern:

Listing 3:

declare zeit%,dezadresse%

cls
print "Gibt die dezimale Adresse der LPT-Karte ein: ";
input dezadresse%

cls
print "Wechselblinker mit 2 LEDs"
print "Zum Beenden das Fenster wegklicken."
print "Start = beliebige Taste."
waitkey

while @lt(zeit%,15000)
let zeit% = @Add(zeit%,1)
endwhile
let zeit% = 0

outpb dezadresse,0

schleife:
outpb dezadresse%,1
cls
print "LED 1 ein"
while @lt(zeit%,10000)
let zeit% = @Add(zeit%,1)
endwhile
let zeit% = 0
outpb dezadresse%,2
cls
print "LED 2 ein"
while @lt(zeit%,10000)
let zeit% = @Add(zeit%,1)
endwhile
let zeit% = 0
outpb dezadresse%,4
cls
print "LED 3 ein"
while @lt(zeit%,10000)
let zeit% = @Add(zeit%,1)
endwhile
let zeit% = 0
outpb dezadresse%,8
cls
print "LED 4 ein"
while @lt(zeit%,10000)
let zeit% = @Add(zeit%,1)
endwhile
let zeit% = 0
outpb dezadresse%,16
cls
print "LED 5 ein"
while @lt(zeit%,10000)
let zeit% = @Add(zeit%,1)
endwhile
let zeit% = 0
outpb dezadresse%,32
cls
print "LED 6 ein"
while @lt(zeit%,10000)
let zeit% = @Add(zeit%,1)
endwhile
let zeit% = 0
outpb dezadresse%,64
cls
print "LED 7 ein"
while @lt(zeit%,10000)
let zeit% = @Add(zeit%,1)
endwhile
let zeit% = 0
outpb dezadresse%,128
cls
print "LED 8 ein"
while @lt(zeit%,10000)
let zeit% = @Add(zeit%,1)
endwhile
let zeit% = 0
goto "schleife"
end

Sicherlich hast du es nun ein wenig einfacher, als dein Vater früher, denn Du kannst das Listing hier aus dem Internet per kopieren und einfügen übertragen. Aber so ganz einfach ist es dann auch wieder nicht, denn die Technik ist sehr viel komplizierter geworden und manchmal braucht es viel Überredungskunst, das Windows XP zur  Datenausgabe über den  LPT-Port zu  bewegen.



Zum Abschluss noch ein kleines Listing zum Experimentieren:

Listing 4:

declare dezadresse%,zahl%

cls
print "Gib die dezimale Adresse der LPT-Karte ein: ";
input dezadresse%

schleife:
print
print "Gib die auszugebende Zahl (0 bis 255) ein: ";
input zahl%
print
print "Zum Beenden das Fenster wegklicken."
outpb dezadresse%,zahl%
goto "schleife"

Ich hoffe, du konntest den Darstellungen folgen und Deine LEDs sind nun per LPT-Port schaltbar. Wenn du es nun doch nicht lassen kannst und möchtest gern eine Lampe schalten, so kannst du auf diese Weise ein Relais mit dem LPT ansteuern:



Natürlich funktioniert das Ganze auch  z.B. mit einem Steckernetzteil mit 12 Volt:






 Viel Vergnügen weiterhin,





Nach oben            Zurück zum Menü 5