home sitemap

2. Die parallele Schnittstelle


zurück zur seriellen Schnittstelle

Grundlagen zur parallelen Schnittstelle:

Die parallele Schnittstelle wird auch LPT oder PNR (für LinePrinTer oder PriNTer) genannt. I.d.R. können bis zu 4 parallele Schnittstellen in einem Computer installiert werden, jedoch ist es meist nur eine. Die parallele Schnittstelle ist normal die Druckerschnittstelle des Computers. Daneben gibt es auch noch andere Einsatzgebiete, aber die Hauptaufgabe der parallelen Schnittstelle liegt im Druckeranschluß. Die parallele Schnittstelle hat einen weiblichen Stecker für 25 PINs, sie wird mit einem Centronics - Kabel (Druckerkabel, paralleles Kabel) mit einen Drucker verbunden. Der Centronics-Stecker am Drucker hat 36 Kontakte. Der Anschluß geschieht vom Computer über 18 Datenleitungen und 7 Masseleitungen, letztere sollten aufgedrillt zu 18 Masseleitungen um die Datenleitungen gewickelt werden. Dieses ist aber nicht immer so, da in der Praxis durchaus einige parallele Druckerkabel sich nicht an das o.g. halten und Probleme bei den Steuerungsleitungen machen! Die parallele Schnittstelle ist für eine Kabellänge von ca. 5 m ausgelegt. Die Leistung an den PINs beträngt zwischen 0V und 5V (TTL). Die Ausgänge schaffen 10mA.

Im Bios des Computers werden nach der Norm IEEE 1284 folgende Standards eingestellt:
- SPP: ("Standard par. Port") dies ist der alte Standard, die Software baut die Kommunikation auf (Handshake)

- EPP: ("Erweiterter par. Port") bidirektionaler Port, die Hardware baut die Kommunikation auf

- ECP: ("Erweiterter befähigter Port") bidirektional, Hardware-Handshake und DMA (ohne CPU Daten aus dem Speicher holen)

Die parallele Schnittstelle (PAR) zum Messen und Steuern:

Wichtig: Die parallele Schnittstelle ist anfällig! Ich übernehme keine Haftung für Schäden, die beim Ausprobieren egal welcher Inhalte dieser Site entstehen, besonders bei der parallelen Schnittstelle!

Unverbindliche Ratschläge:
Es gibt die parallele Schnittstelle auf Erweiterungskarten, diese können u.U. das Motherboard beim Basteln schützen. Ein alter Rechner (ich benutze meinen alten 500er dafür) ist auch eine gute Wahl. Einmal fertiggestellte und getestete Schaltungen sollten keine Porbleme machen. Nur mit ausgeschaltetem Computer die Stecker an der PAR wechseln. Nur PIN-Eingänge der PAR dürfen 0V bis 5V bekommen und PIN-Ausgänge dürfen nichts bekommen! Ein Ausgang der seriellen Schnittstelle hat 12V (eltr. Fachgeschäft, Schaltung zur Reduzierung), jedoch sollte der Eingang einer seriellen Schnittstelle die 0V bis 5V der PAR verarbeiten können.

Das Arbeiten der PAR läßt sich anhand ihrer Hauptaufgabe in Form der Druckersteuerung gut darstellen:
Aufgrund der o.g. Kabelprobleme sollte man direkt an den 25-PIN-Stecker des Computers gehen oder sein Kabel gut durchmessen. Die Abbildung 1 zeigt einen männlichen Stecker, wie er in den weiblichen am Computer gesteckt wird (von vorne, nicht von der Kabelseite!)


Abbildung 1: männlicher 25-Pin-Stecker von vorne

Grün sind alle Masse-Pins, gelb sind alle 0-5V Eingänge, gelb/rot sind alle bidirektionalen Pins (Ein- und Ausgänge) und die mit "D" gekennzeichneten Pins sind die Datenleitungen.

Einige der bidirektionalen Ein- und Ausgänge sowie ein Eingang haben ein entgegengesetzes Verhalten zwischen ihrem Bit im Register und dem Signalzustand am PIN (1, 11, 14, 17), sie sind invers. Warum dieses so ist, kann ich nicht sagen.

