Her Yönüyle C
Would you like to react to this message? Create an account in a few clicks or log in to continue.
Her Yönüyle C

Hepsi Burada
 
AnasayfaAnasayfa  PortalliPortalli  GaleriGaleri  AramaArama  Latest imagesLatest images  Kayıt OlKayıt Ol  Giriş yapGiriş yap  

 

 PORTLAR

Aşağa gitmek 
YazarMesaj
Admin
Admin
Admin


Erkek
Mesaj Sayısı : 804
Yaş : 35
Location : KoCaElİ
Kayıt tarihi : 29/10/07

Character sheet
Field:
PORTLAR Left_bar_bleue100/100PORTLAR Empty_bar_bleue  (100/100)

PORTLAR Empty
MesajKonu: PORTLAR   PORTLAR Icon_minitimePtsi Kas. 12, 2007 2:21 am

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) 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
Sayfa başına dön Aşağa gitmek
https://cprogramlama.yetkin-forum.com
Admin
Admin
Admin


Erkek
Mesaj Sayısı : 804
Yaş : 35
Location : KoCaElİ
Kayıt tarihi : 29/10/07

Character sheet
Field:
PORTLAR Left_bar_bleue100/100PORTLAR Empty_bar_bleue  (100/100)

PORTLAR Empty
MesajKonu: Geri: PORTLAR   PORTLAR Icon_minitimePtsi Kas. 12, 2007 2:22 am

Bazen paralel porttan istenen çıkış 8 bitten fazla olabilir. Bu durumda DATA portuna ek olarak CONTROL portunun kullanılması gerekir. DATA portunun 8 bitlik çıkışına, CONTROL portunun 4 bitlik çıkışları da ilave edilirse toplam 12 bitlik çıkış almak mümkün olur. Asagidaki program 12 bitlik veri çıkışının nasıl yapılabilceğini gösterilmiştir. Kullanılan yöntem özetle şöyledir:


  • Veri 3 basamaklı Hex olarak ifade edilir. Çünkü 3 basamaklı Hex veri 12 bitlik binary veriye denktir.
    Örneğin A2F = 101000101111
  • Sağdan ilk 8 bit DATA portuna son 4 bit CONTROL portuna yazılır. Yani veri, veriC ve veriD olarak iki kısma bölünür.
    örneğin A2F = 1010 00101111
  • Soldan ilk 4 bit CONTROL portuna yazılması için, veri bitleri 8 basamak sağa kaydırılır.
    veriC = A2f >> 8 = 000000001010 = A
  • Daha sonra veri bitleri 4 sola ardından 4 sağa kaydırılır.
    A2F <<4>> 4 = 000000101111 = 2F
    veriD = 2F
  • Böylece veri iki kısma ayrılmış olur. Belki siz daha kolay bir yol bulabilirsiniz Smile

Program 18.5: PC Paralel portundan 12 bitlik veri çıkışı




[color=gray] 1:
/* 18prg05.c:
[color=gray] 2:
PC Paralel portundan 12 bitlik veri çıkışı.
3: veri değişkeni bit düzeyinde işlem yapan operatörlerle
[color:3d4a=gray:3d4a] 4: iki kısma ayrılır: veri = veriC + veriD */
5:
6: #include <stdio>
7: #include <dos>
8: #include <math>
9:
10: #define DATA 0x0378
11: #define CONTROL DATA+2
12:
13: long cevir_taban2(int x);
14:
15: main()
16: {
17:
18: int veri,veriC,veriD;
19:
20: veri = 0xF48; /* 3-dijit Hex sayı = 12 bit binary sayı */
21:
22: veriC = veri >> 8; /* CONTROL portuna yazılacak veri */
23:
24: veri <<8>>= 8;
26:
27: veriD = veri; /* DATA Portuna yazılacak veri */
28:
29: outport(DATA, veriD);
30: outport(CONTROL,veriC);
31:
32: printf("\n12 bitlik veri : %X%X (%04ld%08ld)",
33: veriC,veriD,cevir_taban2(veriC),cevir_taban2(veriD));
34:
35: printf("\nCONTROL portuna yazilan veri: %3X (%04ld)",veriC,cevir_taban2(veriC));
36: printf("\nDATA portuna vazilan veri: %3X (%08ld)",veriD,cevir_taban2(veriD));
37: }
38:
39: /* Bu fonksiyon 10 tabanındaki bir sayıyı 2 tabınındaki karşılığını hesaplar */
40: long cevir_taban2(int x)
41: {
42: int i=0,k;
43: long bin=0;
44:
45: while( x>0 )
46: {
47: if(x%2) k = 1;
48: else k = 0;
49: bin += k*pow(10,i++);
50: x /= 2;
51: }
52:
53: return bin;
[color:3d4a=gray:3d4a]54: }

