Raus aus dem PC
| 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 |
| |
| Stecker am Druckerkabel: | Stecker am Druckerkabel: |
| ![]() |
| 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. | |
| |
| 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. | |
| 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 |