Von den 25 PINs sind 8 für Masse und 8 für Daten, es verbleiben also 9 Steuerleitungen. Die Datenleitungen schwanken zwischen 0V und 5V bei der Übertragung. Ca die Hälfte der Steuerleitungen sind bei 5V und die fast die andere Hälfte der Steuerleitungen sind bei 0V, d.h., eigentlich führt nur jedes zweite Kabel 5V und alle Daten- und Steuerleitungen (s.o.) sind mit Masse umwickelt.

Daher vermute ich folgendes:
Entweder soll damit eine höhere Abschirmung im Kabel erreicht werden oder der Stromverbrauch in der parallelen Schnittstelle soll minimiert werden.
Gerne würde ich dazu mal eine erklärende Mail bekommen.

Wie funktioniert die parallele Schnittstelle?
Das hängt von der o.g. Norm ab, hier ein vereinfachtes Beispiel für SPP:
Der Computer will ein Byte zum Drucker übertragen: er schiebt das Byte in das Datenregister, ...
PIN 17: DSL (Drucker select) "Drucker ist ausgewählt"
PIN 13: OFON (online/offline) "ist der Drucker online?"
PIN 16: INI (Ini.) "u.U.: der Drucker soll eine Initialisierung machen"
PIN 11: BSY (Busy) "ist der Drucker belegt und kann gerade nicht?"
PIN 12: PAP (Paper) "hat der Drucker Papier?"
PIN 14: ALF (auto line Feed) "u.U. soll der Drucker selbst Zeilenverschübe machen"
PIN 2..9: Data "die Datenleitungen übertragen ein Byte"
PIN 1: STR (Strobe) "der Drucker soll das Byte an den Datenltg. abtastet"
PIN 10: ACK (Acknowledge) "Bestätigung des Druckers, Byte empfangen"
PIN 15: FEH (..Error) "u.U.:der Drucker hat ein Problem"

Wichtig ist, die parallele Schnittstelle schaltet beim Booten des Computers einige Ausgänge an. D.h., werden Motoren gesteuert, so sollten diese durch einen Schalter abschaltbar sein.

Wie wird die parallele Schnittstelle programmiert?
Bei der Betrachtung der parallelen Schnittstelle fällt auf, daß 8 Leitungen bidirektional Daten übertragen (2..9), 5 Leitungen nur Statussignale vom Drucker aufnehmen (10 .. 13,15), 4 Leitungen Steuersignale zum Drucker senden [sind auch bidirektional] (1,14,16,17) und der Rest Masseleitungen sind (18..25). Die drei ersten Gruppen sind in folgenden Register untergebracht: Datenregister, Statusregister und Steuerregister.
Die parallele Schnittstelle wird über ihre Adresse im Computer angesprochen. Folgende Standard-Adressen können für die parallele Schnittstellen gelten (siehe eigene Systemsteuerung):
LPT1 $378
LPT2 $278

In der Adressen befindet sich das Datenregister - Byte der jeweiligen parallelen Schnittstelle . Die folgenden Bytes werden nach ihrem Abstand zur Adresse mit OFFset benannt, d.h., ist die Adresse 378, so liegt das 2. Byte bei einen OFFSet=1 ($379) und wäre das Statusregister und das 3. Byte bei einem OFFset=2 ($37A) wäre dann das Steuerregister [beachte hexadezimal nicht dezimal, sprich (hex)0..9,a..f = (dez)0..15].
Die einfachste Methode die Belegung der einzelnen Register (Bytes) und deren Auswirkungen herauszufinden, ist der Bau eines Teststeckers, da dieser jedoch 12 Dioden, 5 Schalter und einen 25-PIN männlichen PAR - Stecker aufnehmen muß, sollte er gleich in eine Box gebaut werden (siehe unten) und das "Beschießen" der Bytes an den jeweiligen Adressen plus OFFsets mit Werten von 0..255 (8Bit). Sicherlich gibt´s dazu auch passende Fachliteratur und Beiträge im WWW, jedoch ist der hier beschriebene Weg einfach zu verwirklichen. Es kann aber keine Haftung für Schäden, welche beim Eigenversuch entstehen, übernommen werden.

Beim "Beschießen" habe ich folgende Eigenschaften bzw. Auswirkungen der Register gefunden:

