Zamanlayıcılar(Timers) ve Saycılar(Counters)
Zamanlayıcılar(Timers) ve Sayıcılar(Counters)
Zamanlayıcı(Timer) ve Sayıcı(Counter)
Zamanlayıcı(timer) ve sayıcı(counter) birimleri hem mikroişlemci hemde mikrodenetleyiciler için neredeyse bulunması zorunlu birimlerdir.Bu birimler çok önceleri harici özel entegreler kullanılırdı.
Zamanlayıcı ve sayıcı donanım biriminlerin yaptığı işlemleri yazılımsal olarak da yapılabilir. Donanımsal olarak yapılan bu işlemler yazılımsal olarak yapıldığında, kesmelerde anlatıldığı gibi yazılımın büyük çoğunluğu işgal edilmiş olur.
Zamanlayıcı ve sayıcı ayrı ifade edilseler de aynı birimlerdir. Aynı birim iki işlemi de gerçekleştire bilir.
Bir birimin zamanlayıcı olarak kullanılması için değer artışının düzenli periyodik olması gerekir.
Bir birimin sayıcı olarak kullanılması için böyle bir duruma gerek yoktur.
Zamanlayıcı ve sayıcı birimlerinin ikisinin kendi içeriklerinin artışı için bir sinyal kaynağına(clock) ihtiyacı vardır. Zamanlayıcı ile sayıcı arasındaki fark olarak; zamanlayıcı, artışını sinyal kaynağı olarak mikrodenetleyicin kristalinden sağlar, denetleyicinin her komut çevriminde artacak şekilde çalışır.
Sayıcı ise sinyal kaynağı olarak harici girişlerden(dışarıdan) gelen sinyalleri kullanır, zamanlayıcının artışı düzenli ve belli bir frekans değerinde olurken, sayıcının artışı düzensiz frekans değerinde olmaktadır.
TIMER0 Birimi
Timer0 zmanlayıcı ve sayıcı olarak kullanılabilen bir donanım birimidir.
- 8 bit zamanlayıcı/sayıcı kullanımı
- Okuma ve Yazma yapabilir.
- 8 bit yazılım ile programlanabilen bölme oranı(prescaler).
- Dahili ve harici(clock) sinyali kaynağı seçme.
- Timer0 değeri FFh’tan 00h’a (0-256) geçişinde taşma kesmesi.
- Harici saat kaynağı sinyal tetikleme kenarı seçimi(edge select)
Timer0’ın kontrolü OPTION kaydedicisi ile sağlanır.

Bit 7 RBPU = PORTB Pull-up yapma biti
Bit 6 INTEDG =RB0/INT pinindeki kesme bitinin aktif olduğu kenarı seçme biti
Bit 5 TOCS = TMR0 sinyal kaynağını seçme biti
Bit 4 TOSE =TMR0 sinyal kaynağı seçme biti
Bit 4 PSA = Frekans bölücü seçme biti
Bit 2,1,0 PS2,PS1,PS0 Frekans bölme sayısı(Prescaler value)


Blok şemada görüleceği üzere Timer0 birimi ister dahili kaynakla ister RA47TOCKI pininden uygulanan uygulanan harici saat sinyalinden beslenebilir. Kaynak seçimine göre çalışma tipi seçilmiş olur(zamanlayıcı veya sayıcı). Seçilen kaynaktan gelen saat sinyali direkt olarak kullanılmaz, bölme oranı(prescaler) ile çarpılarak elde edilen değer sinyal kaynağı olarak kullanılır.
Bölme oranı Hem Timer0 için hemde Watchdog Timer için kullanılır.Bu işlemi belirleyen OPTION kaydedicisin PSA bitidir.
Normalde TMR0 kaydedicisi değeri başlangıçta sıfırdır. Programla data hattından TMR0 kaydedicisine istenen değer yüklenir. Böylece sayma işlemi istenen değerden başlar.
setup_timer_0(mod); Fonksiyonu
Timer0 zamanlayıcı ayarlarını yapmaya yarayan fonksiyondur. Fonksiyonun mod kısmına aşağıdaki tanımlamalardan biri veya biden fazlası gelebilir.
Kesme Aktif Kenar Ayarı Sabitleri:
RTCC_INTERNAL
=Timer0 clock kaynağının denetleyici çalışma frekansı olacağını belirtir.
RTCC_EXT_L_TO_H
=Timer0 clock kaynağının dış çevreden alınacağını ve her yükselen kenarda tetikleme olacağını belirtir.
RTCC_EXT_H_TO_L
=Timer0 clock kaynağının dış çevreden alınacağını ve her düşen kenarda tetikleme olacağını belirtir.
Bölme Oranı (Prescaler) Sabitleri
RTCC_DIV_2, RTCC_DIV_4,
RTCC_DIV_8, RTCC_DIV_16,
RTCC_DIV_32, RTCC_DIV_64,
RTCC_DIV_128, RTCC_DIV_256
son rakamlar bölme oranlarını verir.
setup_timer_0(RTCC_DIV8 | RTCC_EXT_L_To_H);
komutu Timer0’ın harici kaynaktan besleneceği sayıcı olarak kullanılacağı,kaynak sinyali her yükselen kenarda artış olacağı, bölme oranı 8 olduğunu belirtmiştir.
set_timer0(değer) veya set_rtcc(değer) Fonksiyonu
İki fonksiyonda aynı işlemi yapar. Timer0 biriminin saymaya başlama değerini belirlemek için kullanılır. Tüm sayıcılar yukarı yönlü sayar ve max değere ulaşımda sınırlanırlar.
set_timer0(45)
komutu Timer0 biriminin saymaya 45’ten başlayacağını belirtir. 45’ten 255’e(8 bit) kadar sayma işlmini gerçekleştirir ve ardından sıfırlanır.
Timer0 Kesmesi (#INT_TIMER0)
Timer0 bitiminin gerekli ayarları yapıldıktan sonra istenirse taşma kesmesi oluşturabilir.
INTCON kaydedicisi(register)’nin TOIE biti ile bu kesmenin aktif edilip edilmeyeceği belirlenir.
Kesme fonksiyonu içerisinde mutlaka
set_timer0( )
komutu ile programda set edilen değerin tekrar kesme fonksiyonu içerisinde de belirtilmesi gerekir.
Çünkü programa kesme fonksiyonuna gittiği zaman, TIMER0 kaydedicisi içeriği sıfırlanmıştır. Timer0 tekrar başlangıçta belirtilen değerde saymaya başlaması için kesme fonksiyonu içinde tekrar set edilmelidir.
Timer0 Kesme Süresi Hesaplama
Timer0 kesmesinin(Interrupt) oluşma süresi aşağıdaki şekilde hesaplanır.
f komut değeri PIC denetleyiciye bağlanan osilatör frekansının 4’e bölümü ile elde edilir.
TIMER1 Birimi
Timer1 birimi zamanlayıcı ve sayıcı olarak kullanılabilir.
- 16 bit Zamanlayıcı/Sayıcı Kullanımı
- Okuma ve Yazma yapabilir
- Dahili ve harici(clock) sinyali seçme
- Timer1 değeri FFFFh’tan 0000h’a (0-65535) geçişinde taşma kesmesi
Timer1 birimi içinde ik adet 8 bitlik kaydedici bulunur(TMR1H VE TMR2H). Timer1 3 üç modda kullanılabilir.
- Senkron zamanlayıcı
- Senkron sayıcı
- Asenkron sayıcı
Timer1 sayıcı/zamanlayıcı özelliklerini T1CON kaydedicisi kontrol eder.

Bit 7-6 kullanılmayan bitlerdir. Bu bitler “0” olarak okunur.
- Bit 5-4 T1CKPS1-T1CKPS0=Timer1 bölme(presclaser) oranları
- 11=1:8
- 10=1:4
- 01=1:2
- 00=1:1
- Bit 3 T1OSCEN= Timer1 osilatör kontrol biti
- 1:Osilatör açık
- 0:Osilatör kapalı
- Bit 2 T1SYNC= Timer1 dış clock sinyali senkronizasyon kontrol biti
- 1: Harici clock sinyali girişi ile senkronize yok
- 0:Harici clock sinyali girişi ile senkronize
- Bit 1 TMR1CS = Timer1 clock kaynağı seçme biti
- 1: RC0/T1OSO/T1CKI pininden dış clcok sinyali
- 0:Dahili clcok sinyali
- Bit 0 TMR1ON =Timer1 açama-kapama biti
- 1:Açık
- 0:Kapalı

Zamanlayıcı modunda Timer1 her komut çevriminde bir artar.
Sayıcı modunda ise Timer1, RC0/T1OSO/TQCKI pininden gelen saat sinyalinin her yükselen kenarında bir artar.
Timer1 dahili bir sıfırlama kaynağına sahiptir,CCP modülünden gelen sinyal ile sıfırlanabilir.
Timer1 Kesmesi (#INT_TIMER1)
Timer1 istenen değerden saymaya başlar ve 65535 sayısına ulaşınca Timer1 kesmesi(Interrupt) meydana gelir.
Timer1 kesmesine izin verme biti PIE1 kaydecisinin TMR1IE bitidir.
Kesme fonksiyonu içerisinde mutlaka
set_timer1( )
komutu ile programda set edilen değerin tekrar kesme fonksiyonu içerisinde de belirtilmesi gerekir.
Çünkü programa kesme fonksiyonuna gittiği zaman, TIMER1 kaydedicisi içeriği sıfırlanmıştır. Timer0 tekrar başlangıçta belirtilen değerde saymaya başlaması için kesme fonksiyonu içinde tekrar set edilmelidir.
Timer1 Kesmes Süresi Hesaplama
Timer1 kesme süresi hesaplama
setup_timer_1(mod) Fonksiyonu
Timer1 ayarlarını yapmaya yarayan koddur
mod kısmına aşağıdaki sabit tanımlamalardan bir veya birden fazlası araları “|” ifadesi konularak yazılır.
Timer1 Kontrol Sabitleri
T1_DISABLED
= Timer’i kapatT1_INTERNAL
= Timer1’in clock sinyalinin denetleyici frenkası olacaktırT1_EXTERNAL
= Timer1 harici sinyal kaynağıyla senkronize olacaktırT1_CLK_OUT
= Timer1 ösilatörünün kullanılacağını bildirir.
Timer1 Zamanlayıcı Bölme Oranları(Prescaler) Sabitleri
T1_DIV_BY_1
bölme oranı 1T1_DIV_BY_2
bölme oranı 2T1_DIV_BY_4
bölme oranı 4T1_DIV_BY_8
bölme oranı 8
setup_timer_1
(
T1_EXTERNAL|T1_DIV_BY_8
)
Timer1’in dış kaynaktan saat sinyali ile beslenecek ,bölme oranı 8 olacaktır.
set_timer1(değer) Fonksiyonu
Timer1 birimin saymaya başlayacağı değeri belirtmek için kullanılır. Tüm sayıcılar yukarı yönlü sayar ve max değere ulaşınca sıfırlanırlar.
değer kısmına Timer1 saymaya başlama değeri yazılır. Timer1 16 bit olduğundan buraya yazılacak değer 0 ile 65535 arasında olmalıdır.
set_timer1(764)
ifadesi Timer1 saymaya 764’ten başlar.
Timer1 Kesme Süresi Hesaplama Örneği
Aşağıdaki şekilde ayarlanmış Timer1 ,4 Mhz’lik frenkansa sahiptir.
set_timer1
(
630016
)
program içerisinde ve kesme içerisinde kurulmuş,aşağıdaki ayarlar yüklenmiş
setup_timer_1(
T1_INTERNAL | T1_DIV_BY_8
)
hesaplamalar
Timer0 ve Timer1 örnek uygulamalarına buradan ulaşabilirsiniz.
Timer2 ve Watchdog Timer birimlerinin anlatımına buradan ulaşabilirsiniz.
Merhaba
Olumlu düşünceniz için teşekkür ederim.
Güzel bir site çalışmamda yardımcı olduğu için teşekkür ederim.