ATMEL PROGRAMLAMA 19 - TIMER \ COUNTER (ZAMANLAYICI \ SAYICI)


    Mikrodenetleyicilerin Timer\Counter (Zamanlayıcı\Sayıcı) donanım birimleri zamanlama ve sayma işlemleri için kullanılırlar. Zamanlayıcılar (timers) temelde basit sayıcıdırlar . Sayarak zaman ayarı yaparlar. Örneğin frekansı 1Hz olan bir clock tarafından tetiklenen bir sayıcı 0'dan başlayıp 59'a kadar (60 sayma ) sayarsa 60 sn'lik bir zaman elde etmiş oluruz. 

      Zamanlama işlemlerini program akışı içersinde _delay_ms() fonksiyonu ile de yapabilirsiniz.  Ancak _delay_ms() fonksiyonunda belirttiğimiz süre kadar program hiçbir işlem yapmadan bekler. Halbu ki Timer\Counter donanım birimi programdan bağımsız olarak arka planda çalışır.  Bu sayede program çalışmasına ek yük eklememiş oluruz. Zamanlama yapılacak süre içinde mikrodenetleyici başka işlmeleri de yapabilir. 





Timer\Counter0, Timer\Counter1 ve Timer\Counter2 olmak üzere  üç adet  Timer\Counter birimi vardır. Timer\Counter birimi 8 bit ve 16 bit olmak üzere iki tiptir. 8 bit - 16 bit ifadeleri donanım biriminin çözünürlüğünü belirtir. Bu birimlerin sayıları mikrodenetleyici modellerinde farklılık gösterebilir. Genel olarak Atmel Mega serisi iki adet  8 bit ve bir adet   16 bit'lik Timer\Counter birimine sahiptir. 
 
TCNTx kaydedicisi sayıcının sayma değerini tutan kaydedicidir.Output Compare Registers OCR0A ve OCR0B (Output Compare Registers) kaydedicileri karşılaştırma modunda gerekli sayısal değerleri tutan kaydedicilerdir.
Timer\Counter birimleri  esnek yapıları  sayesinde  farklı amaçlar için kullanılabilmektedirler.  Timer\Counter biriminin TIMSK kaydedicisi içersindeki durum bayrakları  hangi amaçlar için kullanılabileceğini belirtmektedir. 
    
    Örneğin Timer\Counter 0 donanımbiriminin TIMSK0 kaydedicisi içeriği aşağıdaki gibidir.

  Diğer Timer\Counter1 ve Timer\Counter2 birimlerinin TIMSK (TIMSK1 VE TIMSK2) kaydedicileri de benzer içeriğe sahiptirler.

   Yukarıdaki şekilden de anlaşılabileceği gibi her  Timer\Counter birimi üç farklı şekilde (OCIE0B, OCIE0A ve TOIE0 ) kullanılabilir.

  1. Tımer Overflow (Zamanlayıcı Taşması ) En başta zamanlayıcının aslında bir sayıcı olduğunu belirtmiştik. Sayıcı için bir   maximum değer belirlenir  ve sayıcı bu maximum değere kadar sayar. Maximum değere ulaşınca sayıcı Timer\Counter donanım birimi tarafından otomatik olarak sıfırlanır.  Sayıcının maximum değere ulaşması ve akabinde 0 (sıfır)' a dönmesi olayına Timer Overflow (Zamanlayıcı Taşması) adı verilir. Burada maximum değer Timer\Conter biriminin çözünürlüğü ile alakalıdır ve formülü 

        

       şeklindedir.  (Res : çözünürlük 8 veya 16 olacak)

   Sayıcı Maximum değerden 0 (sıfır)'a döndüğü anda Interrupt Flag Register (TIFR) içersindeki  Timer Overflow Flag (TOVx)  otomatik olarak kurulur.

2. Compare Match (Karşılaştırmalı Eşleme ):  Output Compare Register (OCRx) 'a 0 (sıfır) ile  Maximum değer arasında bir değer atanır.  Her timer saykılında atanan bu değer ile saycının o anki değeri karşılaştırılır. Değerler birbirine eşit ise TIFR kaydedicisi içersindeki  Output Compare Flag (OCFx) kurulur ve sayıcı içeriği sıfırlanır.
 
   Bu işlemle ilgili çıkış pinleri OCRx kaydedicisindeki değer ile sayıcı değeri aynı olduğu durumlarda  1-0 veya toggle olacak şekilde otomatik olarak düzenlenir. Bu sayede farklı frekanslarda kare dalgalar elde edilebilir. 

 3. Input Capture (Giriş yakalama) :   AVR mikrodenetleyicilerde bu işlem ile ilgili giriş pininde herhangi bir sinyal değişimi (Lojik seviye ) olduğu anda sayıcı değeri okunur ve Input Capture Register (ICRx)'a kaydedilir. aynı anda TIFR kaydedicisi içersindeki   Input Capture Flag (ICFx) kurulur. Bu sayede giriş pinine gelen harici  pulse sinyallerinin 1 ve 0 süreleri ölçülebilir.


