
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.







By ayhan on Eki 25, 2008 | Reply
eline sağlık kardeş,çok güzel uygulamalar ledi 16f690 ile denedim çalışıyor.