1 Star2 Stars3 Stars4 Stars5 Stars (3 votes, average: 5 out of 5)
Loading ... Loading ...
Tem
16th

CCS C Dersleri - 1 Temel Giriş Çıkış İşlemleri

ledflashh.gif

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

gc1.JPG

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

gc2.gif

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.

Benzer Yazılar


11 Yorum “CCS C Dersleri - 1 Temel GiriÅŸ Çıkış İşlemleri”

  1. ayhan Eki 25, 2008

    eline sağlık kardeş,çok güzel uygulamalar ledi 16f690 ile denedim çalışıyor.

  2. selim dumlu Kas 12, 2008

    Selam
    Arkadaşlar pic e seriport üzerinden max232 ve f628 ile veri göndermek istiyorum başaramadım İnternetteki yegane örnek ( c ile yazılmış tris_b hatası veriyor)yardım eden olursa sevinirim.Teşekkürler

    Kod şöyle
    //klavyeden girilen tuş değeri portb ye bağlı ledlerde görülür

    #include

    #fuses XT,NOWDT,NOPROTECT

    #use delay(clock=4000000)

    #use rs232(baud=9600, xmit=PIN_A1, rcv=PIN_A2)

    #byte port_b = 6 //portb nin ramdeki yeri

    main() {

    int data;

    set_tris_b(0×00); //portb çıkış

    printf(”calisiyor…\n\r”);

    while (TRUE)
    {

    data = getch();
    port_b = data; //gönderilen sayıyı portb de göster
    delay_ms(1000);

    }//sürekli tekrarla
    }

  3. selim dumlu Kas 13, 2008

    Selam ikinci örnekte tanımlanan fonksiyonların adları türkçe tanımlanmış ingilizce kullanılmış
    void sag(void);
    void sol(void);
    right();
    left();
    Sizler için malum olabilir ama acemiler için yanıltıcı çalışmayan bir kod:)

  4. admin Kas 22, 2008

    seri iletişim için yazılımsal rs232 yerine bu iş için ayrılmış RX ve TX pinlerini kullanmanız işinizi kolaylaştırır
    aşağıdaki sayfadan da faydalanabilirsin

  5. Alper Oca 7, 2009

    merhaba arkadaslar.
    ” void alt_prog1(){
    output_high(PIN_A1);
    while(input(PIN_B2)){
    output_high(PIN_B0);}
    output_low(PIN_B0);} ”
    bu alt programda output_high(PIN_A1) komutu while dongusune girince ben komut vermedigim halde PIN_A1 low oluyor. Bu konuda bana yardimci olursaniz sevinirim…Simdiden tesekkurler…

    programı gerçeke kurulmuş devre üzerinde mi denediniz? proteusta mı denediniz? Proteusta her zaman gerçek hali gibi çalışmayabilir

  6. Alper Oca 15, 2009

    Proteusta denedim. bi de oyle deneyeyim cok saolasin.

  7. hakan48 Ara 3, 2009

    analog haberleşmeye nasıl ulaşabilirim arkadşlar

  8. fatih54 Åžub 10, 2010

    arkadaşlar en baştaki 16f628a ile yapıl örneği derlerken bir sayfa çıkıyor ve rs232 ile ilgili bir uyarı çıkıyor acemiyim yardımcı olursanız sevinirim 16f877 örneklerinde sorun yaşamıyorum

    sorun:

    #include

    #FUSES NOWDT //No Watch Dog Timer
    #FUSES RC //Resistor/Capacitor Osc with CLKOUT
    #FUSES NOPUT //No Power Up Timer
    #FUSES NOPROTECT //Code not protected from reading
    #FUSES BROWNOUT //Reset when brownout detected
    #FUSES MCLR //Master Clear pin enabled
    #FUSES LVP //Low Voltage Programming on B3(PIC16) or B5(PIC18)
    #FUSES NOCPD //No EE protection

    #use delay(clock=40000000)
    #use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)

  9. admin Åžub 10, 2010

    16f628a’da c portu bulunmamaktadır

  10. fatih54 Åžub 10, 2010

    benim c poru ile bir işim olmuyor buradaki kodu aynenyazıyorum c portu neden çıkıyor?

    #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ü
    }

  11. admin Åžub 10, 2010

    dostum bak ilk mesajındaki header dosyana dikkat et

    #use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)

    satırında pin c6 ve pin c7 var eğer bu dosya derlemeye giriyorsa hata verir.
    ikinci olarak basit bir örnek dene tekrar

    #include <16f648a.h>
    #fuses XT,NOWDT,NOPROTECT,PUT,NOLVP
    #use delay (clock=4000000)
    void main(){
    for(;;){
    output_low(PIN_B0); //led off
    delay_ms(500);
    output_high(PIN_B0); //led on
    delay_ms(500);
    }
    }

Yorum yapın