A nyomtatóport bekötése

Csatlakozószám Funkció
1 -STROBE
2 Adatbit 1 (D0)
3 Adatbit 2 (D1)
4 Adatbit 3 (D2)
5 Adatbit 4 (D3)
6 Adatbit 5 (D4)
7 Adatbit 6 (D5)
8 Adatbit 7 (D6)
9 Adatbit 8 (D7)
10 -ACK
11 BUSY
12 PE
13 SELECT
14 -AUTOFEED
15 -ERROR
16 INIT
17 -SELECT IN
18 GND
19 GND
20 GND
21 GND
22 GND
23 GND
24 GND
25 GND

Hát ez így elég bonyolultnak tűnhet, de nem kell megijedni, mindjárt tisztább lesz egy kicsit.
A 8 bit kimenet azt hiszem tiszta, így nem is magyarázom...
Bemenetek: (Státusz bitek)
10, 11, 12, 13, 15-ös csatlakozók...
Újabb kimenet: (Vezérlő bitek)
1, 14, 16, 17-es csatlakozók....

Az adatok a hagyományos EPP portra igazak, de ez megtalálható a legrégebbi gépekben is. Az újabb gépekben már az adatbitek például bemenetként is funkcionálnak, de érdemes úgy tervezni, hogy az adott eszköz mindegyik gépben működjön.... Egyébként a programoknak már egy 386-os gép is elég, és azt (kis szerencsével) még ingyen is be lehet szerezni... Sajnos más problémák is adódnak a nyomtatóporttal. Például az 5 bemenetből gyakorlatilag csak 4-et tudunk hasznosítani, ugyanis az 5.-re +5V-ot kellene vezetni, ami kicsit macerás... (igazából nincs is szükség rá).
Érdemes elkészíteni az itt lerajzolt kapcsolást, erre majd a programozásnál lessz szükség. Elég egyszerű, és egy hibás program miatt nem égetsz le 1-2 léptetőmotort. (nem drága alkatrészekre van szükséged.) Tehát az első programozási kísérletekhez ajánlott.

A kapcsolás néhány részletét érdemes kicsit megmagyarázni (ha még nem jöttél volna rá). A bemenetre kötött nyomógombokkal párhuzamosan van kötve 1-1 kapcsoló. Ezt azért láttam szükségesnek, mert így nem kell adott esetben 4 nyomógombat lenyomva tartani.... A LED-ek és a GND közé szintén betettem 1-1 kapcsolót (K1-K2), így egy mezei toldóvá "alakítható", tehát nem feltétlen kell a csatlakozókat lecibálni, egyszerűen egy másik hosszabbító kábellel továbbviszed a jelet. Amennyiben a továbbmenő GND ágba is beteszel egy kapcsolót (a rajzon nem szerepel), akkor a már elkészített kapcsolásod is rákötve maradhat a program tesztelésének befejezése után is.....

Azért pár dolgot érdemes betartani. A 18-25 pontokat mindíg kösd össze. Ez a test, ami elvileg a portnál össze van kötve, azonban tapasztalatok alapján ez nem mindíg van így. Lehetőleg ún. hosszabbító kábelt használj az összekötéshez, és ne nyomtatókábelt. Néhány gyári nyomtatókábelben nincs minden vezeték bekötve (kellemetlen tapasztalat), így meglepetések érhetnek. (Természetesen a laplink kábel is megfelel, de akkor a csatlakozókra figyelj.)

Érdemes megemlíteni, hogy egy gépben egyszerre maximum 4 printerport lehet.
Akkor egy táblázat a port lehetséges címeivel....

A port báziscíme Adatregiszter címe Státuszregiszter címe Vezérlőregiszter címe
378h 378h 379h 37Ah
278h 278h 279h 27Ah
3BCh 3BCh 3BDh 3BEh
2BCh 2BCh 2BDh 2BEh
37Fh 37Fh 380h 381h
27Fh 27Fh 280h 281h

Mint látod 6 lehetséges báziscím fordulhat elő (a max 4 porthoz).

