Einzelnen Beitrag anzeigen

Benutzerbild von Matze
Matze
(Co-Admin)

Registriert seit: 7. Jul 2003
Ort: Schwabenländle
14.929 Beiträge
 
Turbo Delphi für Win32
 
#7

Re: [c-lib] Parellelport-Tutorial

  Alt 15. Jun 2006, 18:14
Aber da ihr ja Daten nicht nur ausgeben sondern auch einlesen wollt, müsst ihr sowieso ein klein wenig Aufwand treiben.
So eignen sich Buspuffer mit tristate-Ausgang hervorragend für einfache Zwecke:
z.B. 74 LS 244 oder 74 LS 245
Schaut in die Datenblätter und überlegt, was euch mehr nutzt. Ich glaub, der 245 invertiert die Signale. Diese Bausteine beherbergen 8 tristate Buffer in einem 20 poligen Gehäuse. Die Buffer sind jeweils zu 4 Stk in 2 Gruppen selektierbar. Und damit bin ich beim CS Signal. Oft ist über der Signalbezeichnung ein Strich. Dieser bedeutet, das ein Low-Signal die Funktion auslöst. (Low-aktiv)
CS ist in vielen Fällen eines dieser Signale, die einen Datenübertrag vom Eingang (Dn) zum Ausgang (Qn) bei Low-Pegel (0-Signal) freigeben.
Um den Parallelport von der Eingabe und Ausgabe zu trennen, braucht man für alle 8 Bit 2 Bausteine, wobei die Struktur des 74 LS 244 genau diese Funktion unterstützt.


http://dp.matthias-hielscher.de/tuto...llel_tut_5.gif

Die Skizze zeigt zwei gegensinnig geschaltete Buffer. Man stelle
sich vor, 4 solcher Gruppen sind in einem Baustein vorhanden, CS 1
geht auf alle in Richtung "Auf" und CS 2 auf alle in Richtung "Ab".


http://dp.matthias-hielscher.de/tuto...llel_tut_6.gif

Nun muß ich nur noch CS1 mit '0' und CS2 mit 1 belegen, um Daten
zum Port zu schalten und umgekehrt CS1 mit '1' und CS2 mit '0' um
den Ausgang zu schalten. Da der Ausgang hier ein tristate ist, sollte
man ihn vor Weiterverarbeitung mit einem Widerstand 100 K an + schalten.


http://dp.matthias-hielscher.de/tuto...llel_tut_7.gif


Nun wollen wir ein CS-Signal erzeugen.

Sinnvoll ist es, ein Bit zu nehmen und festzulegen: bei '1' will ich lesen, bei '0' schreiben. Da ich dafür nicht den Datenbus benutzen möchte, bietet mir die parallele Schnittstelle ein paar weitere Signale, die sie sonst zum Handshaking mit dem Drucker benutzt.
Ein Signal ist Strobe auf Pin 1. Dieses Signal bedeutet, es liegen Daten zur Ausgabe an z.B. Drucker bereit. Dieses Strobe-Signal kann über die Portadresse 37Ah zum Parallelport Pin 1 ausgegeben werden.
Das zugehörige Registerbit ist Bit 0. Und genau dieses benutzen wir zur Selection der Ein- oder Ausgabe (Bit 0 = 0 -> Daten zur Ausgabe bereit).

Hinweis: Dieses Bit wird Invers zum logischen Zustand geschaltet, d.h. wenn Bit = 0 dann Leitung (Pin) = 5V und wenn Bit = 1 dann Leitung (Pin) = 0V!
Schließe ich nun CS1 direkt und CS2 über einen Inverter an Pin 1 vom Parallelport, habe ich schon einmal ein Richtungsbit.

Mit

WriteLPTPort(37Ah, Str_To_Byte('xxxxxxx1')); // 'xx1xxxx1' Bit 5 ist Steuerbit für Bidirektional wird Pin 1 vom Parallelport auf '0' gelegt.
Somit wird CS1 = '0' und dadurch der Eingabekanal durchgeschaltet.

Mit

WriteLPTPort(37Ah, Str_To_Byte('xxxxxxx0')); // 'xx0xxxx0' wird Pin 1 vom Parallelport auf '1' gelegt.
CS1 bekommt High-Pegel und durch den Inverter CS2 Low-Pegel.
Der Ausgabekanal wird durchgeschaltet.

Es lassen sich nun mit den ersten 3 Bits der Portadresse bis zu weiteren 8 CS Signale erzeugen, die sowohl Ein- oder Ausgabekanäle freigeben können.
Das heißt im Klartext: ich kann eine Schaltung entwerfen, die mir 8 Kanäle mit jeweils 8 Bit also 64 Ein- und 64 Ausgänge bietet.
Ein wenig beachten sollte man die Signallage zu Potentiallage. Dies ist beim Steuerregister nicht immer gleich und deshalb werde ich jetzt Pin 1 und 14 mit Invertern Beschalten. Damit habe ich wieder Bit = Signallage. (siehe Hinweis !)


http://dp.matthias-hielscher.de/tuto...llel_tut_8.gif

Diesen 3 Leitungen kann ich eine diskrete Schaltung verpassen,
oder einen 3 zu 8 Decoder benutzen. SN 74 irgendwas, ich krieg
das noch heraus.



Nun Kann ich wirklich sagen:

Code:
'00000000' schreibt Kanal 0
'00000010' schreibt Kanal 1
'00000100' schreibt Kanal 2
'00000110' schreibt Kanal 3
'00001000' schreibt Kanal 4
'00001010' schreibt Kanal 5
'00001100' schreibt Kanal 6
'00001110' schreibt Kanal 7
und:

Code:
'00010001' liest Kanal 0
'00010011' liest Kanal 1
'00010101' liest Kanal 2
'00010111' liest Kanal 3
'00011001' liest Kanal 4
'00011011' liest Kanal 5
'00011101' liest Kanal 6
'00011111' liest Kanal 7
  Mit Zitat antworten Zitat