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