You are on page 1of 19

1. C PROGRAMLAMA DL C programlama dili gnmzde en yaygn olarak kullanlan programlama dillerinden biridir.

Bir PC ve bir mikrokontrolr iin yazlm olan C derleyicileri her ne kadar birbirlerine benzeseler de aralarnda baz nemli farklar vardr. PC iin yazlm olan bir C derleyicisi genellikle daha byk olup programcya ok eitli fonksiyonlar sunmaktadr (rnein dosya ap kapama, dosya okuma vs). Bunun yannda, mikrokontrolr iin yazlm olan bir C derleyicisi daha kk olup programcya sunulan fonksiyon says da olduka snrldr. Bununla birlikte, standart C dilini renmi olan bir programc, kullanm olduu mikrokontrolrn mimarisini de bildii takdirde ok kolaylkla C dilinde program gelitirebilir. PIC mikrokontrolrler iin yazlm olan ok sayda C derleyicileri bulunmaktadr. rnein, Forest Electronics firmasnn sunduu FED C, Hi-Tech firmasnn rn olan PICC ve yine ayni firmann rn olan ve cretsiz olarak verilen PICC Lite, CCS firmasnn PCM ve PCW derleyicileri ve bunun gibi daha biroklar. Bu projede Hi-Tech firmasnn rn olan ve olduka popler olan PICC Lite C derleyicisi kullanlmtr. 1.1. PICC Lite Derleyici Hi-Tech firmas tarafndan gelitirilmi olan ve ANSI C standardn izleyen bu C derleyicisi pek ok zelliklere sahip olup birok endstriyel uygulamalarda, retim ve renim amal, ve ayni zamanda elektronik hobi olarak kullanlmaktadr. PICC Lite derleyicisi, yine ayni firmann rettii ve pazarlad PICC derleyicisine ok benzemekte olup, cretsiz olduu iin baz kstlamalar bulunur. rnein, PICC Lite sadece 16C84, 16F84, 16F84A, 16F627, 12F629, 16F877 ve 16F877A PIC mikrokontrolrleri iin kullanlabilir. Bunun yannda, sadece 2 tane RAM bank desteklemektedir (2 bank PIC16F84 iin yeterli olduu halde, PIC16F877 iin yeterli olmayabilir) ve 16F877 ve 16F877A mikrokontrolrleri kullanldnda ROM kapasitesi 2K olarak snrlandrlmtr. Ayrca, PICC Lite derleyicisinde printf fonksiyonu long ve float veri eitleri iin kullanlamaz. Bu kstlamalar dnda PICC Lite ve PICC derleyiciler ayni olup her iki derleyiciyi de kullanarak ok karmak PIC uygulamalar gelitirmek mmkndr. Bu blmde, PICC Lite derleyicisinin zelliklerini ve bu derleyici ile C program gelitirmeyi inceleyeceiz. 1.2. PICC Lite Veri eitleri. PICC Lite C derleyicisi aada belirtilen veri eitlerini desteklemektedir. Burada kk harf kullanldna dikkat edilmelidir. . bit unsigned char signed char
1

unsigned int signed int long unsigned long float double imdi bu veri eitlerini rneklerle daha yakndan inceleyelim. 1.2.1. bit Bu veri eidinde saylar Boolean (0 veya 1) olabilir. rnein, aadaki tanmda deiken flag sadece 0 veya 1 deerlerini alabilir. bit flag; 1.2.2. unsigned char Bu veri eidi ile 8 bitlik saylar tanmlanr ve bu saylar 0 ve 255 arasnda deer alabilirler. rnein, aadaki veri tanmnda deiken q, 0 ve 255 arasnda herhangi bir deer alabilir ve burada q 180 olarak deerlendirilmitir. Ayn zamanda, deiken a karakter R ye eitlenmitir. unsigned char tanm ile hem 8 bitlik bir integer ve hem de bir karakter tanmlanabilir: unsigned char q,a; q = 180; a=R; Burada dikkat edilecei gibi, C dilinde her satr noktal-virgl (;) iareti ile bitmektedir. Satr sonuna bu iaret konulmad takdirde derleyici hata verecektir. 1.2.3. signed char aret ieren bu veri tanm, -128 ve +127 arasndaki saylar tanmlamak iin kullanlr. Aadaki rnekte deiken pye50 deeri ve deiken zye 28 deeri verilmitir: signed char p,z; p = -50; z = 28; 1.2.4. unsigned int Bu tanm ile 16 bit olan ve 0 ile 65535 arasnda deien saylar tanmlanabilir. Aadaki rnekte, deiken qya 915 ve deiken xe 3000 deerleri verilmitir: unsigned int q; q = 915; x = 3000;
2

