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