Pic Programlama

CCS C Ön İşlemci Komutları

CCS C Ön İşlemci Komutları, C programlarının derlenmeden önce çalıştırılan komutlarıdır. Ön işlemci komutları, # işaretiyle başlar ve genellikle kullanılanlar #include, #define, #ifdef, #endif gibi komutları içerir. Bu komutlar, programın derlenmeden önce çalıştırılmasını sağlar ve programın çalışmasını kolaylaştırır. Örneğin, #include komutu ile başka bir dosyanın içeriği programın içine dahil edilebilir. #define komutu ile ise sabit değerler tanımlanabilir.

Hafıza Kontrol Komutları

C dilinde hafıza kontrol komutları, programda bellek yönetimi için kullanılır. Bu komutlar, programın bellekteki verileri doğru bir şekilde yönetebilmesini ve bellekteki hataları tespit etmeyi sağlar. Örnek olarak:

  • malloc() : Dinamik bellek almak için kullanılır.
  • calloc() : Dinamik bellek almak için kullanılır ve bellekteki tüm değerleri sıfıra eşitler.
  • realloc() : Daha önceden alınmış olan dinamik belleği yeniden boyutlandırmak için kullanılır.
  • free() : Dinamik bellekte alınmış olan yerleri geri vermek için kullanılır.
  • sizeof(): bellekteki veri tipinin boyutunu öğrenmek için kullanılır.

Bu komutlar programda bellek yönetimini kontrol etmek ve hata önlemek için kullanılır. Özellikle, free() komutunun unutulmaması programda bellek sızıntılarını önler ve programın çalışmasını stabil hale getirir.

#asm #endasm

#asm ve #endasm komutları C dilinde assembly dili kodlarının C kodları arasına eklenmesini sağlar. Bu komutlar, C programları içinde assembly dili kodlarının kullanılmasını mümkün kılar.

#asm komutu ile assembly kodlarının başlangıcı belirlenir ve #endasm komutu ile assembly kodlarının sonu belirlenir. Örnek olarak:

Bu örnekte, #asm ve #endasm arasına yazılan assembly kodları, a değişkenin değerini iki katına çıkarır. Bu kodlar program çalıştırıldığında, a değişkeninin değeri 20 olacaktır.

Not: Bu örnek sadece anlatım amaçlı verilmiştir ve gerçek bir programda assembly kodlarının kullanılması genellikle C ve C++ programlarında pek tercih edilmez. Assembly kodlarının kullanılması genellikle sistem seviyesinde veya düşük seviyede yazılan programlar için gereklidir.

#org

#org komutu, assembly programlarında bellek adreslerinin atanmasını sağlar. Bu komut ile belirli bir bellek adresine kod veya veri yerleştirilebilir.

Örnek olarak, aşağıdaki assembly kodunda bellek adresi 0x100’de bir değişkenin değeri yerleştirilmiştir:

Bu örnekte, #org komutu ile bellek adresi 0x1000 olarak atanmıştır. Bu adreste _start etiketli fonksiyonun kodu yerleştirilmiştir. Bu fonksiyon sistem çağrısı kullanarak programın çalışmasını sonlandırır.

Bu örnekte belirtilen bellek adresi yerleştirilen kodun çalıştırılması için bir başlangıç noktasıdır ve programın çalışması buradan başlar. Bu bellek adresi önemlidir çünkü programın çalışması sırasında bellekteki diğer veriler ve kodlar ile çakışmamak için bu adres belirlenmiştir.

Not: Bu örnek sadece anlatım amaçlı verilmiştir ve gerçek bir programda assembly kodlarının kullanılması genellikle C ve C++ programlarında pek tercih edilmez. Assembly kodlarının kullanılması genellikle sistem seviyesinde veya düşük seviyede yazılan programlar için gereklidir.

#rom

#rom komutu, assembly programlarında bellek adreslerinin atanmasını ve bellekteki verilerin read-only(sadece okunabilir) olarak işaretlenmesini sağlar. Bu komut ile belirli bir bellek adresine sadece okunabilir olarak kod veya veri yerleştirilebilir.

Örnek olarak, aşağıdaki assembly kodunda bellek adresi 0x8000’de bir sabit değerin yerleştirilmiş olduğu bir alan tanımlanmıştır:

Bu örnekte, #org komutu ile bellek adresi 0x8000 olarak atanmıştır ve #rom komutu ile bu alan sadece okunabilir olarak işaretlenmiştir. db komutu ile sabit değerler 0x12, 0x34, 0x56, 0x78 olarak bellekte yerleştirilmiştir.

Not: Bu örnek sadece anlatım amaçlı verilmiştir ve gerçek bir programda assembly kodlarının kullanılması genellikle C ve C++ programlarında pek tercih edilmez. Assembly kodlarının kullanılması genellikle sistem seviyesinde veya düşük seviyede yazılan programlar için gereklidir. Bu komutun kullanımı ve özellikleri platform ve derleyicilere göre değişebilir.

