CCS C ile Temel Giriş Çıkış İşlemleri

ledflashh

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 yapacağı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,NOLVP //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 “16f628a.h”
#fuses XT,NOWDT,NOPROTECT,PUT,NOLVP
#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, delay_ms,output_high gibi komutlarda compiler içerisinde veya sürücülerde (driver) ö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();
}}

gc1

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;
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örevi 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;
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)
#define DELAY_COUNTER_VALUE 10000

#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ünerek de aşağı sayıcı yapıldı. Burada çarpma işlemi yerine sağa ve sola kaydırma işlemi de yapılabilir.

#include "16f628a.h"
#fuses XT,NOWDT,NOPROTECT,PUT,NOLVP
#use delay (clock=4000000)
void main(void)
{
int i,cont;

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); }

gc2

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

#include <16f628a.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);}
Bu yazı CCS C Örnekleri kategorisine gönderilmiş ve , , ile etiketlenmiş. Kalıcı bağlantıyı yer imlerinize ekleyin.