Akkor most lássuk a kezelését. (Ehhez jó a ledekkel felépített kapcsolás)
Elöször egy a gépen már úgy is meglévő programot használunk... Tehát indítsd el a debug nevű programot. Ehhez DOS alatt (vagy Win3x-Win9x alatt egy DOS ablakba) a debug parancsot. Innen elég egyszerűen lehet parancsokat kiadni...

- O 378 FF
A 378 báziscímű port adatregiszterébe 255-öt ír (az összes adatbit LED-je világít).

- O 378 00
A 378 báziscímű port adatregiszterébe 0-t ír (az összes adatbit LED-je kialszik).

- O 37A 04
A 378 báziscímű port vezérlőgiszterébe 4-t ír (az összes vezérlőbit LED-je világít).

- I 379 04
A 378 báziscímű port státuszregisztereit beolvassa (a kapcsolók állását olvassa be).

Érdemes az adatportra írással kezdeni... Ha nem sikerül elsőre (és figyeltél a szóközökre), akkor sem kell elkeseredni, egyszerűen nem azon a címen van a port. A táblázatból próbálj másikat.

Programozás

Elöljáróban csupán annyit, hogy Turbo Pascalban lesznek a forráskódok, de a kommentekből kiderül, hogy az adott kód mit tesz, így egyszerűen átírható a neked megfelelő programnyelvre. Az összes forrás a windowsos Pascalra vonatkozi...(Borland Pascal for Windows)

Az összes program direkt írással dolgozik, így win XP, 2000, NT alatt egy patch kell (IO.dll), hogy erre lehetőséged legyen, vagy a portra írás rutinját átírod. (fájlként írod-olvasod a portot). Én az első megoldást (patch) javaslom, ugyanis így a megírt programot nem kell újraírni. Amennyiben mégis a fájlként való portkezelést választod (biztonsági okokból), akkor az elkészült programod Win 9x, és Win3.x alatt nem fog működni.

Természetesen az összes progit teszteltem.... Szerintem egyébként mindegyik megy DOS módban lefordítva is (az uses sort átírod dos; crt -re), bár úgy nem teszteltem.

A programozásnál figyelembe kell még azt is venni, hogy windows alatt a programok késhetnek, ugyanis csak 1-1 időszeletet kapnak az operációs rendszertől. Tehát például a léptetőmotornál ez rángatást okozhat (a léptetőmotor már az adott pozícióba fordult, de várnia kell az operációs rendszer miatt). A DOS-ban ilyen probléma nincs, azonban itt csak egyetlen program futhat egyszerre....(Ez a probléma is megkerülhető.)

