You are on page 1of 7

CCS C ile pic programlamak istiyorsanız öncelikle firmanın hazırladığı “CCS C compiler

reference manual” pdf dosyasını indirip incelemeniz gerekir. Programla ilgili olup olabilecek
tüm bilgiler bu kılavuzda zaten mevcuttur. Daha ötesi tamamen sizin istek ve azminize bakar
çünkü programcılıkta tarih coğrafya gibi anlatılacak çok fazla bir şey yoktur. Öğrenmenin en
iyi yolu kendi işinize yarayacak basit programlardan başlayıp, geliştirerek ilerlemektir.
Burada yapazağımız bazı ara birimlerle ilgili örnekler vermek olacaktır. Ötesini siz kendi
projeleriniz için kendiniz geliştirmelisiniz.

İlk vereceğimiz örnek portlardan giriş çıkış işlemlerini uygulamak olacaktır yukarıdaki
devrede ledi yakıp söndüren program aşağıdadır.

#include "16f628a.h" //Mikrodenetleyici seçilir


#fuses XT,NOWDT,NOPROTECT,PUT //Sigortalar seçilir
#use delay (clock=4000000) //Osilatör hızı belirlenir
#use fast_io(b) //Bu satır ile port B için elle ayarlama yapılacağı
belirtilir
//Yukarıdaki satır ile alttaki set-tris satırı aslında çok gerekli değildir
//Çünkü siz bir pinden çıkış ya da giriş yapmak istediğinizde compiler
//ilgili tris registerlerini otomatik olarak ayarlar. Bu satırların tek
faydası
//daha fazla hız kazanmaktır

void main(void)
{
set_tris_b(0xFE); //PortB için giriş çıkış pinleri belirlenir
disable_interrupts(GLOBAL); //Kesmeler iptal edilir
do{
output_low(PIN_B0); //led off
delay_ms(500);
output_high(PIN_B0); //led on
delay_ms(500);
}while(TRUE); //Sonsuz Döngü
}

Burada ccs c ile yazılmış en basit program verilmiştir. Yukarıdaki satırlardan da görüleceği
üzere sırasıyla mikrodenetleyici tanıtılmış, sigortalar seçilmiş ve osilatör frekansı
belirlenmiştir. Bu ilk üç satır ccs c ile yazılan her programda yer alır. Daha sonra da sizin ne
yapmak istediğiniz mikrodenetleyicinin anlayacağı şekilde programa dökülür. Led yakıp
söndürmek basit bir işlem olarak gözükse de bu iş için bile onlarca çeşit yol gösterilebilir.
Şimdi aşağıdaki örneklere bakarak bunları inceleyelim.

Aşağıdaki örnekte for döngüleri yerine ledleri sırasıyla yakıp söndüren yürüyen ışık programı
yer almaktadır. Sağa ve sola yürüme işlemleri fonksiyon olarak tanımlanmış ve ana
programdaki sonsuz döngüde bu fonksiyonlar çağırılmakta

#include “16f648a.h”
#fuses XT,NOWDT,NOPROTECT,PUT
#use delay (clock=4000000)
#use standard_io(A)
//Fonksiyon tanımlamaları
void sag(void);
void sol(void);
//Ana Program
void main(void)
{
set_tris_a(0xF0);
disable_interrupts(GLOBAL);

do{
right();
left();
}while(TRUE);// sonsuz döngü
}

void right(void)
{
output_high(PIN_A0);
delay_ms(300);
output_low(PIN_A0);
output_high(PIN_A1);
delay_ms(300);
output_low(PIN_A1);
output_high(PIN_A2);
delay_ms(300);
output_low(PIN_A2);
output_high(PIN_A3);
delay_ms(300);
}

void left(void)
{
output_low(PIN_A3);
output_high(PIN_A2);
delay_ms(300);
output_low(PIN_A2);
output_high(PIN_A1);
delay_ms(300);
output_low(PIN_A1);
}

Aşağıdaki örnekte ise fonksiyonla flash yapmanın daha basit versiyonu yer almakta. C
programlama dilinde yapılan bütün işlemler fonksiyonlarla yapılmaktadır. Hazır olarak
kullandığımız printf, delya_ms,outut_high gibi komutlarda compiler içerisinde veya
driverlarda önceden tanımlanmış fonksiyonlardır.
#include "16F877.h"
#fuses HS,NOWDT,NOPROTECT,NOLVP
#define LED_BLINKER PIN_A0 //ledin bağlı olduğu pin belirlenir
// Fonksiyon Prototipleri
void xDelay(void);
void LedBlinker(void);

void xDelay(void) {
delay_ms(1000);
}

void LedBlinker(void) {
output_bit(LED_BLINKER,1);
xDelay();
output_bit(LED_BLINKER,0);
xDelay();
}
//Ana fonksiyon
void main(void) {
while(TRUE) {
LedBlinker();
}
}

Aşağıdaki örnek ise yukarıdaki program ile aynı işe yapmakta burada output_bit komutu
yerine output_high/low komutları kullanıldı.

