ELEKTRONIKPC
Would you like to react to this message? Create an account in a few clicks or log in to continue.

C PROGRAMLAMA

Aşağa gitmek

C PROGRAMLAMA Empty C PROGRAMLAMA

Mesaj tarafından Admin Paz Kas. 09, 2008 2:32 pm

C Programlama Dili'ne Giriş


Ders 18: Port Denetimi
Port Kavramı
Port G/Ç Fonksiyonları
Paralel Port Örnekleri
Seri Port Örnekleri
##############------ (%70)
Bu sayfadaki dersin notları %70 tamamlandı.
En son güncelleme: 25.08.2007



--------------------------------------------------------------------------------

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 Fonksiyonu Açıklama
void 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)


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ı
01: /* 18prg01.c: outp örneği */
02:
03: #include <stdio.h>
04: #include <dos.h> /* port fonksiyonları için */
05:
06: #define DATA 0x0378 /* LPT data portuna ait adres */
07:
08: void main(void)
09: {
10: int deger = 25;
11:
12: outp(DATA,deger);
13: printf("\n%X nolu adrese %d degeri yazildi.",DATA,deger);
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.

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ı
01: /* 18prg02.c: outportb fonksiyonu */
02:
03: #include <stdio.h>
04: #include <dos.h>
05: #include <math.h>
06:
07: #define DATA 0x0378
08:
09: 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;
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
01: /* 18prg03.c: inp ve inportb fonksiyonlarının kullanımı */
02:
03: #include <dos.h>
04: #include <stdio.h>
05:
06: #define DATA 0x0378
07: #define STATUS DATA+1
08: #define CONTROL DATA+2
09:
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 );
24: }

Admin
Admin

Mesaj Sayısı : 78
Kayıt tarihi : 19/10/08

http://elektronikpc.yetkinforum.com

Sayfa başına dön Aşağa gitmek

Sayfa başına dön


 
Bu forumun müsaadesi var:
Bu forumdaki mesajlara cevap veremezsiniz