Vezérlés az LPT-porton Alfától Omegáig. II.

Cikkünk előző részében összefoglaltuk a fontosabb portokat, illetve részletesen megismerkedtünk a nyomtató kapujával. Tudjuk, hogy miként kell beállítani a BIOS-t, mekkora áramerősséggel lehet terhelni az egyes kimeneteket, melyik tüske mire használható, valamint milyen portcímekre író, vagy onnan olvasó utasításokkal tudunk kapcsolatot fenntartani a csatlakozóra kötött perifériáinkkal. Nem tudjuk azonban, hogy az egyes programnyelvekben ezt milyen módon tehetjük meg. Mint az előző részben megígértem, ebben a részben most erről olvasatunk.

Ma igen sokféle nyelven programoznak az emberek. Mindegyik port-kezelését bemutatni nincs esély. Azonban a legfontosabbakat, amelyekből kisebb nagyobb ügyeskedéssel elérhető célunk, már meg tudjuk ismerni.

Előbb azonban tegyünk kis kitérőt, legyen a portunkra egy aprócska hardver kapcsolva. Ez egy 270 ohmos ellenállással sorba kötött 5mm-es piros LED. Még csatlakozónk sincs, ezért az ellenállás szabad végét, illetve a LED másik kivezetését közvetlenül a portba dugjuk. (Nem szakszerű, (s nem árt megkímélni a gépünk csatlakozóját holmi vastag drótoktól,) de legalább olcsó, egyszerű és működik. Az alkatrészeket egy kidobott 5.25”-os floppy meghajtóból termeltem ki. Külön előny volt, hogy piros dróttal jelezték, melyik a pozitív kivezetése. Vigyázat!!! A LED polaritás-érzékeny, alkatrész. Mérjük ki műszerrel, vagy kérjük ki a kereskedő, esetleg szakember véleményét, hogy melyik az anódja, vagyis a pozitív kivezetése. Erre forrasszuk az ellenállást. FONTOS! Áramkorlátozó ellenállás nélkül a LED-et tilos áramforrásra kapcsolni, mert tönkremehet!

A HARDVER teljes valójában.

A hardver csatlakoztatása a géphez…

Ez egy gyakran használt, univerzális próbaalkatrész, amivel sok mindent tudunk ellenőrizni. Érdemes tehát mindenképp elkészíteni.  (Ennél egyszerűbbet ha valaki tud, akkor… J)

Dugjuk most az ellenállás szabad végét az adatport B0-bitjébe. Ha emlékszünk az előző rész táblázatára, akkor tudjuk, hogy ez éppen a kettes számmal jelzett kivezetés a 25-pólusú, D-alakú "mama" csatlakozón. A szabad vég, ami tehát a LED katódja, vagyis negatív kivezetése még kezünkben van. Ezt egy GND, vagyis testpontra kapcsoljuk. Ez lehet maga a gép házának valamely villamosan vezető pontja, de lehet pl. a 18…25-ös számú lyukak bármelyike. (Pl. én a 24-esbe dugtam, hogy a fotón jobban mutasson.) Az érintkezésre figyeljünk oda. A drótok ne feszüljenek túlzottan, de ne is lötyögjenek.(Kis műszaki érzékkel menni fog.)

E kis kitérő után lássuk a medvét, kezdjük mindjárt a legegyszerűbb módszerrel!

Perifériák kezelése DOS alatt

Ki gondolta volna…? J Pedig a jó öreg operációs rendszerben erre is gondoltak! Van egy izgalmas külső parancs, ez pedig a DEBUG. Az a legszebb a dologban, hogy mindenféle programozási ismeret nélkül, egy átlagos felhasználó is írhat/olvashat a memóriába/portokra. Vagyis első, egyszerűbb hardvereinket játszva letesztelhetjük, mielőtt akárcsak egyetlen sornyi programot is megírnánk. Ehhez valóban nem kellenek csuda dolgok, fordítók, programnyelvek, stb. Lássuk, hogyan történik mindez:

A DEBUG kurzora egy kötőjel. Számunkra szükséges parancskészlete pedig három betű mindössze, érdemes tehát nagyon elménkbe vésni: OIQ

A Q paranccsal kiléphetünk a DOS-ba, Az I paranccsal adatot olvashatunk be, míg az O paranccsal adatot írhatunk ki a portra.

Nézzük a kezelését. Tegyük fel, hogy a portunk báziscíme 378h (hexadecimális számrendszerben). A hardver a B0 bitre van kapcsolva. Mivel kettő nulladik hatványa 1, ezért ha 1-et írunk a portra, akkor - a többi bit kikapcsolt állapota mellett - itt logikai 1 szint jelenik meg, ami közel 5V feszültséget jelent. Erre pedig a kis teszt áramkörünk biztosan világítani fog. Ha ki akarjuk kapcsolni, egyszerűen nullát kell kiküldenünk.

Lássuk ezt a DEBUG nyelvén: (DOS alatt, - vagy WIN9x alatt indított DOS ablakban - beírtuk: DEBUG. Ezzel kész is a használatra a külső parancs.)

- O 378 FF

- O 378 00

Vigyázva a szóközökre!

Látható, ahogy a LED felgyullad, illetve kialszik. Ha esetleg nem működne, ellenőrizzük az érintkezést, a polaritást, valamint a port címét. (Csupán 3 variáció van, érdemes tehát végig próbálni. Csak emlékeztetőül: 378/3BC/278)

Hasznos tudni még egy apróságot: Amikor a számítógépet bekapcsoljuk, az önteszt során a BIOS inicializálja a portot, illetve az esetek többségében kiküld egy tesztsorozatot is. A régi mátrixnyomtatók feje ezért mozdul meg ekkor, s természetesen ezt a rákapcsolt teszt LED-jeink határozottan érzékelhető felvillanása is mutatja. Jól jöhet esetleges hibakereséskor! J

Beolvasni adatot így lehet a portunkról:

- I  379

(Emlékezzünk vissza, a bemenő port: báziscím+1!). Érdemes megfigyelni, hogy a címeket, illetve adatokat hexadecimális számrendszerben kell megadni, s a program úgy is adja őket vissza. HEXA-DEC, meg bináris átváltási táblázattal nem kívánom a helyet pazarolni, ezt mindenkinek illik ismerni, aki számítógéppel, de főleg programozással foglalkozik. Ha véletlenül mégsem így lenne, akkor olvassunk gyorsan utána egy alapkönyvben.

Szinte észrevétlenül, de már birtokba is vettük a portunkat! Tudunk adatokat kiírni, illetve beolvasni onnan, illetve elkészítettük az első, egybites alkalmazást is. Már csak azt kell megnéznünk, hogy a programjainkba hogyan tudjuk mindezt beépíteni. Mert igazán csak akkor lesz érdekes a dolog;

BASIC-nyelv

Kezdjük a régi kedvencemmel, a BASIC-el. Azért szeretem, mert pillanatok alatt lehet tesztprogramot írni benne az interpreter jóvoltából, s nem kell fejléc, változó deklarálás, fordítgatás, stb. Itt az OUT utasítással lehet kiírni, az INP utasítással pedig beolvasni adatot.

Nézzünk egy példát ezekre. (Minden sor egy funkció, a végén megjegyzéssel)

10 OUT &h378,1

15 REM Bekapcsoltuk a LED-et. Hexa alakban adtuk meg a címet!

20 OUT 888,0

25 REM Kikapcsoltuk a portot, de decimális alakban adtuk meg a címet.

30 A=INP(&h379)

35 REM Bemenő port állapota az A-változóba, hexa címmegadással.

40 B=INP(&h379)

45 REM beolvastuk a bemenő port állapotát decimális címmegadással B-be.

50 PRINT A,B

A kiírt két érték azonos lesz. (Nálam 207 volt.) A szorgalmasabbak kiszámolhatják, hogy ez bináris értékre átváltva, illetve a - táblázatban is megadott - negált biteket is figyelembe véve, vajon milyen bitkombinációnak is felel meg?

Természetesen ha programot ebben a formában lefuttatjuk, akkor a LED nagyon rövid ideig fog világítani, így nem árt késleltetni pl. a 25. Sorban egy üres ciklussal. Ezt azonban a fantáziájára bízom mindenkinek.

ASSEMBLY-nyelv

Ez a legtermészetesebb nyelv, a processzor számára, tehát itt sincs sok bajunk a dologgal:

mov dx,378h

mov al,1

out dx,al

Ez a fenti példában 10-es sor megfelelője.

in al,379h

Ez pedig a 30-as BASIC sor ASM verziója.

Ugye, milyen egyszerű? J

C-nyelv

Itt igazán sok lehetőségünk van. Pl. az ASM direktívával azonnal assembly kódot szúrhatunk be:

asm out dx,al

asm in al,379

Vagy ha sok ASM utasítás kell, akkor a direktíva mögé kapcsos zárójelben is felsorolhatjuk őket. (Lásd. a C HELP-jét, mert az implementációtól is függhet.)

Vannak persze könyvtári függvények is a port-kezelésre. Pl.:

<DOS.H>

adat=inportb(portcim) ;

outportb(portcim, adat);

Van szavas átvitel, meg sok egyéb érdekesség is, de arra itt nemigen lesz szükségünk. Külön előny, hogy regiszternek változóérték is adható, tehát a C-programunk és az ASM között a határ elmosható:

asm mov al,portadat

PASCAL-nyelv

Itt is adott az .ASM direktíva, vagyis akárcsak a C-nél, ez szintén beválik. Van egyébként egy PORTW, meg egy másik PORT tömb, aminek segítségével egyszerűen, direkt írással is lehet kezelni a portokat. A tömb adott sorszámú eleme az adott című porthoz tartozik:

PORTW[$0378]:=1

allapot:=PORT[$0379]

Ezzel rögtönzött kis port-nyelvtanóránk végére is értünk. Az elkövetkezőkben egyszerűbb hardver kiegészítők készítését, illetve ezek programozását fogom bemutatni. Szépen haladunk majd a mind bonyolultabb szerkezetek felé. A példaprogramok zömmel BASIC-ben készülnek, illetve később talán C-- (nem tévedés, C mínusz mínusz J) nyelven, ASM betétekkel.

Ennek főként a hely, illetve időhiány az oka, mert a legrövidebb terjedelmű kódokat így tudom leközölni. Azonban a fenti ismeretek, illetve a későbbi működési leírások birtokában mindenki átírhatja őket a saját maga által preferált nyelvre.

Sokan irtóznak a hardverek programozásától, esetleg egyenesen a forrasztópákához való hozzáéréstől is. Azt hiszik, valami misztikus, vagy bonyolult, esetleg költséges dolog ez a technika. Most, hogy kezdjük egyben látni a dolgokat, döntse el az olvasó, vajon hol van ebben a misztikum, vagy a bonyolultság? S eddig mennyibe is került a játék? Ha ügyesek, találékonyak vagyunk, akkor a későbbiekben se fogjuk otthagyni az alkatrész-kereskedésben ingünk-gatyánk. J

Kis Norbert