1.2.5. signed int aret ieren ve 16 bitlik saylar iin kullanlan bu tanmda, saynn -32768 ve +32767 arasnda olmas gerekir. Aadaki rnekte deiken tye -500 deeri verilmitir: signed int t; t = -500; 1.2.6. long 32 bit ve iaret ieren saylar iin kullanlan bu tanmda saynn -2147483648 ve +2147483647 arasnda olmas gerekir. rnein, aadaki tanmda deiken m long olarak tanmlanm ve deeri 200000 yaplmtr: long m; m = 200000; 1.2.7. unsigned long 32 bit iaretsiz saylar iin kullanlan bu tanmda saylarn 0 ve 4294967295 arasnda olmas gerekir. Aadaki rnekte deiken k unsigned long olarak tanmlanm ve deeri 2000000 yaplmtr: unsigned long k; k =2000000; 1.2.8. float Bu tanm 24 veya 32 bitlik kayan nokta deikenler iin kullanlr. . Kayan nokta deikenler matematik ilemlerinde ok nem tamaktadrlar. Aadaki rnekte deiken tempe 1.23 deeri verilmitir: float temp; temp = 1.23; 1.2.9. double Bu tanmda saylar 24 veya 32 bit olabilmektedir. Aadaki rnekte deiken sum 12.45 deerini almaktadr: double sum; sum = 12.45; 1.3. Deikenlere Tanm Esnasnda Deer Vermek C programlama dilinde deikenlere tanm esnasnda deer vermek mmkndr. rnein, aada deiken tempe tanm esnasnda 10 deeri ve deiken
3