#reserve

#reserve komutu, assembly programlarında bellekte belirli bir alanın ayırılmasını sağlar. Bu komut ile belirli bir bellek adresinden itibaren belirli bir boyutta bir alan ayırılır ve bu alan kullanılmamakta kalan boş alan olarak kabul edilir.

Örnek olarak, aşağıdaki assembly kodunda bellek adresi 0x2000’den itibaren 32 byte’lık bir alan ayırılmıştır:

Bu örnekte, #org komutu ile bellek adresi 0x2000 olarak atanmıştır ve #reserve komutu ile 32 byte’lık bir alan bellekte ayırılmıştır. Bu alan kullanılmamakta kalan boş alan olarak kabul edilir ve daha sonra ihtiyaç duyulan zaman kullanılabilir.

Not: Bu örnek sadece anlatım amaçlı verilmiştir ve gerçek bir programda assembly kodlarının kullanılması genellikle C ve C++ programlarında pek tercih edilmez. Assembly kodlarının kullanılması genellikle sistem seviyesinde veya düşük seviyede yazılan programlar için gereklidir. Bu komutun kullanımı ve özellikleri platform ve derleyicilere göre değişebilir.

#byte

#byte komutu, assembly programlarında bellekte belirli bir alana byte(8 bit) olarak veri yerleştirmek için kullanılır. Bu komut ile belirli bir bellek adresine byte olarak veri yerleştirilebilir.

Örnek olarak, aşağıdaki assembly kodunda bellek adresi 0x3000’de bir byte değerinin yerleştirilmiş olduğu bir alan tanımlanmıştır:

Bu örnekte, #org komutu ile bellek adresi 0x3000 olarak atanmıştır ve db komutu ile değişkenin değeri 0x12 olarak bellekte yerleştirilmiştir. Bu komut ile veri bellekte byte olarak yerleştirilir.

Not: Bu örnek sadece anlatım amaçlı verilmiştir ve gerçek bir programda assembly kodlarının kullanılması genellikle C ve C++ programlarında pek tercih edilmez. Assembly kodlarının kullanılması genellikle sistem seviyesinde veya düşük seviyede yazılan programlar için gereklidir. Bu komutun kullanımı ve özellikleri platform ve derleyicilere göre değişebilir.

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

#locate komutu, assembly programlarında bellekteki kod veya verinin yerleştirileceği bellek adresini belirlemek için kullanılır. Bu komut ile belirli bir bellek adresine kod veya veri yerleştirilmeden önce bellek adresinin belirlenmesi sağlanır.

Örnek olarak, aşağıdaki assembly kodunda bellek adresi 0x4000’de bir fonksiyonun kodu yerleştirilmiştir:

Bu örnekte, #locate komutu ile bellek adresi 0x4000 olarak belirlenmiştir ve _start etiketli fonksiyonun kodu bu adreste yerleştirilmiştir. Bu komut ile bellek adresi belirlenmeden önce yerleştirilen kod veya veriler belirlenen adrese yerleştirilir.

Not: Bu örnek sadece anlatım amaçlı verilmiştir ve gerçek bir programda assembly kodlarının kullanılması genellikle C ve C++ programlarında pek tercih edilmez. Assembly kodlarının kullanılması genellikle sistem seviyesinde veya düşük seviyede yazılan programlar için gereklidir. Bu komutun kullanımı ve özellikleri platform ve derleyicilere göre değişebilir.

#bit

#bit komutu, assembly programlarında bellekte belirli bir alana bit olarak veri yerleştirmek için kullanılır. Bu komut ile belirli bir bellek adresine bit olarak veri yerleştirilebilir.

Veriler byte, word, dword veya diğer büyüklüklerde yerleştirilir. Ayrıca bit seviyesinde yerleştirme işlemleri için bitwise operatorlar kullanılır. Örnek olarak, aşağıdaki assembly kodunda bellek adresi 0x5000’de bir byte değerinin 0. biti 1 olarak yerleştirilmiştir:

Bu örnekte 0x5000 adresinde yer alan byte verisi 0x01, or operatorü ile 0. biti 1 yapılmıştır. Bu şekilde bit seviyesinde yerleştirme işlemi gerçekleştirilmiş olur.

#zero_ram

#zero_ram komutu, assembly programlarında bellekteki belirli bir alanın sıfırlanmasını sağlar. Bu komut ile belirli bir bellek adresinden itibaren belirli bir boyutta bir alan sıfırlanır ve bu alan kullanılmamakta olan boş alan olarak kabul edilir.

Örnek olarak, aşağıdaki assembly kodunda bellek adresi 0x6000’den itibaren 32 byte’lık bir alan sıfırlanmıştır:

