CCS-C Dersleri Önişlemci Direktifleri - 3

Önişlemci direktifleri konusuna devam ediyoruz, biliyorum biraz can sıkıcı bu konular ama size güzel bir temel oluşturacağını düşünüyorum.

YAZI İÇERİĞİ

#org
#reserve
#rom
#int_xxx
#int_global
#int_default
#priority
#fuse
#use delay
#use fast_io
#use standart_io
#use fixed_io
#use rs232
#use i2c
#use spi
#use rtos

#org

Bu direktif istenilen bir fonksiyonun veya sabit tanımlamanın ROM(Program Memory)da ilgili adrese yerleştirilmesini sağlar. Aşağıdaki örnekleri anlamanız #org için yeterli olacaktır.

#org 0x1e00,0x1fff
void BenimFonksiyon()
{
}
// BenimFonksiyon() isimli fonksiyon ROM'da 0x1e00 adresinden başlayacak
#ORG 0x1E00
DigerFonksiyon(){
}
// DigerFonksiyon() isimli fonksiyon ROM'da 0x1e00 - 0x1fff adresleri arasında olacak
#ORG 0x800, 0x820 {} //800-820 arasında hiçbir şey olmayacak
#ORG 0x1C00, 0x1C0F
CHAR CONST KIMLIK[10}= {"123456789"};
// KIMLIK ADLI SABIT DIZI 0x1C00 adresinden başlayacak

#reserve

Bu direktif RAM'de istenilen adres veya adres bölgesinin reserve edilmesini yani derleyici tarafından kullanımının engellenmesini sağlar. Kullanımı şu şekildedir

#reserve adres    // tek adresi reserve etme
#reserve adres,adres,adres  // birden fazla adresi reserve etme
#reserve adres:adres // bir adres aralığını reserve etme

Önemli Not: #reserve direktifi mutlaka #device direktifinden sonra gelmelidir.

#reserve 0x50          // 0x50 RAM adresini derleyici kullanmayacak
#reserve 0x41,0x46  // 0x41 ve 0x46 RAM adreslerini derleyici kullanmayacak
#reserve 0x40:0x50 // 0x40-0x50 RAM adres aralığını derleyici kullanmayacak.

#rom

Bu direktif ile .HEX dosyasına data girebilme imkanına sahip olabiliyorsunuz. Derleyici yardım dosyasının dediğine göre bu sayede dahili eeprom programlaması yapılabilirmiş. Kullanım şekli aşağıdaki gibidir.

#rom adress = {list} // elemanlar 16 bit olarak (word) yazılır
#rom int8 adress = {list} elemanlar 8 bit olarak yazılır (byte)

Örnek

#rom 0x2100 = {1,2,3,4,5}

#int_xxx, #int_default, #int_global

Programınızda PIC denetleyicisinin interrupt'larından (Kesme) birini veya bir kaçını kullandığınızda bu interrupt için servis verecek fonksiyonu da yazmanız gerekir. PIC'te interrupt vektörü 0x04 adresidir, CCS-C de interrupt kullandığınızda derleyici bu vektöre (0x04) yerleşecek kodu otomatik olarak ayarlar. Diyelimki programınızda TIMER0 kesmesi kullanacaksınız, bu durumda TIMER0 için interrupt Servise Routine (ISR) yani kesme hizmet fonksiyonu yazmanız gerekecektir. Aşağıda örneğini veriyorum

#INT_TIMER0     // TIMER0 Kesmesi kullanılacak
timer0_isr()        // kesmenin fonksiyonu bu
{
işletilecek kodlar    // buradaki kodlar işletilecek
....
...
}

PIC'in interrupt mekanizmasına ilerki yazılarda ayrıntılı olarak değineceğiz.
CCS-C de kullanılabilecek kesmelerin listesine yardım dosyalarından veya program içerisindeki View->Valid İnterrupts yolunu takip ederek seçtiğiniz çipte hangi interruptları kullanabileceğinizi görebilirsiniz.

char ch;
#int_rda
void pc_den_veri_al()
{
ch = getc();
}