Yukarıda belirttiğimiz her üç durumun fark edilmesi ve bunlarla ilgili işlemlerin yapılması üç şekilde olur.
    
      1-  Durum ve kesme bayrakları ana program içinde düzenli olarak kontrol edilir ve bayraklardan hangisi kurulu tespit edilirse onunla ilgili kodlar yürütülür.
      
      2- Ana programa ara verilir ve ISR (Interrupt Service Routine) yürütülür.
     
      3- İlgili çıkış pinlerinin lojik seviyeleri otomatik olarak değişir..


1. Bayrakların kontrolü  :   Timer\Counter donanım birimi ana programdan bağımsız olarak çalışır. TIMSK kaydedicisi içersinde ifade edilen bayraklarla ilgili durumlar oluştuğu zaman bu bayraklar otomatik olarak kurulur (1 yapılır.). Programcı yazacağı ana program içersinde devamlı olarak bu  bayrakların durumlarını kontrol eder ve kurulu bayrak varsa bununla ilgili işlemler yürütülür. Eğer düzgün bir döngü oluşturulabilirse tepki süresi diğerlerine göre daha hızlı olur.  Ancak program içersinde bu işlemler için kod yazılacağından program kodu artar.  

2- ISR (Interrupt Service Routine) : TIMSK kaydedicisi içersinde ifade edilen bayraklarla ilgili durumlar oluştuğu zaman kesme meydana gelir ve mikrodnetleyici otomatik olarak ilgili ISR fonksiyonunu yürütür.  Birinci işleme göre avantajı ana programda kod eklenmemesi işlemlerin arka planda yürütülüyor olmasıdır. sadece programa ISR fonksiyonu eklenir.

3. Otomatik tepki : Timer\Counter 1 ve Timer\Counter 2 donanım birimleri bu özelliği destekler. Compare Match işleminde Output Compare Register (OCRx) içeriği ile sayıcı içeriği eşleştiğinde ilgili çıkış pinlerinin lojik seviyeleri otomatik olarak değişir. 1. ve 2. işleme göre avantajı bunula ilgili herhengi bir kod yazma işleminin yapılmamasıdır. 


Timer\Counter Clock Sinyali  

Timer\Counter donanım birimi sayarak zaman ayarı yapar. Örneğin frekansı 1Hz olan bir saat sinyali (clock pulse) tarafından tetiklenen bir sayıcı 0'dan başlayıp 59'a kadar sayarsa (60 sayma ) 60 sn'lik bir zaman elde etmiş oluruz. 

Bu saat sinyali mikrodenetleyici içersindeki osilatörden alınabileceği gibi harici bir pinden de temin edilebilir. Osilatörden gelen sistem saat sinyali direkt kullanılabileceği gibi prescaler(ön derecelendirici ) tarafından çeşitli frekanslara bölünerek de kullanılabilir. 

Timer\Counter Clock birimi  bir prescaler ve bir multiplexer'dan oluşmaktadır.

  
Şekilde Pckx sistem saat sinyalini ifade etmektedir. sistem sinyali direkt kullanılabileceği gibi prescaler tarafından çeşitli frekanslara bölünerek de kullanılabilir. Yukarıdaki şekilde de görüldüğü gibi 10bit Timer\Counter Prescaler birimi kullanılmaktadır.  Prescaler sistem saat sinyal frekansını  8'e,32'ye,64'e,128'e,256'ya ve 1024(10bit)'e böler ve multiplexer'a   gönderir. Bunlardan 32'ye ve 128'e bölme sadece Timer\Counter 2 birimi tarafından kullanılabilir.

multiplexer  kendisine gelen farklı frekanslardaki  saat sinyallerinden birini CSx0,CSx1 ve CSx2 bitlerinin değerine göre çıkışa verir. multiplexer çıkışındaki ( Tckx ) sinyal Timer\Counter birimimizin saat sinyalidir.