Bu örnekte, #org komutu ile bellek adresi 0x6000 olarak atanmıştır ve #zero_ram komutu ile 32 byte’lık bir alan bellekte sıfırlanmıştır. Bu alan kullanılmamakta olan boş alan olarak kabul edilir ve daha sonra ihtiyaç duyulan zaman kullanılabilir. Bu komut, bellekteki verilerin silinmesi veya bellekteki geçersiz verilerin temizlenmesi gibi amaçlar için kullanılabilir.

Not: Bu örnek sadece anlatım amaçlı verilmiştir ve gerçek bir programda assembly kodlarının kullanılması genellikle C ve C++ programlarında pek tercih edilmez. Assembly kodlarının kullanılması genellikle sistem seviyesinde veya düşük seviyede yazılan programlar için gereklidir. Bu komutun kullanımı ve özellikleri platform ve derleyicilere göre değişebilir.

#word

#word komutu, assembly programlarında bellekte belirli bir alana word (16 bit) olarak veri yerleştirmek için kullanılır. Bu komut ile belirli bir bellek adresine word olarak veri yerleştirilebilir.

Örnek olarak, aşağıdaki assembly kodunda bellek adresi 0x7000’de bir word değerinin yerleştirilmiş olduğu bir alan tanımlanmıştır:

Bu örnekte, #org komutu ile bellek adresi 0x7000 olarak atanmıştır ve dw komutu ile değişkenin değeri 0x1234 olarak bellekte yerleştirilmiştir. Bu komut ile veri bellekte word olarak yerleştirilir.

Not: Bu örnek sadece anlatım amaçlı verilmiştir ve gerçek bir programda assembly kodlarının kullanılması genellikle C ve C++ programlarında pek tercih edilmez. Assembly kodlarının kullanılması genellikle sistem seviyesinde veya düşük seviyede yazılan programlar için gereklidir. Bu komutun kullanımı ve özellikleri platform ve derleyicilere göre değişebilir.

#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.

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.

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

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

CCS (Custom Computer Services) assembly programlama dilinde kullanılan önceden tanımlanmış sabitler arasında:

  • DATE: Derleme tarihini içerir.
  • TIME: Derleme saatini içerir.
  • FILE: Dosya adını içerir.
  • LINE: Dosya içerisinde bulunulan satır numarasını içerir.
  • DATE_TIME: Derleme tarih ve saat bilgisini içerir.
  • CCS_VERSION: Kullanılan CCS derleyicinin versiyon numarasını içerir.

Bu sabitler, kullanıcının programının hangi tarihte, hangi saatte, hangi dosya içerisinde derlendiğini, hangi satırda bir hata olduğunu veya hangi CCS versiyonu kullanıldığını görmesine olanak tanır. Bu sabitler, programların okunaklılığını arttırmak için kullanılabilir.

Not etmek gerekir ki bu sabitlerin kullanımı ve özellikleri platform ve derleyicilere göre değişebilir.

DATE

DATE CCS (Custom Computer Services) kullanılarak assembly programlarında kullanılabilir. Bu sabit, derleme zamanında otomatik olarak yerine konulur ve derleme tarihini içerir. Örnek olarak, aşağıdaki assembly kodunda DATE sabiti kullanılarak derleme tarihi ekrana yazdırılmıştır:

Bu örnekte, DATE sabiti derleme tarihini içerir ve printf komutu ile ekrana yazdırılır. Not etmek gerekir ki DATE sabiti derleme tarihini içerir ve bu sabitin kullanımı ve özellikleri platform ve derleyicilere göre değişebilir.

Bu örnekte printf komutu kullanılarak DATE sabiti yazdırılmıştır. Ancak alternatif olarak, DATE sabiti ile ilgili işlemler yapılması için memory’de bir yerlere yazılması da mümkündür. Örnek olarak aşağıdaki gibi bir kod yazılabilir.

Bu şekilde DATE sabiti “my_date_variable” adlı memory yerine yazılmış olur ve daha sonra bu değişken ile ilgili işlemler yapılabilir.

TIME

Derlenen dosyanın zamanını verir.

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

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

PCB,PCM,PCH: Programın derleneceği sırada  hangi derleyici modülünün kullanılacağını belirtir

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

Standart C Komutları

#define

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

#undef

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

#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.

#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

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

#warning

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

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.

Dosyadan ID  okutulmak istenirse 

#fuses

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

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_…

Kesme fonksiyonlarının tanımlamalarında kullanılırlar. 

#int_default

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_GLOBAL

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

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. 

#separete

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.

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 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 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.

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.

ö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.

#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.

About the author

admin

Add Comment

Click here to post a comment

Bu site, istenmeyenleri azaltmak için Akismet kullanıyor. Yorum verilerinizin nasıl işlendiği hakkında daha fazla bilgi edinin.