Die Schnittstellen:
Sollte der Teststecker beim "Beschießen" nichts anzeigen und das Programm macht keine Fehlermeldung, dann muß die Schnittstelle geöffnet werden [in dephi mit "CreateFile"]!

Datenregister (PIN 2, 3, 4, 5, 6, 7, 8, 9):
1. Das Datenregister ist bidirektional, wird jedoch vorerst nur als Ausgang dargestellt.
2. Die acht Ausgänge bilden ein volles Byte ab, d.h., es gibt 256 Kombinationen [0..255] die einzelnen Ausgänge zu steuern. Wird eine 0 ins Register geschrieben, so sind alle Ausgänge aus. Bei einer 1 ist nur der erste Ausgang an usw. bis schließlich bei einer 255 alle Ausgänge an sind. Auch hier muß erst das Register abgefragt werden, um dann per Logik den Wert so zu verändern, daß die übrigen Ausgänge gleich bleiben, wenn einer verändert wird.
3. Beschreibt man das Datenregister, so ändert sich auch das Steuerregister! D.h., man muß erst das Steuerregister (Adresse+2) zwischenspeichern, dann das Datenregister (Adresse) beschreiben und danach das Steuerregister (Adresse+2) zurücksichern.

Statusregister (PIN 10, 11, 12, 13, 15):
1.Das Statusregister hat 5 Eingänge, welche gelesen werden können.
2.Den einzelen Ausgängen sind folgende Bits [1..8] zugeordnet: PIN 10 = Bit 7, PIN 11 = Bit 8, PIN 12 = Bit 6, PIN 13 = Bit 5 und PIN 15 = Bit 4
Damit entstehen 32 Wert - Kominationen, die aus dem Satusregister ausgelesen werden können. Wobei der Eingang PIN 11 (Bit 8) zusätzlich noch invers ist, d.h., liegt kein Signal an diesem Eingang an, so enthält das Register aus diesem Bit einen Wert von 128. PIN 10 hat den Wert 64, PIN 12 = 32, PIN 13 = 16 und PIN 15 hat den Wert 8 (siehe Bits!).

Steuerregister ( PIN 1, 14, 16, 17):
1. Das Steuerregister ist bidirektional, wird jedoch vorerst nur als Ausgang dargestellt.
2. Das Steuerregister hat 4 Ausgänge, die einzelnen Bits [1..8] liegen wie folgt: PIN 1 = Bit 1, PIN 14 = Bit 2, PIN 16 = Bit 3 und PIN 17 = Bit 4 . Damit ergeben sich 16 Wertkombinationen, welche ins Register geschieben werden müssen, um die einzelnen PINs unabhängig zu steuern. Dabei haben die einzelnen Bit natürlich folgende Werte: Bit 1 = 1, Bit 2 = 2, Bit 3 = 4 und Bit 4 = 8. Jedoch sind auch hier PIN 1, 14 und 17 invers. D.h., schreibt man den Wert 0 ins Steuerregister so sind die PINs 1, 14 und 17 an sowie PIN 16 aus. Liest man das Steuerregister aus, so hat es durch die inversen Bits einen Grundwert, den man als Konstante bequem grundsätzlich abziehen kann.
3.Ist STR (PIN1) gesetzt, so läßt sich das Statusregister nicht richtig auslesen. D.h., soll das Statusregister ausgelesen werden, so ist zu schauen, ob STR (PIN1) des Steuerregisters gesetzt ist. Ist dies der Fall, dann STR ausschalten Statusregister lesen und STR wieder anschalten.

Es haben sich schon viele Autoren mit den Schnittstellen auseinandergesetzt (siehe Delphi-Links). Die mir bekannten Quelltexte zeugen i.d.R. von enormen Programmierfähigkeiten, da eindrucksvoll gezeigt wird, wie die Schnittstelle in Delphi zu handeln ist. Diese "Portschreiber" sind jedoch i.d.R. zur Ansteuerung der Schnittstelle für alles mögliche gedacht. Hier soll gezeigt werden, wie man die parallele Schnittstelle zum Messen und Steuern direkt nutzen kann.