#include "16F877.h"
#fuses HS,NOWDT,NOPROTECT,NOLVP
#define LED_BLINKER PIN_A0

void LedOnOff(void);
void LedOnOff(void) {

output_high(LED); // Turns the LED On


delay_ms(1000); // Delay 1000 milliseconds
output_low(LED); // Turns the LED off
delay_ms(1000);
}
void main(void){

while(TRUE) {
LedOnOff();
}}
Aşağıdaki basit uygulamada ise D portundaki giriş bilgileri okunarak B portundaki led
dizisinde aynen gösterilir

#include "16F877.h"
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=4000000)

void main(void)
{
byte x=0;
set_tris_d(0xff);
set_tris_b(0x00);

while(1)
{
x=input_d();
output_b(x);
}}

Aşağıdaki uygulamada ise B1 pininde flash yapan ledin yanık ve sönük kalma süre delay_ms
komutu yerine sayıcı ile yapılmış. Burada sayıcı değişkenine bir değer atanarak sürekli
azaltılmakta sıfıra eşit olduğunda ise ledin durumu output_toggle komutu ile durumunu
değiştirmekte. Bu komut pinin durumunu lojik olarak tersleyici görev görür.

#include <16F877.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=4000000)
//Sayıcı değeri atanıyor
#define DELAY_COUNTER_VALUE 10000

void main(void)
{
unsigned long m_delay_counter=DELAY_COUNTER_VALUE;
int1 x=0;
set_tris_d(0xff);
set_tris_b(0×00);
output_b(0);

while(1)
{
x=input(PIN_D5);
output_bit(PIN_B5,x);

m_delay_counter–;
// Sayıcı sürekli azaltılır
if (m_delay_counter==0)
{
m_delay_counter=DELAY_COUNTER_VALUE;
output_toggle(PIN_B1);
}}}

Aşağıda yer alan program ise yukarıda şeması verilen proteus şemasınd çalışmakta. Bu
programda B0 pininde yer alan led sürekli yanıp sönmekte. B5 pininde yer alan led ise
dipswitch in D5 pinine denk gelen anahtar ile kontrol edilmekte. Yanık kalma süresi ise gene
sayıcı ile ayarlandı.

#include <16F877.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=4000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
#define DELAY_COUNTER_VALUE 10000
#define PORTB 0×06
#define PORTD 0×08

#byte DipSwitch=PORTD
#byte LedsBar=PORTB
#bit Switch5=PORTD.5
#bit Led5=PORTB.5
#bit Toggle_Led= PORTB.0

void main(void)
{
unsigned long m_delay_counter=DELAY_COUNTER_VALUE;
int1 x=0;
set_tris_d(0xff);
set_tris_b(0×00);
LedsBar=0;
while(1)
{
x=Switch5; //RD5 pinideki değer okunur
Led5=x; //RB5 pininde yer alan ledte gösterilir

m_delay_counter–;
if (m_delay_counter==0)
{
m_delay_counter=DELAY_COUNTER_VALUE;
Toggle_Led=~Toggle_Led; //Toggle pin RB0
}}}

Aşağıdaki örnekte B portunda yer alan ledlerle yürüyen ışık uygulaması sayıcı ve for
döngüleri ile yapıldı. Burada cont değişkenine ilk olarak 1 değeri atanır. Daha sonra bu değer
sürekli 2 ile çarpılarak yukarı sayıcı 2 ile bölünerekte aşağı sayıcı yapıldı. Burada çarpma
işlemi yerine sağa ve sola kaydırma işlemi de yapılabilir

#include "16f648a.h"
#fuses XT,NOWDT,NOPROTECT,PUT,NOLVP
#use delay (clock=4000000)

#use standard_io(B)

void main(void)
{
int i,cont;
set_tris_b(0x00);
disable_interrupts(GLOBAL);
do{

cont=1;
for(i=1;i<8;i++){
output_b(cont);
delay_ms(120);
cont=cont*2;
}

for(i=1;i<8;i++){
output_b(cont);
delay_ms(120);
cont=cont/2;
}

}while(TRUE); }

Aşağıda ise, yukarıda örneği verilen bir diğer led ışık animasyonu yer almakta.

#include <16f648a.h>
#fuses XT,NOWDT,NOPROTECT,PUT,NOLVP
#use delay (clock=4000000)
#use standard_io(B)

void main(void)
{
signed char i; //değişken indisi
//Led durumları matrise atanır
int leds[4]={0b10000001,0b01000010,0b00100100,0b00011000};

set_tris_b(0×00);
disable_interrupts(GLOBAL);

do{
for(i=0;i<4;i++){ //ledler içten dışa
output_b(leds[i]);
delay_ms(100);
}
for(i=3;i>-1;i–){ //ledler dıştan içe
output_b(leds[i]);
delay_ms(100);
}

}while(TRUE);}

Gelecek konuda ccs c ile yedi segment display kullanımı ve uygulamaları gösterilecektir.

Devamı: http://ccspic.com/ccs-c-dersleri/ccs-c-dersleri-1-temel-giris-cikis-
islemleri.html#ixzz0c7dA5qt4
Under Creative Commons License: Attribution

You might also like