Bu örenekte de RS232 Receive Data Available (Veri alındı ve okunmak için hazır) kesmesinin kullanım örneği görülüyor.

#int_global direktifine gelecek olursak, bu direktifi kullanarak PIC'in kesme vektörüne yazılacak kodu siz belirleyebilirsiniz. Kullanırken dikkatli olmak gerekir zira derleyici Context Saving olayına girmez bu işi size bırakır. Bu konuya da başka bir yazıda değineceğiz.

#int_global
void interrupt_dispatcher()
{
..
..
..
}

#int_default direktifi ise PIC'in bir kesme oluşturduğu ama hiç bir kesme bayrağının set edilmediği veya bir kesme bayrağının set edilip kesme'nin tetiklenmediği durumlar için kullanılır. (CCS-C'nin yalancısıyım :) )

#priority

Bu direktif kesmelerin aynı anda oluşmaları durumunda öncelikli olarak hangisinin servis edileceğini belirlemek için kullanılır

#priority rtcc,timer1 // rtcc ve timer1 kesmesi aynı anda gelirse
// ilk olarak rtcc servis edilecek

#fuse, #use_delay

Bu iki direktifi daha önce anlatmıştım http://www.teknobakis.com/2008/07/21/ccs-c-dersleri-bit-ve-byte-islemleri-dahili-fonksiyonlari/ buradan bakabilirsiniz

#use fast_io, #use standart_io, #use fixed_io

Bu direktiflere de şu yazıda değinmiştim http://www.teknobakis.com/2008/07/19/ccs-c-dersleri-dahili-giris-cikis-komutlari-ile-pic-portlarinin-kullanimi/

#use rs232, #use i2C, #use spi

RS232 haberleşmesi kullanacaksanız bu direktif ile haberleşme hızı, bit sayısı, kullanılacak PIC Port'ları gibi ayarları yapmanız gerekiyor. Aynı durum i2c ve spi haberleşmesi için de geçerli.

Tüm bu haberleşme protokollerine birer yazı ayıracağım için burada ayrıntılarına girmiyorum.

#use rtos

Bu direktif derleyicinin RTOS (Real Time Operating System - Gerçek Zamanlı İşletim Sistemi) desteği kullanılmak istediğinde bazı ayarlamaları yapmak için kullanılır. RTOS konusuna derslerimizin en sonunda değinmeyi düşünüyorum

Ona sonra değin buna sonra değin derken kalan kısmını 2 yazı olarak planladığım Önişlemci Direktifleri Konusunu 1 yazı harcayarak bitirmiş bulunuyorum. Sıradaki konuyu henüz düşünmedim ama bu konudan daha eğlenceli olacağına emin olabilirsiniz :)


Yazıyı Paylaşın:

  • Digg
  • del.icio.us
  • Facebook
  • Mixx
  • Google
  • E-mail this story to a friend!
  • Print this article!
  • Reddit
  • Spurl
  • StumbleUpon
  • Technorati
  • TwitThis
  • BlogMemes
  • description
  • Fark
  • LinkArena
  • MyShare
  • Slashdot
  • Socialogs
  • YahooMyWeb
Yazıya yapılan yorumları RSS ile takip edebileceğiniz gibi, Siz de yazıya yorum ekleyebilir, veya kendi sitenizden geri izleme yapabilirsiniz.

Benzer Yazılar

“CCS-C Dersleri Önişlemci Direktifleri - 3” yazısı için 3 Yorum yapıldı

  • Kemal
    25 Ağustos, 2008, 21:05

    Eline sağlık kardeşim çok faydalı bilgiler veriyorsun
    Başarılar dilerim

  • 26 Ağustos, 2008, 18:00

    Hocam bu yazınız da gerçekten çok güzel olmuş.
    Bu sıkıcı, ezber gerektiren kısımdan kurtulduğumuza çok sevindim:).Yeni yazılarınızı bekliyoruz…
    Çalışmalarınızda başarılar.

Geri izlemeler

  1. CCS-C Dersleri Yazı Listesi | Tekno Bakış

Sizde yorum yapın