CCS C Ön İşlemci Komutları

Ön İşlemci Komutları

PIC16F877 Ön İşlemci Fonksiyonları

Ön işlemci komutları derleyiciye programın nasıl derleneceği hakkında bilgi verir.  Programın işleyişine engel olmaz ve program çıktısına yansımaz.

Hafıza Kontrol Komutları

#asm #endasm

     Bu iki komut arasında assembly komutları yazılabilir.  C ile programlanırken asssembly komutlarının kullanımına olanak sağlar.

#org

     İstenen komutların ROM bellekte istenen adresten başlayarak yerleştirilmesini sağlar.

#org 0x1E02, 0x1FFF
void ornek()
{
……}

örnekte bu fonksiyon ROM bellekte 1E02 adresinden 1FFF adresleri arasına yazılır.
Tek adres yazılır ise o adresten başlanarak devam edilir.

#rom

     Rom bellekte istenen adreslere süslü parantez içindeki kısmın yazılmasını sağlar.

#rom 0x3000={1,2,3,7,8}

parantez içinde verilen değerler 0x3000 adresine sırası ile yazılır.  

#reserve

     İstenen adres veya adres aralığının RAM bellekten ayrılması için kullanılır. Ayrılana adresler derleyici tarafından kullanılmaz. Bu komut #device komutundan sonra kullanılır.

#device PIC16F877
 
#reserve 0x52              // 0x65 derleyici tarafından kullanılamaz
#reserve 0x45,0x25,0x4A   // yazılan adresler yırtılmıştır.
#reserve 0x71:0x80       // yazılan iki adres aralığı yırtılmıştır.

#byte

     Belirtilen isimde bir değişken, 8 bit’lik bir adrese yerleştirilir. 

#byte portc=0x04
#byte portz=0x03

yukarıdaki örnekte portc ve portb değişkenleri 0x04 ve 0x03 adreslerine yerleştirilmiştir. 

Bu komut ile değişken bellekte istenen adrese yerleştirilmektedir. Fakat derleyici otomatik değişken yerleştirmelerinde başka değişkeni bu komut ile belirlediğimiz aynı adrese yerleştire bilir. Bu olayı önlemek için #locate komutu kullanılır.

#locate

     Bu komut #byte  komutu ile aynı özelliktedir; istenen değişkeni  istenen adrese yerleştir, farklı olarak kullanılan adresin derleyici tarafından başka amaçlar için kullanılmasını önler.

#locate a=0x65

#bit

     Herhangi bir değişken veya sabit, herhangi bir  adresin istenen biti ile ilişkilendirilebilir.

int durum;
#bit okuma=durum.2
okuma=1;   // durum değişkenin 2. biti 1 yapılıyor

okuma değişkenin 2. bit’ini 1 şeklinde değiştiriliyor.  okuma adlı değişken durum değişkenin 2. bitini ifade etmektedir. #bit ile tanımlanan değişken sadece 1 ve 0 alabilir.

#zero_ram

     Program başlangıcında kaydedicilerin içeriğini sıfırlar.

#word

     Program başında #word tanımlanan veya tanımlanmayan değişken bellekte istenen adrese kaydedilir. #word komutu ile tanımlanan değişken önceden tanımlanmamış ise  derleyici tarafından otomatik 16 bit tamsayı türünde yeni tanımlanmış değişken olarak tanımlanır.

#word a=0x0060

a değişkeni 16 bitlik tamsayı türünde oluşturuldu ve 0x0060 adresine kaydedildi.

#TYPE

  • Kullanılacak veri türlerinin türlerinin bit sayılarının ayarlanmasını sağlar.
  • Kullanılacak değişkenlerin tersi belirtilmedikçe işaretli veya işaretsiz olarak algılanmasını sağlar.
  • Kaydedilen RAM bölgesini belirleme işlemleri yapabilir.
#TYPE SHORT=8, INT=32

yukarıdaki kod satırında  short kelimesi 8 bitlik ve int 32 bitlik hale getirilmiştir. Normalde int kelimesi 8 bitlik veri türü olduğunu unutmayınız.

#TYPE ile SHORT, İNT ,LONG ve DEFAULT kelimeleri kullanılabilir.

#TYPE SIGNED 
 
int x; 

yukarıdaki komut kullanıldığı bir programda işaretli belirtilmeyen değişken tanımlamalarının hepsi işaretli şeklinde tanımlanır.

addressmod (benim_RAM, 0x0110,0x01FD);
#TYPE default=benim_RAM

yukarıdaki örnekte addressmod komutu ile tanımlanan başlangıcı 0x0110, bitişi 0x01FD olan bir RAM bölgesi tanımlanmıştır.
#TYPE default=benim_RAM komutu ile değişkenlerin kaydedileceği sınırları belirlenen adresse benim_RAM bölgesi seçilmiştir. Yani benim_RAM bölgesi 0x0110 ile 0x01FD aralığındadır ve değişkenler bu alan içine tanımlanacaktır.

