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.
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.