A- CCS C Derleyicisi Ne İşe Yarar?:
CCS C derleyicisi ile PIC mikrodenetleyicilere kod yazılabilir. Yazılan kod programın isminde de belirtildiği gibi C kodudur. Derleyici bu C kodunu alır ve öncelikle bir ASM
(Assembly - Çevirici) koduna çevirir. Çevirici kodu ise ardından .HEX biçiminde
makina diline çevirilir. Bu HEX kodu mikrodenetleyicinin belleğine yüklenir ve
mikrodenetleyici güç uygulandığı zaman bu kodu çalıştırmaya başlar.
B- Örnek Proje:
Örnek olarak belirli bir süre boyunca yanıp sönen bir led kodu yazacağız. Bu ledin yanıp sönme hızı üç farklı düğme ile ayarlanabilir olacak. Seviye 0′ın bir sonraki makalesinde ise bu kodu ISIS yazılımı ile kuracağımız devrede benzeteceğiz.
CCS C ile ilk projenizi oluşturmadan önce eğer C programlama dilini bilmiyorsanız lütfen bir miktar C programlama konusuna bakınız. Aksi takdirde yapılan bazı işlemler size anlamsız gelecektir.
Projemize başlamadan önce girdi ve çıktı kapıları kullanımlarımızı belirlememizde fayda var. A kapısının RA0, RA1 ve RA2 iğnelerini düğmelere, B kapısının RB0 iğnesini ise LED’e bağlayacağız. Bunun için RB0′ı çıktı, RA0-RA1-RA2 kapılarını girdi olarak kullanacağız.
Öncelikle CCS C yazılımımızı başlatalım. Yazılımı başlattığınızda aşağıdakine benzer bir pencere ile karşılaşacaksınız.
Yukarıdaki menüden Project > New > PIC
Wizard‘ı seçip proje dosyalarının konulacağı yer ve projenin adını
belirttikten sonra (Dikkat projenin adında ve projenin adresinde türkçe karakter
ne yazık ki bulunmamalı ve mümkünse C:\, D:\ gibi ana klasörlerde
bulunmalıdır, yoksa hatalar ile karşılaşabilirsiniz. Ben proje dosyalarını
D:\scozturk_dosyalar adresine projenin adı seviye0a olacak şekilde
ayarladım.) aşağıdaki pencere ile karşılaşıyoruz.
Device olarak PIC 16F877,
osilatör olarak 4Mhz’den hızlı olacak şekilde High speed Osc (> 4mhz)
seçiyoruz ve penceredeki ayarları yukarıdaki ekran görüntüsündeki gibi
yapıyoruz. Ardından bu pencerenin altındaki Communications sekmesine
giriyoruz.
PIC’in RS-232 ve I2C
özelliklerini kullanmayacağımızdan bu özellikleri kapatıyoruz. SPI and LCD
sekmesinde de aynı şekilde bu iki özelliği (SPI, LCD)
kullanmayacağımızdan kapatıyoruz. Timers sekmesinde ise ayarları otomatik
ayarlarında bırakmak bu aşamada uygun olacaktır. Üst seviyelerdeki makalelerde
şu an es geçtiğimiz bu özellikler kullanılacaktır. PCD Timers sekmesini
de olduğu gibi bırakıp Analog sekmesine girelim.
Analog-Sayısal çeviri özelliğini
kullanmayacağımızdan Analog kesmesinde ADC Off seçeneğini
seçiyoruz. Geriye kalan sekmelerde herhangi bir değişiklik yapmamıza şimdilik
gerek yok. OK düğmesine basıp bir sonraki ekrana geçebiliriz. Otomatik
olarak seviye0a.c kaynak dosyamız açılacak ve içine yukarıdaki pencerelerde
seçtiğimiz ayarlar girilecektir. Ayarların hepsi seviye0a.c dosyasında
main() fonksiyonunun içinde değil. Bazı ayarlar da seviye0a.h
dosyasının içinde bulunmaktadır.
Bu aşamada otomatik olarak girilen ayar
kodlarını ayar() adlı bir fonksiyona yazmakta fayda var. Bu şekilde kodun
işlevli bölümü daha açık seçik görülecektir. Bu işlemi yaparsak kodu şu şekilde
değiştirmemiz gerekecektir.
Kodda gerekli değişiklikleri yukarıdaki
gibi yaptıktan sonra herşeyin düzgün olduğundan emin olmak için kodumuzu
derleyelim. Kodumuzu derlemek için yukarıdaki ekran görüntüsünde kırmızı çember
ile belirtilmiş simgeye, yukarıdaki menüden Compile > Compile’a veya F9 tuşuna
basabiliriz. Eğer bir sorun yok ise devam edebiliriz. Bir sorun var ise hata CCS
C ekranından size bildirilecektir.
Artık kodumuzun “işlevli” kısmını yazmaya
başlayabiliriz. Yukarıda girdi olarak RA0, RA1 ve RA2 iğnelerini kullanacağımızı
belirtmiştir. RA0 iğnesine bağlı olan düğme (Düğme 1) basılı olduğunda led
saniyede bir kez yanıp sönsün. RA1 iğnesine bağlı olan düğme (Düğme 2) basılı
konumda olduğunda ise led iki saniyede yanıp sönsün ve RA2 iğnesine bağlı olan
düğmeye (Düğme 3) basıldığında beş saniyede yanıp sönsün. Herhangi bir düğme
basılı değilse sürekli yanık dursun. A kapısında altı tane iğne bulunduğundan A
kapısını 6 bitlik bir değişken gibi düşünebiliriz (en sağdaki bit RA0′ı temsil
eder). Yani bizim A kapısında tanımladığımız dört tane farklı durum var:
000000 (0) : Herhangi bir tuşa basılmadı.
000001 (1) : Düğme 1′e basıldı
000010 (2) : Düğme 2′ye basıldı
000100 (4) : Düğme 3′e basıldı
LED’in RB0 iğsine bağlı olduğunu
hatırlayalım.
Artık kodumuzu rahatlıkla yazabiliriz.
Akış çizgesine bakacak olursak öncelikle bir şekilde A kapısından veri almamız
gerekiyor. Bunu yapmak için standart C dilinde olmayan ve CCS C‘ye özgü
olan input_a() fonksiyonunu kullanacağız. Bu fonksiyon çıktı olarak A
kapısındaki veriyi vermektedir. Akış çizgesine dikkat edecek olursak kodumuz
sonsuz bir döngü içindedir. Bu sonsuz döngüyü sağlamak amacıyla sonsuz bir for
döngüsü kullanacağız. Aşağıdaki kod bahsettiğimiz işlemleri yapmaktadır.
Şimdi ise LED yakma ve söndürme kodlarını
ilgili yerlere yazmamız gerekiyor. B kapısından çıktı vermemiz gerekiyor. Bunun
için yine CCS C’nin bir fonksiyonu var. output_b() fonksiyonunu kullanarak B
kapısına istediğimiz veriyi yazabiliriz. B kapısında 8 tane iğne olduğundan B
kapısı 8 bitlik bir değişken gibi düşünülebilir. output_b() fonksiyonuna argüman
olarak sekiz bitlik bir veri girmemiz gerekiyor. Gecikmeleri gerçekleştirmek
için ise delay_ms() komutunu kullanacağız. Bu komut argüman olarak ms cinsinden
gecikme değerini almaktadır. Kodumuza eklemeleri yaparsak:
Kodumuzu tamamladık. Kodumuzu derleyebiliriz.
Kodumuzu derledikten sonra proje klasörümüzün içinde .asm ve .hex uzantılı
dosyaları oluşturulduğunu göreceksiniz. .hex dosyasını 16F877
mikrodenetleyicisine yükleyip kodu deneyebiliriz.
C- Kod ve Proje Dosyaları (CCS C):