Önceden Tanımlanmış Sabitler

DATE

Derlenen dosyanın tarihini verir.

printf(“Derleme Tarihi”);
printf(__DATE__);
TIME

Derlenen dosyanın zamanını verir.

printf(“Derleme Zamanı:);
printf(__TIME__);
LINE

O anda işlenen komutun satır numarasını verir.

printf(“Satir Numarasi”);
printf(__LINE__);
FILE

Derlenen dosyanın ismini verir. Dosyamızın ismi turkmuhendis olsun

char p[]=__FILE__;

p dizisinin içerisine turkmuhendis karakterleri atanmıştır.

PCB,PCM,PCH

Programın derleneceği sırada  hangi derleyici modülünün kullanılacağını belirtir.

#ifdef__PCB__
#device PIC18F452
#endif
DEVICE

Programın içinde tanıtılan cihazın kodunu verir.

#DEVİCE PIC16F877
int16 a;
a=__device__

a‘nın değeri 877 olur. PIC16F877 kodu 877 dir.

Standart C Komutları

#define

#undef

C programlamadan hatırlanacağı üzere programın başında bir global değişken tanımlanır.

#define x=3;

x değişkeni programın her alanında 3 değeri alır.

Define ile tanımlanan değişkenin  değerini serbest bırakır.

#define x=3;
#undef x;

x değişkenin değeri artık 3 değildir.

#if,#else,#elif,#endif

     C programlama dilinde kullanılan şart ifadelerinden olan if deyimi pic programlamada aynı görevi yerine getirir. Kontrol döngüsü #if ile başlar #endif ile sonlanır. Kontrolün içinde şart doğru ise #else komutuna kadar olan görev bloğu gerçekleştirilir, şart yanlış ise #else ile #endif bloğu arası gerçekleştirilir. elif de c programlamada else if ile aynı işlevdedir.

#if x>5                        // eger x degeri 5’ten buyukse
      unsigned int16 deger;   // bu satır islenir
#elif                         // eger x degeri 5’ten buyuk degilse 
      unsigned int8 deger;    // bu satır islenir
#else                       // x degeri 5’ten ne büyük de eşitse
      signed int8 deger;     // bu komut yapılır
#endif                      // sonlandır

#ifdef, #ifdef

     İfdef komutu programın herhangi bir yerinde #define ile değişken tanımlanıp tanımlanmadığını kontrol etme amaçlı kullanılır, yapılmış ise #else koduna kadar olan kısmı, yapılmamış ise #else ile #endif arasındaki komut satırları işlenir.

     ifndef komutu ise efdef komutu ile yapılanın tam tersini yapar. Tanımlama yapılmış ise #else ile #endif , yapılmamış ise #else kelimesine kadar olan kısım yapılır.

#list, #nolist

     C derleyicisinde yazılan C kodunu assembly kodu karşılığını görülebiliyordu. Bu işlem gerçekleştirdiğinizde derleyici size .lst  uzantılı bir dosya oluştur. Oluşturulan bu dosya içerisinde kodlarınızın hem assembly hemde C karşılığını görebilirsiniz. #nolist ile #list kodu arasında assembly kodunun C karşılığı .lst dosyasında gösterilmez. 

#error

#warning

    Derleme işlemi gerçekleştirtiği sırada programın hata mesajı yazdırmasını sağlar.

#error //hata mesajı yaz

   Derleme işlemi sırasında #error komutu ile benzer olarak hata mesajı yazdırır.

#warning //hata mesajı yaz

Denetleyici Tanımlama Komutları

#ID

     Denetleyicilere kimlik numarası verilebilir. ID numarası için ayrılan adresler:

0x2000, 0x2001, 0x2002 normal komutlar ile bu alana erişilmez.  ID numrası 16 bitliktir.

#ID 0x1234 // ID no verilmiştir.
#ID 4,5,6,7 // ID no 0x4567

Dosyadan ID  okutulmak istenirse 

#ID “id_oku.h”   // id_oku.h dosyasından 16 bitlik sayı okunur
#fuses

     Konfigürasyon bit’lerinin ayarları yapılır.

#fuses LP, NOWDT

Bu programda düşük hızlı oslilatör ve Watchdog Timer’ın kullanılmadığını belirtir.

#HEXCOMMET

     Adından da anlaşılacağı üzere derleyicinin oluşturduğu .hex uzantılı dosyanın başına açıklama yazar. Yazılan açıklama programın kod satırını etkilemez.

Fonksiyon Nitelendirici