xe ise karakter A deeri verilmitir: unsigned int temp = 10; unsigned char x = A; 1.4. Programda Aklayc Yazlar ki tane ne eik izgiden (//) sonra yazlanlar derleyici tarafndan neme alnmamakta ve programn almasn kolay anlamak iin bu tip aklayc yazlar tavsiye edilmektedir: i = 0; j = j + 2; //i deikenini sfr yap //j deikenine 2 ilave et //imdi iki sayy arp // ve neticeyi sakla

Aklamalar bir dier ekilde yazma format ise, aklamay /* karakterleri ile balatmak ve */ karakterleri ile bitirmektir. Aadaki rnekte bu aklama ekli gsterilmitir: /* Bu program iki tane sayy toplar. Saylardan biri x, dieri ise y dir. Netice z de saklanir. */ z = x + y; Herhangi bir programda her iki tanm eklini de kullanmak mmkndr. 1.5. Deikenlerin Bellekte Saklanmas PICC Lite C derleyicisinde deikenler normal olarak RAM bellekte (genel maksatl yazmalarda) saklanmaktadr. Eer bir deikenin deeri sabitse ve program boyunca deimeyecekse, o deikeni program belleinde (EPROM veya Flash) saklamak mmkndr. Bu ekilde, kapasitesi snrl olan RAM bellei ok kullanlmam olur. Sabit bir deikeni program belleinde saklamak iin nne const komutu ilave edilmeli ve deikenin deeri tanm esnasnda belirtilmelidir. Aadaki rnekte temp1 deikeni RAM belleinde saklanr, temp2 deikeni ise 12 deerini alr ve program belleinde bir sabit olarak saklanr. Burada temp deikeninin deeri program boyunca sabit olup program ierisinde deitirilemez. temp 1 deikeni ise istenildii gibi ve istenilen an deitirilebilir: int temp1 ; const int temp = 12; 1.6. Diziler

Diziler (arrays) benzeri bir takm deikenleri bir grup altnda toplamak iin kullanlrlar. rnein, int sonuc[6]; Komutu ekil 1.1 de gsterildii gibi 6 tane tam say tanmlar ve bu tam saylarn ilki sonuc[0], ikincisi sonuc[1], ve sonuncusu ise sonuc[5] olmaktadr.

Sonuc[0] Sonuc[1] Sonuc[2] Sonuc[3] Sonuc[4] Sonuc[5] ekil 1.1 6 elemanl bir dizi rnein, sonuc[3] = 18 komutu sonuc dizisinin 4nc elemann 18 saysna eitler. Ayn ekilde, sonuc[2] = sonuc[1] komutu sonuc dizisinin 2inci elemann 3nc elemanna eitler. Bir dizinin elemanlar RAM bellekte veya program belleinde saklanabilirler. Eer elemanlarn deerleri sabitse ve program boyunca deimeyecekse, const komutu kullanarak bu elemanlar program bellekte saklanabilirler. Bu ekilde, kapasitesi kstl olan RAM bellek de kullanlmam olur. Aadaki rnekte 5 elemanl temp dizisinin elemanlar program bellekte saklanrlar. Bu dizi bellekte 10 bayt tutar (her integer 2 bayt yer tutar): const int temp[] = {1, 5, 9, 12, 45}; Aadaki rnekte ise temp dizisi RAM bellekte 10 bayt tutar: int temp[] = {1, 5, 9, 12, 45}; C programlama dilinde string deikenleri ASCII 0 ile sonlandrlan ve bir takm karakterler ihtiva eden dizilerdir. Bu durumda, char name[ ] = Suzan; Komutunda derleyici otomatik olarak name stringi iin sonuncu karakteri ASCII 0 olan 6 karakter ayrr. Bu rnekte dizi RAM bellekte saklanmtr. Ayn dizinin bana const komutu koyarak diziyi program bellekte saklayabiliriz.
5

Diziler birden ok boyutlu olabilirler. Aadaki rnekte ve ekil 1.2 de 2 boyutlu bir dizi tanmlanmtr: int temp[3][5]; Temp[0][0] Temp[1][0] Temp[2][0] Temp[0][1] Temp[1][1] Temp[2][1] Temp[0][2] Temp[1][2] Temp[2][2] Temp[0][3] Temp[1][3] Temp[2][3] Temp[0][4] Temp[1][4] Temp[2][4]

ekil 1.2 iki boyutlu bir dizi Burada temp, 3 sras ve 5 stunu olan bir dizi olarak dnlebilir. Dizinin ilk eleman temp[0][0], ikinci eleman temp[0][1], nc eleman temp[0][2] vs dir. rnein, temp[0][1] = 10 komutu dizinin ikinci elemann 10 saysna eitler. Dizi elemanlarn tanm esnasnda belirtmek mmkndr. Aadaki rnekte test dizisi RAM bellekte saklanm ve elemanlar test[0]=2, test[1]=5, ve test[2]=8 olarak belirlenmitir: int temp[3] = {2,5,8}; Daha nce bahsedildii gibi, const komutunu kullanarak dizi elemanlarn program bellekte sabit olarak saklayabiliriz. 1.7. Program Deiken isimleri Program deikenleri bir karakter veya alt izgi (_) ile balamal ve bunu takiben istenilen miktarda karakter veya 0-9 arasnda say kullanlmaldr. Aadakiler geerli olan baz program deiken isimleridir:

size toplam_miktar max5 _ortalama j ge2ci23ci a_b_c_d 1.8. Static Deikenler Static deikenler genel olarak bir fonksiyonda bulunan ve fonksiyonu her kullanta deerleri deimeyen deikenlerdir. Bu deikenleri tanmlarken isimleri bana static yazlr. rnein, bir fonksiyona girite, fonksiyonda daha nce kullanlan bir deikenin deeri belirsizdir. Fakat deikeni static yapmakla deerini muhafaza etmi oluruz.
6

1.9. Volatile Deikenler Volatile deikenler, bir deikenin her kullanldnda eski deerini muhafaza edemeyecei durumlarda kullanlr. Btn giri-k portlar ve kesme rutinlerinin deitirdii deikenler volatile yaplmaldr. 1.10. Persistent Deikenler

Genel olarak PIC mikrokontrolr reset yapldnda programda kullanlan btn deikenler ilk olarak sfr deerini alrlar. Yalnz baz durumlarda, birtakm deikenlerin reset esnasnda deerlerini kaybetmelerini istemeyebiliriz. Herhangi bir deikenin ismi nne persistent kelimesini yazmakla o deikenin reset esnasnda sfrlanmasn istemediimizi belirtiriz. 1.11. Mutlak Adres Deikenleri

Bir deikenin ismi sonuna @ karakteri konarak o deikene bir mutlak adres deeri verilebilir. rnein, unsigned char Portbit @ 0x06; Yukardaki satrda bellein 6 nc adresinde Portbit diye bir deiken tanmlanmtr. Burada derleyici Portbit deikeni iin bir yer ayrmaz, fakat sadece Portbit ismini mutlak adres 6 ya eitler. Bu tanmn assembler eiti udur: Portbit EQU 06h

Bit veri eidi ve mutlak adres birletirilip istenilen bir adresteki herhangi bir bit okunup deitirilebilir. rnein, STATUS yazmac bellekte adres 3 tedir. Bu yazmacn 3 nc bitini istiyorsak, STATUS yazmacn adres 3 de tanmlayp 3x8 + 3 = 27 nci biti u ekilde tanmlayabiliriz: static unsigned char STATUS @ 0x03; static bit PD @ (unsigned)&STATUS*8+3; Burada PD deikeni bellekteki 27 nci biti (STATUS yazmacnn 3 nc biti) tanmlamtr.

1.12.

Operatrler

Herhangi bir programlama dilinde operatrler son derece nem tamaktadrlar. Btn aritmetik ve lojik ilemler bu operatrler sayesinde yaplmaktadr. PICC Lite derleyicisi aadaki operatrleri desteklemektedir: () [] ! ~ parentez lojik NOT bit tersi
7

+-*/ % ++ -& << >> >= > <= < sizeof == != || && += -= /= |= ^= %= &= <<= >>= 1.13.

aritmetik operatr modulus artr eksilt adresi kayma (shift) operatrleri byktr veya eittir operatr byktr operatr kktr veya eittir operatr kktr operatr bir deikenin ka bayt olduu lojik eittir operatr lojik eit deildir operatr lojik OR lojik AND eitlik operatrleri eitlik operatrleri eitlik operatrleri

Program Ak Kontrol

Program akn deitiren komutlar assembler dili de olmak zere her programlama dilinde son derece nemlidirler. Bu komutlar sayesinde dng yapabiliriz veya bir deikenin deerine bal olarak deiik ilemler yapabiliriz. PICC Lite aadaki program ak kontrol komutlarn destekler: if-else for while do goto break switch - case imdi bu komutlarn kullanmlarn daha yakndan inceleyelim. 1.13.1. if - else Koula bal olarak program akn deitiren bu komut genel olarak u ekillerde kullanlabilir:

if(koul)komut; veya,

if(koul) { komut; komut; . . komut; } veya, if(koul) { komut; komut; . } else { komut; komut; . } sadece bir komut ieren durumlarda u ekilde de kullanlabilir: if(koul) komut; else komut; Burada, komutlar sonunda noktal-virgl iaretlerine dikkat ediniz. Aadaki rnekte, p deikeni 0 ise b deikeni 1 olarak artrlr, aksi halde b deikenine 2 ilave edilir: if(p = = 0) b=b+1; else b=b+2; Yukardaki rnekte eittir operatr olan = = karakterlerinin kullanldna dikkat ediniz.

1.13.2. for for komutu program ierisinde dng yapmak iin kullanlr. Dng bir veya
9

birtakm komutu birden fazla tekrarlamak maksadyla kullanlr. Bu komut u ekillerde olabilir: for(bala; koul; art)komut; veya, for(bala; koul; art) { komut; komut; . } burada, bala dng deikeninin ilk deerini, art ise son deerini belirtmektedirler. Aadaki rnekte dng deikeni i, 1 den 10 a kadar gitmekte ve sayac deikeni 10 defa artrlmaktadr. for(i = 1 ; k = 10; i + + )sayac+ +; for komutunu kullanarak i ie dng yapmak mmkndr. Aadaki rnekte i dng 5 defa ve d dng ise 10 defa tekrarlanmaktadrlar: for(i=0; i<10; i+ +) { for(j=0; j<5; j+ +) { komut; ......... } } 1.13.3. while Dng yapmak iin kullanlan bir baka komut da while komutu olup bu komutun genel kullanm ekli u ekildedir: while(koul)komut; veya, while(koul) { komut; komut; ......... }
10

Belirtilen koul doru olduu mddete dng devam etmektedir. Eer dng banda seenek doru deilse dng ierisindeki komutlar ilem grmezler. Aadaki rnekte dng 10 defa tekrarlanmaktadr:

i=0; while(i < 10) { komut; komut; i++; } while komutunu kullanrken dng ierisinde koulun salanmasna dikkat etmemiz gerekir, aksi halde sonsuz bir dng elde etmi oluruz. 1.13.4. do Dng yapmak iin kullanlan bir dier komut ise do komutudur. Burada seenek dngnn sonunda kontrol edilir ve bundan dolay koul doru olmasa bile dng en az bir defa alm olur. Bu komutun genel kullanm u ekildedir: do { komut; komut; .. }while(koul); Aadaki rnekte dng deikeni j, 0 dan 5 e kadar gitmekte ve dng 5 defa tekrarlanmaktadr: j = 0; do { komut; komut; j++; }while < 5); while komutunu kullanrken dng ierisinde koulun salanmasna dikkat etmemiz gerekir, aksi halde sonsuz bir dng elde etmi oluruz. Ayni zamanda, koul salansa bile dng en az bir defa yaplmaktadr. 1.13.5. break break komutu, bir dng ierisinde ve dng bitmeden, dng dna kmak
11

