|
PORTLAR
PARALEL PORT ÇIKISI:
Ilk olarak almis oldugumuz yazici kablosunu kesmemiz gerekiyor.
Kesmeden kablolar soyularakta yapilabilir. Kabloyu kestikten sonra
içerisinden çikan 25 tane kabloyu ayiralim ve uçlarini
soyalim. Data göndermek için bu kablolardan bize sadece
sekiz tanesi gerekli. Bize gerekli olan sekiz kablo, data pinlerinden
gelen kablolar. Bu kablolar direnç,led, protobord ile devre
sekle uygun olarak kurulur. Montaj plakasini kullanarak data pinlerine
giden kablolardan her birinin ucuna bir direnç ve ledi
bagliyoruz. Dikkat etmemiz gereken ledin (+) olan kismini baglamamiz.
Dirençlerin ise belli bir yönü yoktur istediginiz
yönde takabilirsiniz. Genelde led diyotlarda bir bacak daha
uzun olur. Iste o uzun bacak (+) olan tarafidir. Ledin diger bacagini
ise kablodan gelen açik TOPRAK kablosuna birlestirecegiz.
Devremizi tamamladiktan sonra simdi bilgisayarimizdaki paralel
portun adresini bulmamiz gerekli. Bunun için Denetim Masasindan
Sisteme, oradanda aygit yöneticisine girin. Portlara (Baglanti
Noktalari) gelin ve LPT portunun Kaynaklarindan Giris-Çikis
araligindaki degerin ilk kismindaki deger yazici portunuzun adresidir.Default
olarak bu deger 0378 dir.böylece deneyimizin donanim kismi
biter yazilim kismi baslar.
Paralel porttan bilgi gönderme-almanin çesitli yolari
vardir.
-Assembly komutlari kullanarak
-Uygun bir programlama dili componenti kullanarak
-Donanima hükmeden komut setini kullanarak
Assembly ile gönderme ve alma komutlari(win9x’te geçerli)
Göndermek için:
procedure WritePort(wPort
: Word; girilen : Byte);
begin
asm {Assembly kodlarinin baslayacagini belirtiyor}
mov dx, wPort { Disaridan verilen wPort adresine dx tasiyicisinin
bilgi gönderecegini belirtiyor}
mov al, bValue {Programda kullanici tarafindan girilen isimli
degiskeni al’a aktariliyor. }
out dx, al {Al deki bilgi dx portuna yollaniyor}
end; {Assembly kodu bitiyor}
end;
Almak için:
Function portin(IOport:word):byte;assembler;
asm
mov dx,ax {port'taki degeri okumak için}
in al,dx
end;
Smallport isimli delphi komponenti ile bilgi gönderme
programi:
procedure TForm1.Button1Click(Sender: TObject);
var
i,l:byte;
begin
if not SmallPort1.Opened then
smallport1.Opened:=true;
i:=strtoint(edit1.text);
l:=(i mod 256);
smallport1.WriteByte($378,l);
end;
Smallport isimli delphi komponenti ile bilgi alma programi:
procedure TForm1.Button2Click(Sender: TObject);
begin
if not SmallPort1.Opened then
smallport1.Opened:=true;
edit2.text:=inttostr(smallport1.readbyte($379));
end;
komponente ait kullanilan prosedürler sunlar:
procedure TSmallPort.WriteByte(Index: WORD; value: WORD);/*parallel
port data pinlerine deger göndermeye yariyor. */
function TSmallPort.ReadWord(port: WORD): WORD;/* parallel portta
kontrol pinlerinden deger okumaya yariyor*/
Ilk olarak paralel porttan veri çikisini görecegiz.
Yukaridaki paralel port bilgi gönderme devresinde 8 pin
özel bir durum olmadigi sürece degerleri "0"
dir. Biz bu pinlerden istedigimizi "1" durumuna getirebiliriz.
Paralel port üzerindeki bir data pininin "1"
olmasi o pinin +5 Volt olmasi anlamina gelir. Bilgisayar sistemlerinde
temel rakamlar bunlar oldugundan, yazdigimiz diger veri ve adresler
bilgisayar içerisinde ikilik sayi sisteminde islenir.
255 11111111
0 00000000
1 00000001
4 00000100
16 00010000
96 01100000
153 10011001
128 10000000
85 01010101
170 10101010
Paralel port üzerindeki data pinlerinden bir tanesini "1"
yapacagiz, dolayisi ile o pinin elektriksel degeri +5Volt olacak.
Buradan çikan 5 Voltu direnç üzerinden geçirerek
üzerindeki akimin degerini ledi bozmayacak degere düsürüyoruz
ve bunuda led diyotun (+) ucuna bagliyoruz. Ledin diger ucunuda
TOPRAK kismina baglayarak devreyi kapatacagiz
PARALEL PORT BILGI GIRISI:
Önceki uygulamada , paralel porttan basit veri çikisini
incelemis ve porta bagli 8 tane ledi yakip södürmüstük.
Simdi paralel porta bagladigimiz 5 tane buton ile bilgisayara
sayisal veri girisi yapacagiz. Paralel porttan veri girisi STATUS
yada CONTROL portuna ait pinlerden gerçeklestirilebilir.
Hatta bazi ayarlamalar yaparak, eger bilgisayariniz da destekliyorsa,
DATA pinlerinden giris yapmamiz da mümkün olabilir.
Biz STATUS portundan veri girisini inceleyecegiz.
STATUS portu sayesinde, 15 - 13 - 12 - 11- 10 numarali pinlerden,
5 bit sayisal giris yapabiliriz. STATUS portu paralel portunuzun
taban adresinin +1 fazlasinda bulunmaktadir. Örnegin paralel
portunuzun taban adresi h378 ise STATUS portu h379 da bulunacaktir.
Veriyi paralel portun seklinde gözüktügü
gibi S7, S6, S5, S4, S3 pinlerinden yapacagiz. Bu 5 pinlerden
herhangi bir müdahale bulunmadan okuyacaginiz lojik deger
"1" olacaktir. Eger voltmetrenizle bu pinlerdeki voltaji
ölçerseniz +5 Volt oldugunu göreceksiniz. Bu
pinlere baglayacagimiz butonlar ile pinleri topraklayarak lojik
degerlerini "0" yapip bir nevi veri girisi gerçeklestirmis
olacagiz.
Paralel porta veri giris islemi, temel olarak ayni olsa da veri
çikisindan biraz daha karisiktir. Bunun sebebi STATUS
portunda bulunan sinyallerden birinin donanim tarafindan terslenmis
olmasidir. Simdi veriyi 8 bit olarak okudugumuzu varsayalim.
Bu durumda STATUS portundaki binary (ikilik sisteme karsilik
gelen) deger, "11111111" olacaktir. Bu da 10 tabaninda
255 'e denk gelmektedir. Fakat gelin görün ki, bu
porttan veriyi okudugumuz da bambaska bir deger olan 127 ' ye
rastlayacagiz. Dikkat ederseniz 127 degerini binary olarak okursak
"01111111" degerini elde edecegiz. Iste buradaki 127
degerinin okunmasinin sebebi pinlerden bir tanesi olan S7 nin
terslenmis olmasidir. Yani S7 ye karsilik gelen pine veri yolladigimizda
o pinin degeri "1" olacaktir. Digerlerine veri yolladigimizda
ise degerleri "0" olacaktir. Veriyi 8 bit olarak okudugumuzu
varsaymistik. Iste okudugumuz degerin son 3 bitini esasinda
okuyamiyoruz. Yani 127 degerinin okunabilir karsiligi "01111xxx"
olacaktir. Buradaki x lerin bir degeri yoktur. Iptal edilmis
bitleri göstermek için kullandim. Gerçekte
okunan deger "01111" olacaktir. Bu da STATUS portuna
veri girisinin 5 bit oldugunu bize bir daha gösterecektir.
Daha rahat islem yapabilmek için tersinmis olan S7 bitini
bizim yazilim olarak tekrar tersindirmemiz gerekmektedir. Yani
porta hiç bir müdahalede bulunmadan okumak istedigimiz
deger "11111xxx" olmalidir. Bu durumda en bastaki
biti tersindirmemiz gerekecektir. Bu islemi yapmanin en kolay
yolu Xor kullanmaktir. Bu programi yaptiginiz dile gore degisir.
Bazi bilgisayarlarda bu Xor lama islemine hiç gerek kalmaz.
Asagidaki tabloda hangi butonlara bastigimizda, yukaridaki komutla
hangi veriyi okuyabilecegimizi gösterilmistir.
Butonlar S7 S6 S5 S4 S3 S2 S1 S0 10 tabanindaki deger
S5 1 1 0 1 1 1 1 1 223
S4 1 1 1 0 1 1 1 1 239
S5 ve S4 1 1 0 0 1 1 1 1 207
Tümü 0 0 0 0 0 1 1 1 7
Kullanmadigimiz S0,S1 ve S2 degerleri genelde "1"
olarak gelmektedir fakat bazen bu degisebiliyor. Eger portunuzdaki
bu degerler degisik ise farkli bir sonuç elde edebilirsiniz.
Benim denedigim diger bir bilgisayarda XOR kullanmadan ilk okudugum
deger 120 idi. Bu da ikilik sistemde "01111000" degerine
karsilik geliyordu. Bu durumda kullanilmayan S2,S1 ve S0 degerlerinin
"0" olarak geldigini gördüm. Bu degeri yukarida
anlattigim sekilde S7 ye ve S3, S2, S1 pinlerine yönelik
"1000111" maskesi ile XOR layip, ilk okunan degeri
"11111111" yani 255 olarak alabildim. Simdi bu kadar
ugrasmaya ne gerek var diye düsünebilirsiniz. Yani
alti üstü veriyi evirip çevirip 255 degerini
elde ettik. Esasinda bu tamamen size kalmis veriyi XOR lamak
zorunda degilsiniz. Bu sadece hesaplamalarda ve mantikta biraz
kolaylik saglayacaktir. Önemli olan okunan verinin siz
butona bastikça degismesidir.
|