Yukarıdaki şekilde de görüleceği gibi  harici saat sinyali ile de    Timer\Counter birimimiz çalışabilir.  Harici sinyalin düşen kenarı ile mi yoksa yükselen kenarı ile mi tetikleme yapılacağı CSx0,CSx1 ve CSx2 bitlerinin değerine göre multiplexer tarafından düzenlenir.




















Sistem Saat Sinyali ile Senkronize Tetikleme

Prescaler ksmında giriş sinyali olarak sistem saat sinyali kullanılır. Prescaler girişteki bu sinyali çeşitli frekanlara böler ve multiplexera gönderir. Sistem saat sinyali prescaler kısmına uğramadan direkt olarak da multiplexer'a verilebilir. Multiplexer çıkışındaki sinyal  Timer\Counter saat sinyali olur. Bu şekilde  Timer\Counter saat sinyali sistem saat sinyali ile senkronize olmuş olur. Her üç Timer\Counter birimi sistem saat sinyali ile senkronize çalışabilir. Bu şekilde harici bir devreye ihtiyaç duymadan saat sinyali elde edilmiş olur.

Timer\Counter   biriminin bu şekilde çalışması hassas zamanlama istenilen durumlar için uygun değildir.  Hassas zamanlama istendiği durumlarda harici saat sinyali kullanmak durumundayız. 



Harici Kaynaktan Senkronize  Tetikleme

Timer\Counter 0 ve Timer\Counter 1 birimleri bu özelliğ destekler. Harici senkronize saat sinyali Timer\Counter 0 için T0 pinine ,Timer\Counter 1 için T1 pinine uygulanır. CPU bu pinin duruunu sürekli olarak kontrol eder , eğer harici saat sinyali algılanırsa Timer\Counter birimine harici sinyal ile senkronize saat sinyali sağlar. Dahili CPU saat sinyalinin her yükselen kenarında pindeki harici sinyalin örneği alınır. CPU pindeki değişimi algılamak için en az iki saykıla ihtiyaç duyar. bu nedenle harici sinyalin maximum frekans değeri  CPU saat sinyalinin yarısı kadar olmalıdır. T0\T1 pininin hem düşen kenarı hemde yükselen kenarı tetikleme için kullanılabilir. Hangisinin olacağı  CSx0,CSx1 ve CSx2 bitlerinin değerine göre  düzenlenir.



Harici Kaynaktan Asenkron Tetikleme

Sadece Timer\Counter 2 birimi harici kaynaktan tetiklenebilir. TOSC1 ve TOSC2 pinine bir rezanatör veya kristal bağlanarak Timer\Counter 2 birimine saat sinyali sağlanabilir. örneğin 32.768 kHz'lik bir saat kristali bağlayarak hassas bir zamanlayıcı yapılabilir.

Harici saat sinyali 0 Hz .. 256 kHz aralığında olmalı  ve  maximum sistem saat frekansının 1/4'ü kadar olabilir.

Timer\Counter Biriminin Durdurulması

CSx0=0,CSx1=0 ve CSx2=0 yapıılırssa Timer\Counter birimi durdurulaur.




Timer\Counter Biriminin Çalışma Modları

Timer\Counter birimleri sayma ve zamanlama dışında farklı modlarda çalıştırılabilirler.

Aşağıdaki tablo çalışma modlarını göstermektedir.  Çalışma modlarını WGM02 (TCCR0B kaydedicisinde), WGM01 ve WGM00 (TCCR0A kaydedicisinde) bitlerinin değerleri belirler.

Default olarak normal mode seçilidir.

 




Yukarıdaki tablodan da görüleceği gibi Timer\Counter birimleri aynı zamanda PWM (Pulse Width Modulation) sinyallerinin üretilemsi için de kullanılmaktadırlar.


PWM  - Pulse  Width  Modulation

Timer\Counter birimleri PWM sinyalinin üretilmesi için de kullanılırlar. Bu birimler yukarı\aşağı sayıcı olarak çalışırlar.

Sayıcı yukarıya doğru sayar maximu  değere gelince geriye saymaya başlar sıfıra gelince ileri doğru saymaya başlar ve böyle sürer gider. Bu Timer\Counter biriminin alışılmış sayıcı moduna ters bir durumdur. Çünkü normalde sayıcı maximum değere ulaşınca  geri dönmez sıfırlanır.

PWM ile ilgili detaylar ve uygulamalar ilerleyen konularda detaylı olarak anlatılacaktır.




Yorumlar