iin kullanlmaktadr. Aadaki rnekte j deikeni 10 olunca dng durur ve dng sonrasndaki komutlar ilem grrler. Bu komut bir sonra greceimiz switch-case komutunda ok kullanlmaktadr: while(i < 100) { komut; komut; if(j = = 10)break; } 1.13.6. switch - case Bu komut, oklu if-else komutu gibi grev yapmaktadr. Bir deiken alnr ve bu deikenin deerine bal olarak eitli komutlar ilem grrler. Aadaki rnekte, sec deikeninde bulunan ve A ve F arasnda olan 1digit bir hexadecimal saynn decimal sayya dntrlmesi gsterilmitir. Dntrlen say hex gibi bir deikende saklanmtr: Switch(sec) { CaseA: CaseB: CaseC: CaseD: CaseE: CaseF: default: } Burada, sec deikeninin deeri A ise hex deikeni 65 olur, B' ise hex deikeni 66 olur, C ise hex deikeni 67 olur v.s. Eer sec deikeni A ve F arasnda deilse default komutu altrlr ve bu rnekte hex deikeni 0 a eitlenir. switch-case komutunda break komutunun ok sk olarak kullanldna dikkat ediniz (eer break kullanlmazsa program bir sonraki koula devam etmektedir). 1.14. Kullanc Fonksiyonlar Fonksiyonlar genel olarak bir program ierisinde kullanlan ve ana programdan bamsz programdrlar. Her fonksiyonun bir ismi olup istenilirse bir fonksiyon ana programa bilgi aktarabilir. Banda void komutu ile balayan
12

hex = 65; break; hex = 66; break; hex = 67; break; hex = 68; break; hex = 69; break; hex = 70; break; hex = 0; break;

fonksiyonlar ana programa bilgi aktaramazlar. rnein, aadaki fonksiyonun ismi ledon olup bu fonksiyon ana programa bilgi aktarmaz. void ledon() { led = 1; } Aadaki ledon fonksiyonu ise ana programa integer bir bilgi aktarr: int ledon() { komut; komut; return(deiken); } Fonksiyonlar ana programdan bilgi alp bu bilgiyi iler ve tekrar ana programa bilgi aktarabilirler. Aadaki rnekte kare fonksiyonu ana programdan bir integer deer alr (parameter) ve bunun karesini alp ana programa aktarr: int kare(int y) { int w; w = y*y; return (w) ; } Bu fonksiyon ana program tarafndan u ekilde kullanlabilir: s = kare(p); Kare fonksiyonu ana programdan p deikeninin deerini alr ve bu saynn karesini alp geri ana programa aktarr. Fonksiyon bandaki int tanm fonksiyonun ana programa integer (tam say) aktaracan gsterir. Bu durumda, ana programdaki s deikeni p nin karesine eitlenmi olur. Burada nemli olan bir nokta, fonksiyonda kullanlan w ve y deikenleri sadece fonksiyona ait olup ana programda olan bir w veya y deikeni ile hibir ilgileri yoktur. Ayni zamanda, ana programda kullanlan bir deiken ile fonksiyonda kullanlan ve ayn ismi tayan herhangi bir deiken arasnda bir bant yoktur. rnek 3.2 Taban ve ykseklii bilinen bir genin alann hesaplayan bir fonksiyon yaznz ve bulduunuz alan ana programa aktarnz. zm 3.2
Alan = Taban Ykseklik 2