Was früher in DOS - Zeiten leicht über den Port Befehl zu realisieren war, ist heute in Delphi etwas komplizierter. Jedoch steht der Weg über den Assembler-Code immer noch offen.
In Delphi kann durch einen "asm ... end;"-Block ein Assembler-Programm eingebunden werden. Folgende wenige Zeilen, welche kommentiert sind, zeigen zuerst, wie ein Wert ins Register einer Schnittstelle geschrieben und danach wie er gelesen wird, jedoch muß die Schnittstelle erst geöffnet werden (siehe oben):

var
Port:DWord; //Adresse+OFFset
Wert:DWord; //Wert, der in Port geschrieben oder von Port gelesen werden soll

asm // leitet ein Assembler - Programm in Delphi ein
mov edx, Port; // lade Port in edx
mov eax, Wert; // lade Wert in eax
out dx, eax; // schreibe "Wert in Port"
end;// beendet ein Assembler - Programm in Delphi

asm
mov edx, Port;
in al, dx; // lese "Wert von Port"
mov Wert, eax ; //lade "Wert in Wert"
end;

Dieser Maschinencode eignet sich gut für das sogenannte Polling, wobei das Steuerprogramm die Schnittstelle abfragt. Hingegen kann sich die parallele Schnittstelle, da sie einen Interrupt hat (Standard IRQ 7 für die LPT1 und IRQ 5 für die LPT2, siehe eigene Systemsteuerung), auch beim Steuerprogramm melden. Da dieser Punkt gerade bearbeitet wird, werde ich ihn nachreichen.

Alle diese Aussagen und Logiken sind in der PSparDLL (siehe Programmbereich) enthalten und können durch einfache Befehle in eigenen Programmen genutzt werden.

Teststecker:

Abbildung: Teststecker für die parallele Schnittstelle
Die Box hat einen männlichen 25-PIN-Stecker als Schnittstelle. Die acht roten Dioden bilden das Datenregister ab, wobei Bit 1 links liegt. Die vier grünen Dioden zeigen den Status der Ausgänge des Steuerregisters, wobei die kleinste PIN - NR. links ist. Die 5 Schalter (w,r,gr,bl,g) bilden die Eingänge des Statusregisters. Die Schalter kommen zum Schluß damit man sie gut drücken kann, damit hat die Funktion über die strukturierte Abbildung gesiegt. In der Box versorgen die entsprechenden PINs die jeweiligen Dioden oder Schalter, wobei alle Dioden einen Widerstand besitzen und an Masse angeschlossen sind, die Schalter bekommen ihren Strom von PIN 17 (DSL) und führen ihn in die jeweiligen Eingänge. D.h., sollen die Schalter ausgelesen werden, muß das Programm vorher PIN 17 anschalten. Die Box hat eine Größe von 3,5*12*6 [H*L*B in cm]. Alle Leitungen sind gut isoliert!!

Mit diesem "Teststecker" wurden die o.g. Aussagen herausgefunden und die im Programmbereich enthaltene PSparDLL geschrieben und überprüft (siehe Programmbereich).

Motorsteuerung:

Abbildung Motorsteuerung

Mit zwei Ausgängen und einem Eingang der parallelen Schnittstelle kann sehr gut ein Motor gesteuert werden (gleiches gilt auch für alle anderen Schnittstellen). Im Programmbereich ist beispielhaft für die parallele Schnittstelle eine Software für die Motorsteuerung enthalten, daneben wird auch auf die Hardware eingegangen (siehe im Programmbereich Motorsteuerung).

Digitale Temperaturmessung:

Abbildung Temperaturmessung an der parallelen Schnittstelle

In der Abbildung sehen Sie einen männlichen parallelen Stecker von der Kabelseite her, wie er in den weiblichen Stecker am PC gesteckt wird. Hier wurde ein paralleles Verlängerungskabel genutzt, damit der Sensor gut erreichbar auf dem Schreibtisch liegt. An diesen Stecker wurde der Sensor gelötet.

Materialien:
- männlichen 25-PIN Stecker
- Sensor (SMT 160-30, im TO-18 Gehäuse, Elektronik(versand)handel ca. Euro 5,-)
- Kabel