#INT_...
#int_default
#INT_GLOBAL

  Kesme fonksiyonlarının tanımlamalarında kullanılırlar. (bakınız.)

#INT_EXT // Dış kesme
#INT_EXT2
#INT_RDA
#INT_SSP
#INT_TIMER1
#INT_RTCC
#INT_RB
#INT_TIMER0
#INT_TIMER3

 Pıc denetleyicide tanımlanmayan bir kesme meydana geldiğinde varsayılan kesme olarak kullanılır. Bu durum denetleyici bir pazarzit ile karşılaştığında gerçekleşe bilir.

#int_default
tanimsiz_kesme(){
printf(“lcd_tutc,”Tanımsız kesme”);}

     Pıc denetleyicisinde bir kesme meydan geldiği zaman denetleyici 4 numaralı adrese gider. Pıc denetleyici buradaki dallanma işlemini, gerçekleştirir. Eğer programda bu kesme işleminin gerçekleşmesi sırasında pic derleyicinisin 4 numaralı adrese değildi sizin gitmesini isteğiniz adres olması istenirse  bu komut kullanılır.

#inline
#separete

     Pic derleyicisinde fonksiyon tanımlarken ön işlemci komutu #inline  kullanılırsa bu kodun kullanıldığı fonksiyonun her komutu çağrıldığı yere kopyalanır. Bu sayaede derleme işleminde hızlanma meydana gelir. 

     Bu komutu fonksiyonların derleyici tarafından otomatik inline özellikte komut atamasın engeller. Rom bellekten tasarruf sağlanmış olur. Yığın bellek alanının daha fazla kullanılmasını sağlar.

Yerleşik Kütüphaneler

#use delay

     Program yazarken gecikme komutu kullanılabilmesi için ön işlemci komutu #use delay kullanılması gerekir.

#use delay (clock=4000000)

derleyicinin  4Mhz bir osilatör ile çalıştığını belirtmektedir.

#use standart_io()

     Pıc mikrodertleyicisine hangi portun giriş veya çıkış olarak kullanılcağı bildirilmesi gerekir, bu bildirim yapılmamış ise standart girş ve çıkış portları kullanılır. Bu ön işlemci komutu kullanıldığı zaman portun hangi bitinin giriş veya çıkış olacağının bildirilmesine gerek yoktur, giriş komutu kullanıldığında derleyici pini giriş olarak yönlendirir.

#use standart_io (port ismi)
#use fast_io()

     Bu komut ile beraber set_tris_x() komutu hangi pinin hangi portunun giriş veya çıkış olarak kullanılacağının belirlenmesi gerekir.

#use fast_io ( port ismi)
 
#use fast_io(a)
set_tris_a(0xFF) // a portu hepsi giriş yapılıyor.
#use fixed_io()

     Program boyunca kullanılacak olan çıkış port veya pinlerinin belirklnemsinde kullanılır. Bu komut ile belirtilmeyen port veya pinler çıkış olarak kullanılmamaktadır.

#use fixed_io (port_outputs=pin_ismi, pin_ismi)
 
#use fixed_io(b_outputs_pin_b0, pin_b1)

Derleyici Kontrol Komutları

#priority

     Denetleyici de meydana gelen kesmeleri icra eder aynı anda iki kesme meydana geldiğinde önceli,kli kesmeyi icra eder. Öncelikli kesmeyi bildirmesini sağlar.

#priority ext,timer0

öncelikli kesme olarak ext ve daha sonra timer0 bildirilmiştir.

#case

     Programcının CCS’de küçük büyük harf duyarlılığını açmak için kullanılır.

#IGNORE_WARNINGS

     İgnore kelimesi İngilizceden Türkçeye çevrildiğinde ihmal anlamına gelmektedir. Bu komut derleyicinin uyarı vermesini engellemek amacıyla kullanılır.

/* Tüm uyarıları kapatmak için: */
#IGNORE_WARNINGS ALL
 
/* Tüm uyarıların açık olaması için: */
#IGNORE_WARNINGS NONE
 
*/ Belirli uyarıları almamak için: */
#IGNORE_WARNINGS 200 
#opt

     Derleyici tarafından C kodlarının assembly kodlara daha az komut ve daha iyi çalışma gibi iyi koşullarda çevirmesi gerekir. Derleyici bunu en iyi şekilde yapar fakat programcı tarafından değiştirilebilir. Bu işlem derleyici optimizasyonudur.

#opt optimizasyon değeri
 
#opt 5 // 1332 adet assembly koduna karşılık gelir
#opt 9 // 1327 adet assembly koduna karşılık gelir
5 1 vote
Article Rating
Abone ol
Bildir
0 Yorum
Satır İçi Geri Bildirimler
Tüm yorumlar
0
Düşüncelerinizi paylaşınx