Port KavramıBu kısımda sadece
Turbo C derleyicisine ait basit port uygulamaları anlatılacaktır. Ancak, başlamadan önce port kavramları konusunda giriş seviyesinde bilgi gerekir. Bunun için
burayı tıklayın. Eğer port kavramı konusunda yeterli bilgiye sahip olduğunuzu düşünüyorsanız bu kısmı atlayabilirsiniz.
Geliştirilen bir program içerisinden donanımsal öğelere erişmek veya onları kullanmak için birçok yol vardır. En yalını, ki sistem mimarisi buna izin veriyorsa, bu gibi birimlere aynı bellek gözüne erişilmiyormuş gibi işaretçi değişkenler kullanmaktır; ancak bu durum sistem mimarisinden dolayı her zaman mümkün olmayabilir. Bu durumda, ilgili birimlere erişmek için derleyicilerin sahip olduğu hazır kütüphane fonksiyonları kullanılır
[1].
Port Giriş/Çıkış FonksiyonlarıBir bilgisayarın portlarına erişmek için (outport(), intport() gibi) birçok fonksiyon vardır. Bunlar, sistemin sahip olduğu donanımsal öğelere port üzerinden erişilmesi imkanını sunar. Sistemin donanımsal öğelerine erişmek için derleyiciler birçok fonksiyona sahiptir; tüm listesi için kullanılan derleyicinin başvuru kitabına bakılmalıdır. Tablo 18.1'de, Turbo C derleyicisinde bululunan ve bu konu ile ilgili birkaç fonksiyon tanıtılmıştır (bunlar dışında birçok fonksiyon da vardır!).
NOT
Port fonksiyonlarının kullanılması için dos.h başlık dosyası #include önişlemci komutu ile programa ilave edilmelidir.
Tablo 18.1: dos.h'te tanımlı bazı port erişim fonksiyonları Port FonksiyonuAçıklamavoid outp(int
port_adresi,int
bayt_degeri);
Porta bir baytlık veri yazar
void outport(int
port_adresi,int
deger);
Porta bir kelime* yazar
void outportb(int
port_adresi,unsigned char
deger);
Porta bir baytlık veri yazar
int inp(int
port_adresi);
Porttan bir baytlık veri okur
int inport(int
port_adresi);
Porttan bir kelime okur
char inportb(int
port_adresi);
Porttan bir baytlık veri okur
(*)
kelime (word) : Porta yazılacak veya porttan okunacak, bir tamsayının bellekte kaplayacağı alanı temsil eder. (Bu alan sizeof() operatörü ile öğrenilebilir) Port foksiyonlarının kullanımı, örnek programlar üzerinde, bir sonraki bölümlerde incelenmiştir. Bütün programlar Turbo C derleyicisinde denemiştir. Eger bu derleyiciye sahip degilseniz,
buradan inderbilirsiniz.
Paralel Port ÖrnekleriBu bölümde, bir önceki kısımda verilen port fonksiyonları ile, bir PC'nin paralel portunun nasıl denetleneceği 6 tane örnek programda anlatılmıştır.
NOT
Standart bir PC'de LPT nin alt portlarının adresleri,
DATA için 0x378, STATUS için 0x379 ve CONTROL 0x37A dır;
Program 18.1: outp fonksiyonunun kulanımı
[color=gray] 1: /* 18prg01.c: outp örneği */ 2: 3: #include <stdio>
4: #include <dos>
/* port fonksiyonları için */ 5: 6: #define DATA 0x0378
/* LPT data portuna ait adres */ 7: 8: void main(void)
9: {
10: int deger = 25;
11: 12: outp(DATA,deger);
13: printf("\n%X nolu adrese %d degeri yazildi.",DATA,deger);
[color:8d04=gray:8d04]14: }
Derleme ve çalıştırma: MS DOS (Turbo C)
Linux
C:\TC> tcc 18prg01.c
C:\TC> 18prg01
- - -
Çıktı: ÇIKTI
378 adresine 25 degeri yazildi.
Program 18.1'de 6. satırda tanımlanan porta, 11.satırda 25 değeri yazılmaktadır. Bu değer PC paralel portunun DATA uçlarına yazılır. Bu sebeple 25 değeri ikili sistemde (binary) ifade edilip 8 bite bölünür, yani 25 = 00011001 şekinde DATA portuna yazılır. Burada 1 portun ilgili bacağına +5V DC sinyalini gönderir. 0 olan bağlantı noktalarına ise sinyal gönderilmez. Bu değerler basit bir voltmetre ile ölçülüp test edilebilir.
Porta yazılmak veya porttan okunmak istenen veriyi ikili (binary) olarak görüntülemek yararlı olabilir. Program 18.2'de cevir_taban2 fonksiyonu bu amaçla yazılmıştır.
Program 18.2: outportb fonksiyonun kullanımı
[color=gray] 1: /* 18prg02.c: outportb fonksiyonu */ 2: 3: #include <stdio>
4: #include <dos>
5: #include <math>
6: 7: #define DATA 0x0378
8: 9: long cevir_taban2(int);
10: 11: main()
12: {
13: int deger = 0x19;
/* deger=25 */14: outportb(DATA,deger);
15: printf("\nDATA portuna gonderilen deger %d : %08ld",deger,cevir_taban2(deger));
16: }
17: 18: /* Bu fonksiyon 10 tabanındaki bir sayıyı
19: 2 tabınındaki karşılığını hesaplar. */20: 21: long cevir_taban2(int x)
22: {
23: int i=0,k;
24: long bin=0;
25: 26: while( x>0 )
27: {
28: if(x%2) k = 1;
29: else k = 0;
30: bin += k*pow(10,i++);
31: x /= 2;
32: }
33: 34: return bin;
[color:8d04=gray:8d04]35: }
9. satırdaki cevir_taban2 fonksiyonu, kendisine parametere olarak gelen bir tamsayıyı iki tabana çevirir. Ekranda porta yazılan değer ve onun iki tabanındaki karşılığı, uygyn bir formatla, 8 bit halinde gösterilmiştir.
Derleme ve çalıştırma: MS DOS (Turbo C)
Linux
C:\TC> tcc 18prg02.c
C:\TC> 18prg02
- - -
Çıktı: ÇIKTI
DATA portuna gonderilen deger 25 : 00011001
inp ve inportb fonksiyonları, PC bağlantı noktalarından sırasıyla bir karakter ve bir baytlık veri okumak mümkündür. Program 18.3, bu fonksiyonlar ile nasıl veri okunacağına dair iyi bir fikir verir.
Program 18.3: inp ve inportb fonksiyonlarıyla paralel porta atanan varsayılan değerleri öğrenme
[color=gray] 1: /* 18prg03.c: inp ve inportb fonksiyonlarının kullanımı */ 2: 3: #include <dos>
4: #include <stdio>
5: 6: #define DATA 0x0378
7: #define STATUS DATA+1
8: #define CONTROL DATA+2
9: 10: main()
11: {
12: int veri;
13: 14: puts("Paralel porta atanan degerler (Hex):");
15: 16: veri = inp(DATA);
17: printf( "Data portu : %X\n",veri );
18: 19: veri = inp(STATUS);
20: printf( "Status portu : %X\n",veri );
21: 22: veri = inportb(CONTROL);
23: printf( "Kontrol portu : %X\n",veri );
[color:8d04=gray:8d04]24: }
Port adresleri 6. 7. ve 8. satırlarda tanımlanmıştır. inp ve inportb foksiyonları ile okunanan değerler (sırasıyla DATA,STATUS ve CONTROL) veri değişkenine aktarılmış ve ekrana yazıldırılmıştır. Bu değerler porta hiç bir müdehale olmadan elde edilmiştir ve her bilgisayarda başka bir sonuç verebilir. Bu fonksiyonların tek parameteresi olduğuna dikkat ediniz.
Derleme ve çalıştırma: MS DOS (Turbo C)
Linux
C:\TC> tcc 18prg03.c
C:\TC> 18prg03
- - -
Çıktı: ÇIKTI
Paralel porta atanan degerler (Hex):
Data portu : 4
Status portu : 7F
Kontrol portu : CC
Bir porta herhangi bir veri yazıldıktan sonra, bu veri o portun saklayıcısına (
register) yazılır ve yeni bilgi yazılmadıkça orada kalır. Program 18.4 CONTROL portuna ouportb ile yazılan bir verinin inportb fonksiyonu ile okunması gösterilmiştir.
Program 18.4: inportb ve outportb fonksiyonlarının kullanımı
[color=gray] 1: /* 18prg04.c: inportb ve outportb örneği */ 2: 3: #include <stdio>
4: #include <dos>
5: 6: #define PORT 0x037A
/* kontrol portu */ 7: 8: main()
9: {
10: int deger;
11: 12: deger = inportb(PORT);
/* varsayılan deger */13: printf("\nPorta veri yazilmadan onceki deger : %X",deger);
14: 15: deger = 0x0A;
/* deger = 10 */16: outportb(PORT,deger);
17: 18: deger = inportb(PORT);
19: printf("\nPorta veri yazdiktan sonraki deger : %X",deger);
[color:8d04=gray:8d04]20: }
6. satırda belirtilen porta, Ah değeri, 12. satırdaki outportb fonksiyonu ile yazılmıştır. Yazılan değer CONTROL portunun saklayıcısında saklanmaktadır. Daha sonra bu saklayıcıdan aynı veri 18. satırdaki inport fonksiyonu ile okunmaktadır. Program çıktısı incelendiğinde, portta varsayılan değerin CCh, veri yazıldıktan sonraki değerin CAh olduğu görülmektedir.
Unutmayın, CONTROL portunun ilk ilk dört bitine müdehale edilebilir. Yani birinci C değeri değiştirilemez.
Derleme ve çalıştırma: MS DOS (Turbo C)
Linux
C:\TC> tcc 18prg04.c
C:\TC> 18prg04
- - -
Çıktı: ÇIKTI
Porta veri yazilmadan onceki deger : CC
Porta veri yazdiktan sonraki deger : CA