Taban ve ykseklii bilinen bir genin alan,


13

olarak bulunabilir. Bu durumda, istenilen fonksiyon aada verilmitir. Deikenlerin herhangi bir say olabilecekleri gz nnde bulundurularak float veri eidi kullanlmtr: float alan(float taban, float yukseklk) { float i; i = (taban * yukseklik)/2; return(i) ; } Tabann 23.2 ve yksekliin ise 3.4 olduunu kabul edersek bu fonksiyon ana program tarafndan u ekilde arlabilir: hesap = alan(23.2, 3.4); Burada, alan fonksiyon tarafndan hesaplanr ve hesap diye adlandrlan bir deikende saklanr. hesap deikeni, ana programda float olarak tanmlanmaldr.

1.15.

n-ilemci Direktifleri

PICC Lite derleyici, dier standart C derleyicilerde bulunan eitli n-ilemci direktiflerini destekler. Yaygn olarak kullanlan n-ilemci direktifleri aada aklanmtr. 1.15.1. #define Bu direktif program banda kullanlr ve bir makro gibi alp semboller yerine tanmlanan eitlerini koyar.

rnein; #define size 10 #define max 100 #define min 0 program ierisinde bu semboller kullanld zaman yerlerine otomatik olarak deerleri konur: a = 1; a = a + size; // a deikenini 1 yap // a deikeni 11 deerini alr

define direktifi ok kompleks de olabilmektedir. Aadaki makro tanmnda 2*(a+b) ilemi mult(a,b) olarak tanmlanmtr:

14

#define mult(a,b)

2*(a + b)

imdi bu makronun bir program ierisinde kullanmna bakalm. a = 2; b = 5; c = mult(a,b); // a deikenini 2 yap // b deikenini 5 yap // c deikeni 2*(2+5)=14 olur

rnek 3.3 Bir integer 2 bayttan meydana gelmektedir. Byle bir integerin st ve alt bytelarn almak iin define komutunu kullanarak makro yaznz. zm 3.3 st bayt almak iin sayy 8 defa saa kaydrabiliriz. Makro adna ustbayt dersek, #define usfbayt(x) (unsigned char)(x>>8)

olur. Alt bayt bulmak iin ise, sayy, 0xFF (desimal 255) ile mask yapabiliriz. Makro adna altbayt dersek, #define altbayt(x) olur. (unsigned char)(x & 0xFF)

rnek 3.4 Bir deikenin herhangi bir bitini 1 veya 0 yapmak iin define direktifini kullanarak bir makro yaznz. zm 3.4 Herhangi bir biti 1 yapmak iin kullanacamz makroya bit_set dersek, u ekilde yazabiliriz: #define bit_set(var, bitno) ((var) = (1<< (bitno)))

Herhangi bir biti 0 yapmak iin, kullanacamz makroya bit_reset dersek, u ekilde yazabiliriz: #define bit_reset(var, bitno) ((yar) &= ~(1<< (bitno)))

rnein, x deikeninin bit 3 n 1 yapmak iin u komutu kullanabiliriz: bit_set(x,3) ; Ayn ekilde, p deikeninin 6 c bitini 0 yapmak iin u komutu kullanabiliriz:
15

bit_reset(p,6); 1.15.2. #asm ve #endasm Bu direktifler sayesinde bir assembler program veya bir veya birka assembler komutlar C programmza ilave edilebilir: .......... .......... a=2; #asm movlw 10h #endasm ............. ............. Yukardaki programda grlecei gibi assembler komutlar #asm ve #endasm direktifleri arasna yerletirilmelidir. 1.15.3. #include Bu direktifi kullanarak baka bir text dosyasn programmz ierisine alabiliriz. rnein, myproject.h dosyas programmza u ekilde ilave edilebilir: #include myproject.h veya, #include <myproject.h> PIC yazlm gelitirirken <pic.h> dosyas programmza ilave edilmelidir. Bu dosya ierik olarak PIC mikrokontrolre ait eitli deikenleri tanmlamaktadr. 1.16. Programda Deiik Say Taban Kullanm

PICC Lite derleyicisinin normal say taban 10 (desimal) olup birok mikroilemci ve mikrokontrolr uygulamalarnda kullanlan say tabannn zaman zaman deitirilmesi gerekmektedir. rnein, mikrokontrolr tabanl kontrol uygulamalarnda genellikle 16 taban (hexadecimal) veya 8 taban (octal) kullanlmaktadr. Bir sayy hexadecimal olarak yazmak iin nne %x (veya %0X), octal olarak yazmak iin nne %o ve ikili tabanda yazmak iin ise nne 0b koymak gerekir. Aada deiik tabanlarda baz rnekler verilmitir:

toplam = %0x1f;
16

// toplam = 0001 1111

sum = %o37; a = 0b00001111 1.17. Yaplar (Structures)

// sum = 011 111 // a = 00001111

Yaplar, birbirleriyle ilgili olan eitli deikenleri yeni bir deiken altnda toplamak iin kullanlr. rnein, bir ahs hakkndaki, bir takm bilgiler normal olarak u ekilde tanmlanabilir: unsigned char adi[80]; unsigned char soyadi[80]; unsigned int yasi; unsigned char adresi[80]; Bir yap (structure) kullanarak yukardaki tanmlar u ekilde yazabiliriz: struct sahsi { unsigned char adi[80]; unsigned char soyadi[80]; unsigned int yasi; urisigned char adresi[80]; } Bu durumda, sahsi yaps bir ahs hakknda olan btn tanmlar bir at altnda toplam olur. Bir yap yukardaki gibi tanmland zaman bellekte hibir yer tutmaz. Ancak bu yap bir sonraki rnekte gsterildii zaman kullanld zaman bellekte yer tutar. imdi, aadaki yeni tanm yapabiliriz: struct sahsi benim_bilgiler; Yukardaki tanm ile benim_bilgiler yeni bir deiken olup bu deikenin eidi sahsidir ve bu deiken bellekte yer tutar. imdi, bu yeni deikeni kullanarak u komutu yazabiliriz: Benim_bilgiler.yasi = 25; Yaplar kullanarak bir deikene istenilen sayda bit ayrabiliriz. Aadaki rnekte x ve y 1 bitlik deikendirler ve z ise 6 bitlik bir deikendir. Deiken temp flags eidi bir yapya sahip olup bellekte toplam 1 bayt tutmaktadr: struct flags { unsigned char x:1; unsigned char y:1; unsigned char z:6; }
17

struct flags temp;

1.18.

aretiler (Pointers)

C programlama dilinde iareti kavram ok geni olarak kullanlmaktadr. Genel olarak bir iareti bir deikenin bellekteki adresini gsterir. rnein, x bir deiken ise, xi gsteren bir iareti xin bellekteki adresini tutar. aretiler, deiken ismi nne * karakteri koyarak tanmlanrlar. Deiken eidine gre iareti eidi de deimektedir. rnein, bir karakter iaretisi bir integer iin kullanlamaz. Aadaki rnekte, p bir karakter iaretisi olarak tanmlanmtr: char *p; Burada p bir karakter iaretisi olarak tanmland halde u an herhangi bir yerde kullanlm deildir. Herhangi bir deiken nne & karakterini koyarak o deikenin adresini elde edebiliriz. Daha sonra da iareti deikenini kullanabiliriz. rnein, iareti pye, z deikeninin adresini u ekilde ykleyebiliriz: p = &z; p iaretisi imdi z deikeninin adresini tutmaktadr. * operatrn kullanarak, adresi bilinen bir deikenin asl deerini okuyabiliriz. Aadaki rnekte, daha nce tanmlanan z deikeninin deeri 3 yaplmtr: *p = 3; Herhangi bir deikenin adresine eriebilme birok uygulamalarda ok kullanl olmaktadr. Bu ekilde daha verimli ve daha ksa programlar gelitirmek, mmkn olabilmektedir. aretiler dizilerde ok kullanl olmaktadrlar. Bir dizinin ismi o dizinin adresini tutmaktadr. Bu durumda, bir iareti kullanarak dizi ilemlerini kolaylkla yapabiliriz. Bir rnek aada verilmitir: char buffer[10]; tanmlama char *p; p = buffer; yklendi *p = 0; yap p++; adresle) *p = 1; // 10 eleman olan bir buffer // p bir karakter iaretisidir // p iaretiye buffer adresi // buffer dizisinin ilk elemann 0 // pyi artr (sonraki eleman // bufferin ikinci elemann 1 yap

18

Yukarda da grlecei gibi iaretiler ile eitli aritmetik ilemler yapmak ve deiik adreslere gitmek mmkndr. 1.19. EEPROM Bellee Yazp Okuma

Baz PIC mikrokontrolrlerde (rnein PIC16F84) EEPROM bellek bulunmaktadr. Bu bellee yazp okumak iin PICC Lite derleyicinin EEPROM_WRITE ve EEPROM_READ diye iki tane fonksiyonu bulunmaktadr. EEPROM_WRITE(adres, veri) fonksiyonu bellein adresine veriyi yazar. rnein, EEPROM_WRITE(5, 12) komutu bellein 5 inci adresine 12 saysn yazar. EEPROM_READ(adres) fonksiyonu bellein adresinden veri okur. rnein, z = EEPROM_READ(14) komutu bellein 14 nc adresindeki veriyi okur ve deiken z yi bu veriye eitler. 1.20. Konfigrasyon Bitleri

PIC mikrokontrolrn konfigrasyon bitleri _CONFIG(x) komutunu kullanarak istenildii gibi seilebilir. Burada x istenilen konfigrasyondur. Aadaki rnekte Beki Kpek devreden karlr, XT kristal modu seilir ve kod korumas yaplmaz: _CONFIG(WDTDIS & XT & UNPROTECT); PIC konfigrasyon bitlerini yongann programlanmas programlayc yazlmzla da istediimiz gibi seebiliriz. esnasnda

19

You might also like