YAZARLIK BAŞVURUSUBize Katılmak istermisiniz?

Arduino ile Timer Kullanımı

 

Merhabalar..

  Bu konuda Arduino ile timer kullanımına değineceğiz. Bu konu ile ilgili pek fazla türkçe kaynak bulunmamakta. Var olanların çoğu da bir kütüphane yardımı ile anlatılmış. Biz ise timer registerler’ i üzerinden işlem yapacağoz. İlk öncelikle timer neden önemli ona bir bakalım.

  Arduino’ da nesne tabanlı programlama işlemlerinde olduğu gibi ‘thread’ mantığı ile paralel işlem yapma şansınız yoktur. Bunun yerine size arduino’ nun donanımsal olarak size verdiği timer’ ları kullanmanız gerekir. Bu timer’ ların sayısı kullandığınız Arduino çeşidine göre değişiklik göstermektedir. Örneğin Uno’ da 2 tane varken Mega’ da bu sayı 5′ e kadar çıkmaktadır. Peki ya bu paralel işlemden kastımız ne olabilir?

  Örneğin bir led’ in bizim programımızdan bağımsız bir şekilde 1 sn’ süre ile yanıp sönmesini isteyelim. Bunun için Arduino’ yu her sn başında ‘delay’ fonsiyonu ile bekletmek pek de işe yaramayacaktır. Bu nokta devreye timer’ lar girecek. Arduino donanımın bize verdiği timer’ ın her 1 sn’ de bir kesme oluşturmasını ve kesmenin’ de ilgili fonksiyonu çağırması sağlanır. Böylece program gereksiz bekleme yada sorgu işlemleri yapmamış olur.

  Timer’ lar counter register denen bir register’ e sahiptir.  Bu register’ ın görevi timer’ ın sayacı olarak çalıştırılmasıdır. Timer her adımda maksimum değere ulaşıncaya sayacı arttırır. Sayaç maksimum değere ulaştığında sıfırlanır ve interrupts tetiklendiğinde çağrılan fonksiyon ISR(Interrupt Service Rutin) çalıştırılır.

  Örneğin 8 bitlik Timer0 sayacını kullanıyor olalım. Bu sayaç 00000000 ‘den başlayıp 11111111 oluncaya kadar sayacaktır. Ve sayma işlemi bittiğinde ISR(TIMER0_COMPA_vect) isimli fonksiyonu çağıracaktır. Ancak bu sayma işleminin hızı için elbet bazı ayarlar gerekecektir.

  Timer’ ın çalışması için osilatör’ de bir prescalar ayarı denilen bir ayar bulunmaktadır. Bu ayar bizim kristalimizin çalışma frekansında düşürmek için kullanılır. Arduino osilatörü 16Mhz’ de çalışır. Biz 64 prescaler ile kullanmak istersek 16*10^6 / 64 yani 250Kz anlamına gelir. Şimdi prescaler ayarına gelelim

  Interreupt’ un tetiklenme süresi Hz cinsinden prescalar ile çarpım olarak denkleme eklenmelidir. Sonuç olarak denklemimiz bu şekilde çıkacaktır:

 Adsız  Burada prescaler oranı 2′ nin kuvveti şeklinde belirlenir. Bu değer 1 ile 1024 arasında değişebilir. Bu oranın kullanılmasının sebebi timer’ ın taşma noktasıdır. Sayaç en üst noktaya ulaştığında taşma biti setlenecektir ve interrupt ın çağırdığı fonksiyon devreye girecektir. Prescaler de bu taşma noktasını temsil eden sayıyı timer0 ve timer3 için 16 bit, timer2 ikin 8 bitlik ifadede saklanmasını sağlamamıza yarar.

Ancak prescalar oranını denklemde yerine yazmak yeterli değildir. İstediğimiz oran timer’ın ilgili registerlerine yazılmalıdır. Bu noktada tabloadan yardım alabiliriz.

Bu ifadenin genel kullanımı şu şekildedir: 

Ayarlama işleminin can alıcı kısmı burada bitiyor. Burdan sonra registerlerin sıfırlanma işlemine değineceğiz.

Timer’ ları kurmaya başlamadan önce tüm interrupt ları durdurmak gerekir. Bu işlemi basit bir fonksiyon ile gerçekleştirmek mümkün.

Şimdi tüm kullanacağımız timer’ ın registerlerini sıfırlayalım.

Daha sonra prescaler ve  ve CTC(Clear Timer on Compare) modu için ayarlanır.

Bu işlemleri kullanacağımız her timer için yapmamız gerekir. “OCRxA” komutunda bulunan değer üstte bahsettiğimiz formülden elde edilen değerdir. Burada girdiğimiz frekans değeri ve prescaler oranına göre timer kesme oluşturur.

En sonda interrupt’ ları tekrar aktif etmek gerekir. Bunun için de bu fonksyon kullanılır.

Timer taşma noktasına oluştığunda yapacağımız işlemleri bu fonksiyon içersinde belirleriz. Ancak normal bir interrupt içerisinde çalışmayan fonksiyonlar burada da çalışmayacaktır. Örnek olarak delay yada Serial.available verilebilir.

Bununla ilgili basit bir uygulama örneği verelim. Uygulamamızda 2 led’ den bir tanesi 1 sn aralıklara diğeri ise 2 sn aralıklara yanıp sönsün:

Aşağıdaki örnek Arduino Mega için yazılmıştır. Timer 3 içermeyen Arduino modellerinde çalışmayacaktır.

 

Timer ve millis uygulamaları ile ilgili konuya buradan geçebilirsiniz. 

Teşekkürler..

33 Comments

Add a Comment

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir