| |
| |
![]() |
![]() | | Konu Seçenekleri | ![]() |
| | #1 |
![]() ![]() ![]() ![]() ![]() | Ders-46 'REGISTRY' PORTLAR ÖN BILGILERE GIRIS:Paralel port, bilgisayarin dis dünyasiyla baglanti kurmasini saglar ve bu sayede buraya takilan aygita dijital olarak bilgi gönderir ve aygittan bilgi alir. Bu bilgi alma ve verme islemlerinin hepsi ikilik sistemde olur. Bilgisayarda temel olan iki büyüklük vardir. Bilgisayar içerisinde veri bu iki deger üzerinden akmaktadir. "1" devrenin kapali (aktif) "0" ise açik (pasif) oldugunu gösterir. Bilgisayarda bu birler ve sifirlarin her birine "BIT"; bunlardan sekiz tanesinin yanyana gelmis sekline "1 BYTE" diyoruz. Bir seferde paralel porttan en fazla 256(11111111) sayisi gönderilebilir.(8 Tane veri ucu bulundugundan) Paralel portta veri transfer hizi genelde 150kb/sn dir. Fakat bu deger su an bir kaç kat artabilmektedir.Bilgisayara bagli her aygitin bellekte bir adresi bulunur ve her açilista BIOS bu adres degerlerini RAM bellege yeniden yükler. Paralel portun da belirli bir adres degeri vardir. Bu adres deger kontrol edilerek paralel porta bagli olan aygitin kontrolü saglanir. Aygit bilgisayara yakin oldugu zamanlarda paralel port kullanilir. Temel olarak paralel port üçe ayrilir. -GIRIS BIRIMI -ÇIKIS BIRIMI -KONTROL BIRIMI Bu deney çalismasinda paralel portun kavranmasi için çesitli direnç, diyot, led gibi aletlerle kurulan devreler olusturulacaktir. -Portun açik olmasi -Portun kapali olmasi PARALEL PORT PINLERI SEMASI( DB25 ) : ![]() 2-3-4-5-6-7-8-9 :Veri uçlari. 10-11-12-13-15 :Giris uçlari. LEDLI PARALEL PORT ÇIKISI DEVRESI: ![]() ![]() 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. ÖRNEK : KODU :Code: procedure TForm1.Button1Click(Sender: TObject);
var
m:integer;
begin
if edit1.Text='' then
showmessage('YAZIM KUTUNUZ BOS!')
else
begin
If not SmallPort1.Opened then
begin
SmallPort1.Opened:= True;
//if smallport1.Opened then showmessage('girdi');
end;
m:=(strtoint(edit1.text) mod 256);
smallport1.WriteByte($378,m);
end;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
smallport1.writebyte($378,0);
CLOSE;
end;
procedure TForm1.Button2Click(Sender: TObject);
var
n:integer;
begin
if not smallport1.Opened then smallport1.opened:=true;
n:=smallport1.ReadByte($379);
edit2.text:=inttostr(n);
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
smallport1.opened:=false;
end;
![]() |
|
| Mesaja teşekkür eden: | YaGMuR_CiNi (07-12-07) |
![]() |
| Konu Seçenekleri | |
| |