Aufbau:
Der Sensor verträgt 5-7V und -70 bis +500°C, damit kann er direkt an die parallele Schnittstelle und an den Gameport gesteckt werden. Jedoch ohne Widerstand nicht an die serielle Schnittstelle! Im WWW gibt es einige Datenblätter zu diesem Sensor, meist im Elektronik(versand)handel zum download. In der Abbildung kann man den Anschluß auch recht gut erkennen. Die drei Beine des Sensors sind (den Sensor mit den Beinen nach oben) - ab der Markierung im Urzeigersinn nummeriert - anzuschließen:
1 Output an PIN 13
2 + Phase an PIN 2
3 Masse an PIN 25
Achtung: Nicht den PIN 1 als + Phase benutzen, da der gesetzte PIN 1 der parallelen Schnittstelle in Verbindung beim Lesen des Eingangs PIN 13 kurzzeitig von der PSpar.DLL ausgeschaltet wird. Dieses macht bei der Echtzeitauswertung des Sensors sonst Probleme (Hintergrund siehe oben im Steuerregister "STR" in Verbindung mit dem Statusregister!). Dieses Problem betrifft aber nur Echtzeitauswertungen.

Programmierung:
Alle Befehle der PSpar.DLL in die Unit einbinden und wie im Programmbeispiel der DLL den PIN 2 setzen. Danach in einer Schleife den PIN 13 ca. 50.000 - 100.000 mal lesen (dauert 0,15 - 0,3 Sekunden, keinen Timer verwenden, nur eine Schleife). Da der Sensor Rechtecksignale, deren Länge in Abhängigkeit von der Temperatur sind, abgibt, erhält man beim Auslesen des PIN 13 Blöcke mit Signal und Blöcke ohne Signal, diese wechseln sich hintereinander ab. Deren Verhältnis zu einander, z.B. mit 0 und 1 in einem Array abgespeichert, kann sehr gut als Temperatur ausgewertet werden, da man mit zwei Probemessungen gut in diesem Verfahren interpolieren kann.

Beispiel der Signalauswertung (stark verkürzt):
Temp. A:000000011111000000011111000000011111000000011111000000011111 ...
Temp. B:000001111111000001111111000001111111000001111111000001111111 ...
Dieses Verfahren ist mit einem 1/3°C Abweichung für den Hausgebrauch schon recht genau. Wer es genauer braucht, sollte im Datenblatt des Sensors sich die Temperaturformel nehmen, um seine Messungen am PIN 13 in eine Temperatur umzurechnen.

Anwendung:
Messen von Temperaturen aller möglichen (!) Orte / Substanzen, die ruhig auch 20-30m vom Rechner entfernt sein können. So sind z.B. freie Telefonkabel (auf Störungen achten!) gut, um z.B. in den Keller zur Heizung zu kommen.


einige kleinere Schaltungen:

Schalter:

Es wird PIN2 als Ausgang und PIN3 als Eingang genutzt. So kann bei einem gesetzten Signal auf PIN2 dieses durch Abfragen des PIN3 ausgelesen werden, wenn der Schalter gedrückt wird.

Diode:

Es wird PIN9 als Ausgang (+) genutzt, die Masse bezieht die Diode hier durch PIN23. Man beachte die unterschiedlich langen Beine der Diode! Das längere ist die Anode (+) und das kürzere ist die Kathode. Vor die Anode der Diode ist ein Widerstand mit 100Ohm geschaltet.

sehr kleiner und schwacher Motor:

Der sehr kleine Motor bezieht seine Phase durch PIN9 und seine Masse durch PIN23.

starker Motor:

Ein stärkerer Motor (Leistungsaufnahme > 10mA oder > 5V, siehe ganz oben!) kann nicht direkt an die parallele Schnittstelle anschlossen werden. Es kann aber ein Reed Relais angesteuert werden, welches wiederum den Schaltkreis des Motors steuert. Von dem Netzteil bezieht der Motor die Masse, die Phase des Netzteils wird über das Reed Relais zum Motor geschaltet. Das Reed Relais bekommt seine Phase von PIN9 und seine Masse von PIN22. Man beachte das weiße Pluszeichen auf dem Reed Relais. Es zeigt an, an welchem Bein die Schalt-Phase anzuschließen ist. Da immer die beiden äußeren Beine geschaltet werden, muß damit das andere innere Bein die Masse sein.



weiter zum Kapitel 3: Der Gameport