Raus aus dem PC




Hardware


Wenn ihr etwas aus dem PC ansteuern möchtet. Sei es eine Lampe, eine Lichtschranke oder z.B. ein Türöffner (Euren Fantasien sind fast keine Grenzen gesetzt) so müsst ihr mit einen Signal raus aus dem PC.
Am besten eignet sich dafür der Parallel Port. Er hat 8 Daten Kanäle die man sehr leicht ansteuern kann und so einen High- oder Lowsignal erzeugen kann.
Um der Schnittstelle zu sagen an welchen Ausgang sie den Zustand ändern soll muss man eine Adresse im Speicher ansprechen. Die Basisadressen der seriellen Schnittstellen liegen bei allen mir zur Verfügung stehenden PCs bei 3F8hex für COM1 und 2F8hex für COM2. Beim Parallelport wird es schon schwieriger. Meist liegt LPT1 bei 378hex, seltener bei 3BChex, LPT2 meist bei 278hex. Darauf verlassen sollten wir uns aber nicht.
Um die Basisadresse heraus zufinden hier ein kleines Tool.Portadr.
In die Speicher Adresse schreiben wir jetzt noch eine zahl zwischen 0 – 128, die einen Binären – Code ausdrückt. (siehe Tabelle). So können wir jeden Datenkanal einzeln oder in einem Verbund mit anderen schalten.
Hierzu noch eine kleine Exceltabelle mit Macro die euch zeigt welche Zahl welchen Datenkanal schaltet.(Dezimal in Binär) Tabelle
Bit Wert Bezeichnung Pin Pegel, wenn Bit auf Beschreibung
25 Pol Centronics 0 1
SPP Parallelport-Daten-Register (8 Ausgänge) Basisadresse + 0 (Offset 0)
0 1 Daten 1 2 2 0 V 5 V Datenkanal
1 2 Daten 2 3 3 0 V 5 V Datenkanal
2 4 Daten 3 4 4 0 V 5 V Datenkanal
3 8 Daten 4 5 5 0 V 5 V Datenkanal
4 16 Daten 5 6 6 0 V 5 V Datenkanal
5 32 Daten 6 7 7 0 V 5 V Datenkanal
6 64 Daten 7 8 8 0 V 5 V Datenkanal
7 128 Daten 8 9 9 0 V 5 V Datenkanal
SPP Parallelport-Status-Register (5 Eingänge) Basisadresse + 1 (Offset 1)
3 8 Error 15 32 0 V 5 V -
4 16 Select 13 13 0 V 5 V -
5 32 Paper Empty 12 12 0 V 5 V -
6 64 Acknowledge 10 10 0 V 5 V -
7 128 Busy 11 11 5 V 0 V -
SPP Parallelport-Steuer-Register (4 Ausgänge) Basisadresse + 2 (Offset 2)
0 1 Strobe 1 1 5 V 0 V -
1 2 Auto Feed 14 14 5 V 0 V -
2 4 Init (Reset) 16 31 0 V 5 V -
3 8 Select Input 17 36 5 V 0 V -
4 16 Interrupt enable - - - - -
5 32 bidirektional - - - - nicht bei allen Schnittstellen wirksam
Masse (GND) 18-15 19-30 - - -



Pinbelegung
25 Pol Sub-D 36 Pol Centronics
Am Computer: Am Drucker
25Pol am PC Centronics am Drucker
Stecker am Druckerkabel: Stecker am Druckerkabel:
25Pol am Stecker Centronics am Stecker



Jedoch kann man z.B. kein Relais direkt an den Parallelport anschließen, das währe nicht gesund für eure Schnittstelle. Wir brauchen zum anschließen jeglicher Baugruppen oder Bauteile eine Relaiskarte wie folgende.
Relaiskarte
Diese ist eine der einfachsten aber auch der billigsten Varianten. Diese Schaltung wird an einen Datenkanal angeschlossen. Um so mehr Ausgänge man benötigt um so öfters muss man diese Schaltung bauen. Sie wird an einen Datenkanal angeschlossen und man kann somit 8 Relaiskarten anschließen.



Software





Jetzt wissen wir was wir brauchen um einen Datenkanal anzusprechen. Doch wie schreibt man in eine Speicheradresse (I/O - Port ) und setzt somit den gewünschten Datenkanal auf 0 oder 1. In den Meisten Programmiersprachen gibt es ein Befehl für diese Aktion.(Siehe Tabelle)



So wird aus einem I/O - Port gelesen
Programmiersprache Anweisung Beispiel Bemerkung
Assambler IN Ziel, Adresse IN AX, 2FEh -
Turbo C Wert = inportb (Adresse) DrStatus = inportb(0x379); liest ein Byte
Wert = inport (Adresse) liest ein Bytepaar (Word)
Pacific C Wert = inp (Adresse, Wert) MStatus = inp(0x3FE) -
Turbo Pascal Wert = port (Adresse) DrStatus = port($378+1); liest ein Byte
Wert = portw (Adresse) liest ein Bytepaar (Word)
Basic Wert = INP (Adresse) MStatus% = INP(BasAdr%+6) -



So wird in einen I/O - Port geschrieben
Programmiersprache Anweisung Beispiel Bemerkung
Assambler OUT Adresse, Quelle OUT 378h, AX -
Turbo C Wert = outportb (Adresse, Wert) outportb (0x378, 12); schreibt ein Byte
Wert = outportw (Adresse, Wert) outportw (SteuReg, 0xFFFF); schreibt Bytepaar (Word)
Pacific C Wert = outp (Adresse, Wert) outp (0x2FB, MSteuReg) -
Turbo Pascal Wert = port (Adresse) := Wert port [$378] := 12; schreibt ein Byte
Wert = portw (Adresse) := Wert portw [SteuReg] := $FFFF; schreibt ein Bytepaar (Word)
Basic Wert = OUT (Adresse, Wert) OUT (&H378, 12) -



Ich selber habe nur Erfahrung mit Assambler gemacht. Dazu nun ein Beispiel, für das Lesen und Schreiben:

DATEN 	SEGMENT
dat db ?
	dw"$"
DATEN 	ENDS

CODE 	SEGMENT
	ASSUME CS:CODE,DS:DATEN

	Anfang:
	mov ax,DATEN
	mov ds,ax




	mov dx,3bch	;Schreibt Speicheradresse in dx
	mov al,02h	;Schreibt zusetzenden Wert in al Register (0,0,0,0,0,0,1,0)
	OUT dx,al	;Schreibt al in Speicheradresse und Datenkanal 2 wird gesetzt



	IN al,dx	;Liest aus Speicheradresse und legt Wert in al ab
	mov dat,al	;Schreibt al in dat(Achtung ASCI Tabelle benutzen)




	;Ausgabe

	mov dx,offset dat     ;gibt den Ausgelesenen Wert aus in diesen fall
	mov ah,09h            ;ist er gleich dem eingegebenen 02h
	int 21h



	;Programm Ende
	mov ah,4ch
	int 21h

CODE	ENDS
	END Anfang