A feketével írt részeket egyszerűen bemásolhatod a compilerbe, nem fog gondot okozni. (az persze előfordulhat, hogy lehagytam egy vesszőt, vagy valamit. Erről kérlek értesíts, hogy kijavíthassam.


Ez a program a nyomtatóport adatbitjeit kapcsolgatja. Az egyszerűség kedvéért minden lehetséges címre kiküldi az adatot. Később majd ezt máshogy csináljuk....
Igazából nem feltétlen lenne szükséges máshogy kezelni, ugyanis a legtöbb gépben egyetlen párhuzamos port található.

program villog;

Uses wincrt,windos;

Procedure Wait(Time : Word);             { várakozás - akadozós rutin.}
Var
  W1, W2 : Word;
  Ticks  : Longint;
Begin
  Ticks := 1000;                         { 1 msec a legnagyobb felbontás}
  Ticks := Ticks * Time;                 { Hányszor 1 msec ?}
  W1 := Ticks Div 65536;                 { High Word }
  W2 := Ticks Mod 65536;                 { Low Word }
Asm                                      {Assembli betét}
 mov AH, 86H
 mov CX, W1
 mov DX, W2
 int 15H                                 { A hivó program CX,DX ideig felfüggesztődik }
End;
End;

procedure adat(b:word);                  {Párhuzamos portra írás (adatbitek)}
begin
port[$378]:=b;                           {Egyszerűen minden lehetséges címre kiírjuk.}
port[$278]:=b;
port[$2BC]:=b;
port[$3BC]:=b;
port[$27F]:=b;
port[$37F]:=b;
   end;

begin                                   {Itt indul a programtörzs}
repeat
Clrscr;                                 {Képernyőtörlés}
writeln('Fut a progi. Egy billentyű lenyomására leáll.');             {A monitorra írunk...}
adat(255);                              {Az összes adat LED-et felkapcsoljuk.}
wait(200);                              {várunk 200 ms-ot}
adat(0);                                {Az összes adat LED-et lekapcsoljuk.}
wait(200);                              {várunk 200 ms-ot}
until keypressed ;                      {Ha lenyomtak egy billentyűt, akkor tovább,
                                         egyébként a repeat ciklus elejére}

begin                                   {Ez a valódi programtörzs}
Clrscr;                                 {Töröljük az ablak tartalmát}
writeln('A program leállt');            {Kiírjuk a monitorra}
Halt;                                   {Programot kilőjük...}
end;
end.

Ez csak egy oda-vissza futó fénypont az adatbiteken.... Tudom, tudom még nem léptetőmotor vezérlés, de legalább a portra való írást gyakoroljuk...

program futof;

Uses wincrt,windos;

var
a,z:word;
i:integer;

procedure adat(b:word);         {Párhuzamos portra írás }
begin
port[$378]:=b;                  {Egyszerűen minden lehetséges címre kiírjuk. Még mindíg...}
port[$278]:=b;
port[$2BC]:=b;
port[$3BC]:=b;
port[$27F]:=b;
port[$37F]:=b;
   end;

Procedure Wait(Time : Word);   { akadozós rutin egyes gépeken. }
Var
  W1, W2 : Word;
  Ticks  : Longint;
Begin
  Ticks := 1000;               { 1 msec a legnagyobb felbontás - 1000 microsec }
  Ticks := Ticks * Time;       { Hányszor 1 msec ?}
  W1 := Ticks Div 65536;       { High Word }
  W2 := Ticks Mod 65536;       { Low Word }
Asm                             {Assembly kód}
 mov AH, 86H
 mov CX, W1
 mov DX, W2
 int 15H                       { A hivó program CX,DX ideig felfüggesztődik }
End;
End;

procedure jb;                  {jobbról balra}
begin
a:=128;
for i := 1 to 8 do
begin
adat(a);
wait(100);
a:=a div 2;                    {osztás}
if keypressed                  {Ha leütnek egy billentyűt leáll.}
then
begin
ClrScr;                        {Képernyőtörlés}
Writeln('Program leállt');     {Kiírjuk a monitorra}
Halt;                          {Kilőjük a programot.}
end;
end;
end;

procedure bj;                  {balról jobbra}
begin
a:=2;
for i := 1 to 7 do
begin
adat(a);
wait(100);
a:=2*a;
if keypressed
then
begin
ClrScr;
Writeln('Program leállt');
Halt;
end;
end;
end;

begin
repeat
ClrScr;
writeln('Fut a program.... Bármelyik billentyű lenyomására leáll.');
jb;                           {jobbról balra}
bj;                           {balról jobbra}
until 1=5;                    {addig fut a program amíg 1=5 lessz (soha), 
                               vagy lenyomnak egy billentyűt.}
end.

Megosztás Google Buzz-on Del.icio.us-hez ad Megosztás Digg-en Hozzáadás a Google könyvjelzőkhöz Megosztás MySpace-en Hozzáadás MSN könyvjelzőkhöz Hozzáadás Yahoo! könyvjelzőkhöz Reddit StumbleUpon

© 2003-2013 Antal László
Valid Robots.txt XHTML 1.0 CSS 2.1 WCAG 1.0 XHTML 1.0 (WDG) CSS 2.1 (WDG) Akadálymentes oldal (link a paramédia weboldalra) I ¦ Validator [Valid RSS]
elektronikus levél az oldal szerkesztőjének RSS hírcsatorna is elérhető Ugrás a nyitólapra. Vendégkönyv... Az oldal blogja...