Derleme ve çalıştırma:



MS DOS (Turbo C)
Linux

C:\TC> tcc 18prg05.c
C:\TC> 18prg05

- - -

Çıktı:
ÇIKTI




12 bitlik veri : F48 (111101001000)
CONTROL portuna yazilan veri: F (1111)
DATA portuna vazilan veri: 48 (01001000)


Paralel porttan belli bir formatla veri çıkış almak mümkündür. Örneğin DATA uçlarına belli zaman aralıklarıyla sırasıyla 1 değeri göndemek mümkünkür. Bu işlem, bit düzeyinde işlem yapan operatörler ve basit bir döngü yardımıyla Program 18.6 programında gösterilmiştir. Programda kullanılan delay fonksiyonu ile zaman aralıkları seçilmiştir. conio.h kütüphanesinde bulunan bu fonksiyon, programın çalışmasına (mikroişlemciye hızına bağlı olarak) verilen sayı kadar ara verir.

Program 18.6: DATA-port uclarına sırasıyla 1 değerini gönderme




[color=gray] 1:
/* 18prg06.c: DATA-port uçlarına sırasıyla 1 değerini gönderir */
2:
3: #include <stdio>
4: #include <dos>
5: #include <conio>
6: #include <math>
7:
8: #define DATA 0x0378
9:
10: long cevir_taban2(int);
11:
12: main()
13: {
14: int veri,sayac;
15:
16: sayac = 0; /* döngü sayacı */
17: veri = 1;
18:
19: do
20: {
21: outportb(DATA,veri); /* DATA portuna int veri yaz */
22: printf("\nPorta yazilan veri : %3d %08ld",veri,cevir_taban2(veri));
23:
24: veri <<= 1; /* veriyi binary olarak birer-birer sola kaydır! */
25:
26: delay(500); /* bekle... */
27: sayac++;
28: }while( sayac<8>0 )
38: {
39: if(x%2) k = 1;
40: else k = 0;
41: bin += k*pow(10,i++);
42: x /= 2;
43: }
44:
[color:3d4a=gray:3d4a]45: return bin;
14. satırda veri değişkenine dögüye girmeden önce 1 (00000001) değeri atanmıştır. Döngü koşulu sınandıktan sonra 18. satırda veri DATA portuna yazılmıştır. 21. satırda verinin içeriği 1 bit sola kaydırılrak DATA portunun sadece bir sonraki ucuna 1 değeri gönderilmiştir. 23. satırda bu verinin DATA portunun saklayıcısında, işlemci hızına bağlı, bir süre saklanmış ve ardından bir sonraki çevrime girilmiştir. Bütün verilerin ekran çıktısı incelendiğinde 2 saysının kuvvetleri olduğu görülür.

Derleme ve çalıştırma:



MS DOS (Turbo C)
Linux

C:\TC> tcc 18prg06.c
C:\TC> 18prg06

- - -

Çıktı:
ÇIKTI




Porta yazilan veri : 1 00000001
Porta yazilan veri : 2 00000010
Porta yazilan veri : 4 00000100
Porta yazilan veri : 8 00001000
Porta yazilan veri : 16 00010000
Porta yazilan veri : 32 00100000
Porta yazilan veri : 64 01000000
Porta yazilan veri : 128 10000000

Seri Port ÖrnekleriBu bölümde, yine Standart C'de olmayan bilgisayarın seri portları üzerinden iletişim konu edilecektir.





NOT
Standart bir PC'de COM1 için ilk adres 0x3F8, COM2 için 0x2F8 dir;
Standart PC'lerin seri iletişim portlarına erişim UART olarak adlandırılan bir birim üzerinden gerçekleştirilir. Bu birim anakat üzerindeki bir entegre devredir. Ancak temel olarak bilinmesi gereken alma saklayıcısına ve gönderme saklayıcısına nasıl erişileceği ve UART'ın ayarlarının nasıl yapılacağıdır. Program 18.7'de bir dosya içeriğinin karakter karakter seri port üzerinden karşı tarafa nasıl gönderileceği görülmektedir[1].

Program 18.7: Bir metin dosyasının içeriğini seri porta aktarır.




[color=gray] 1:
/* 18prg07.c: Bir metin dosyasının içeriğini seri porta aktarır */
2:
3: #include <stdio>
4: #include <dos>
5: #include <stdlib>
6:
7: main()
8: {
9: char kr;
10: FILE *dosya;
11:
12: /* UART'ın ayarlanması */
13: outportb(0x3FB,0x80);
14: outport (0x3F8,0x0C);
15: outportb(0x3FB,0x1B); /* 9600 bps.dur biti 1.cift eslik, 8 bit veri*/
16:
17: if ( (dosya=fopen("deneme.txt","r")) == NULL) { /* dosya açılıyor */
18: puts ("Hata oldu! Dosya acilmadi!");
19: exit(1);
20: }
21:
22: while(!feof(dosya))
23: {
24: kr=getc(dosya); /* dosyadan bir karakter oku */
25: while ( (inportb(0x3FD) & 0x20)==0 ); /* gönderme saklayicisi sınanıyor */
26: ouportb(0x3F8,kr); /* porta gönderiliyor */
27: }
28: fclose(dosya); /* dosya kapatiliyor */
29:
30: } [color:3d4a=navy:3d4a]/* main */
Bir UART iletişim işine geçmeden önce ayarlanmalıdır; yani, iletişim hızı, hata biti kullanıp kullanılmayacağı gibi birtakım bilgilerin yerleştirimi yapılmalıdır. UART'ın herhangi bir andaki durumu, yani veri göndermeye hazır olup olmadığı, yeni veri gelip gelmediği gibi bilgiler hat durum saklayıcısı üzerindeki bitlere bakılarak anlaşılır. Örneğin, UART'a gönderilmesi için bir veri yazılmadan önce, göndermek için uygun olup olmadığı sınanmalıdır. Program 18.8'de seri port üzerinden gelen karakterleri alıp ekrana nasıl yazıldığı görülmektedir[1].

Program 18.8: Seri port üzerinden gelen karakterleri alıp ekrana yazar.




[color=gray] 1:
/* 18prg08.c: Seri port üzerinden gelen karakterleri alıp ekrana yazar */
2:
3: #include <stdio>
4: #include <dos>
5:
6: main()
7: {
8: char kr;
9:
10: /* UART'ın ayarlanması */
11: outportb(0x3FB,0x80);
12: outport (0x3F8,0x0C);
13: outportb(0x3FB,0x1B); /* 9600 bps.dur biti 1.cift eslik, 8 bit veri*/
14:
15: while(1)
16: {
17: while( (inportb(0x3FD) & 0x01)==0 ); /* yeni karakter gelene kadar bekle */
18: kr=inportb(0x3F8); /* geleni al ve kr'ye yerleştir */
19: printf("%c", kr);
20: }
21:
22: } [color:3d4a=navy:3d4a]/* main */
Program 18.7 bir bilgisayarda Program 18.8 başka bir bilgisyarda çalıştırıldığında 1. bilgisayardaki deneme.txt adlı dosyanın içindeki karakterler 2. bilgisayarın ekranında görülecektir.
Soru 1: Bu iki programı öyle değiştirin ki, birinin klavyesinden girilen, diğerinin ekranında görülsün.
Soru 2: Program 18.7'de verilen programın karşılığı olan alma programını yazınız; seri porttan gelen karakterleri alıp gelen.txt adlı dosyaya yazan program geliştiriniz. Yazdığınız program nasıl sonlanır? Yani, son karakteri aldığını nasıl belirler? Bunun için Program 18.7'de ne gibi değişiklik yapılmalıdır?
Sayfa başına dön Aşağa gitmek
https://cprogramlama.yetkin-forum.com
 
PORTLAR
Sayfa başına dön 
1 sayfadaki 1 sayfası

Bu forumun müsaadesi var:Bu forumdaki mesajlara cevap veremezsiniz
Her Yönüyle C :: C Programlama :: C Konu Anlatımları-
Buraya geçin: