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.

Option Register(Kaydedicisi)
OPTION Kaydedicisi

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)

Frekans Bolme Sayisi
Frekans Bölme Oranları
Timer0 Blok Diyagramı
Timer0 Blok Diyagramı

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.

  1. Senkron zamanlayıcı
  2. Senkron sayıcı
  3. Asenkron sayıcı

Timer1 sayıcı/zamanlayıcı özelliklerini T1CON kaydedicisi kontrol eder.

T1CON Kaydedicisi
T1CON Kaydedicisi

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ı
 Timer1 Blok Diyagram
Timer1 Blok Diyagramı

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 kapat
T1_INTERNAL= Timer1’in clock sinyalinin denetleyici frenkası olacaktır
T1_EXTERNAL= Timer1 harici sinyal kaynağıyla senkronize olacaktır
T1_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ı 1
T1_DIV_BY_2   bölme oranı 2
T1_DIV_BY_4   bölme oranı 4
T1_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

vKomut Frekansı Hesaplaması Örneği
Komut Periyodu Hesabı ÖrneğiKesme Oluşma Süresi Örneği

Timer0  ve Timer1 örnek uygulamalarına buradan ulaşabilirsiniz.

Timer2  ve Watchdog Timer birimlerinin anlatımına buradan ulaşabilirsiniz.