24 Eylül 2014 Çarşamba

CCS de timer uygulaması

Merhabalar arkadaşlar.Sizlere çok da fazla detaya girmeden elimden geldiğince timer işlemi nedir, ne işe yarar ve bunu elektronik yazılımda nasıl kullandığımızı kendimce açıklamaya çalışacağım. Benim ilgi alanım elektronik yazılım olduğu için ben bunu pic üzerinde örneklemeye çalışacağım.
         Öncelikle timer ne işe yarar? Timerı açıklayan en güzel örnek bana göre  bisiklet sürmek. Bizler nasıl bisiklet sürmeyi öğrendiğimiz zaman bunu düşünmüyoruz ve beynimizi yormuyoruz.İşte bizde işlemciye timerı tanımladığımız zaman artık bunu ne zaman istersek fonksiyonlarımızda çağırıp işlemi yaptırıyoruz. İşlemci bu iş için kendisini yormuyor ve en önemlisi o sırada yaptığımız başka bir işlemi etkilemiyor.Böylece bizde ana fonksiyonumuzda ne yaparsak yapalım timer döngümüz kendi işine bakmaya devam ediyor. Şimdi basitçe PIC16F887' de yapılmış basit bir timer koduna bakalım. Kodda da görüleceği gibi ana fonksiyonda yani esas yapmak istediğimiz olayın öncesinde timeri tanımlayıp daha sonra bu fonksiyonu çağırıyoruz.
         Açıklamalar satırların yanlarında yazmaktadır o yüzden tekrar buraya açıklama yapma ihtiyacı duymadım. Yanlışım veya eksik olduğum, merak ettiğiniz başka şeyleri yorum kısmında söyleyebilirsiniz. Elimden geldiğince yardımcı olmaya çalışacağım. İyi çalışmalar hepinize.

#include <16f887.h> // programlayacağımız picin kodunu giriyoruz.

#fuses XT,NOMCLR  //MCLR pininin kullanılmayacağını ve

#use delay(clock=10000000)  //kullandığımız osilatörün frekansını belirliyoruz.

int16 i=0;   //(-32768) ile (32767) arasında değer alabilen bir i tam sayısı tnımlıyoruz.

#use fast_io(b)//b portu için yönlendirmeler yapılıyor

#int_timer0  // TIMER0 kesmesi

void timer0()//Kesme fonksiyonu giriliyor
  {
    i++;//i değeri fonksiyona her girdiğinde 1 artırılıyor.
   if(i==10) //i değeri 10 a eşitse b0 portu lojik-1 yapılıyor.
  {
   output_high(pin_b0);
  }
   if(i==20)// i değeri 20 ye eşitse b0 portu lojik-0 yapılır ve i tekrar 0 a eşitlenir.
 
  {
   output_low(pin_b0);
  i=0;
  }
}
/************ANA PROGRAM FONKSİYON **************/
void main()
{
setup_timer_0(RTCC_INTERNAL |RTCC_DIV_4 );//timer_0 ayarları yapılıyor.
SET_TIMER0(131); //timer_0 değer belirleniyor
enable_interrupts(INT_TIMER0); //int_timer0 kesmesini aktif ediyoruz
enable_interrupts(GLOBAL); //aktif olan kesmelere izin veriyoruz.

set_tris_b(0x00); // D portu komple çıkış

output_b(0x00); // D portu çıkışı ilk anda sıfırlanıyor

while(TRUE)  //burada while döngüsüne true yazarak devamlı bu döngüye girmesini sağlıyoruz.
  {
output_high(pin_d6);  //d6 portu lojik-1
delay_ms(1000);       //delay komutu ile 1000 mili saniye bekletiyoruz
output_low(pin_d6);   //d6 portu lojik-0
delay_ms(1000);       //delay komutu ile 1000 mili saniye bekletiyoruz
  }
}