Arduino: Timer1’in zamanlayıcı olarak kullanılması (Using Timer1 as a timer)

Günümüzün popüler gömülü sistemlerinden Arduino ile Timer1’i kullanarak zamanlayıcı yapmayı öğreneceğiz. Zamanlayıcı; sistem frekansını kullanarak yapılan Timer uygulamasıdır. Bu uygulamada Arduino kütüphaneleri kullanılmadan Atmega328p mikrodenetleyicisinin Timer ayarları ile zamanlayıcı yapılacaktır.

Uygulamada 1 sn aralıklarla kit üzerindeki led yanıp sönecektir.

Aşağıda Atmega328p MCU ait sayıcı/zamanlayıcı blok diyagramı görülmektedir. Diyagramı incelediğimizde sistemin çalışmasını ve kurulmasını kolaylıkla anlayabiliriz. Blok diyagramı açıklamaya çalışalım;

Biz zamanlayıcı yapacağımıza göre “Tn”girişini kullanmayacağız. Dolayısı ile “Edge Detector” bloğu da kullanılmayacak. TCCRB1 registerinin CS10, CS11, CS12 bitleri ile sistem frekansını böleceğiz. “Control Logic” bloğunda OCR1A registerinin içeriğindeki 16 bit sayı ile TCNT1 registerinin içeriğinin eşit olma durumunda oluşturacağı “TIMER1_COMPA_vect” kesmesi veya “TIMER1_OVF_vect” (taşma kesmesi)  ile istenilen kontrol sağlanır. Veya kesme bayrakları ile durum kontrol edilebilir.

16bit registerlere doğrudan erişebiliyoruz. H Byte+L byte olarak almamız gerekmiyor.

İstenilen frekans veya peryotun hesabı ile uğraşmadan internet üzerinden hesaplamaları doğrudan alabiliyorsunuz. Örnek olarak aşağıdaki linkteki sayfa üzerinden hesaplama yaptırabilirsiniz. (anahtar kelimeler: atmega328p timer calculator)

http://www.arduinoslovakia.eu/application/timer-calculator

Zamanlayıcı Uygulama Kodları


#define ledPin 13 // LED 13 nolu pine bağlı

void setupTimer1() {

noInterrupts();  // Kesmeler devre dışı

// Clear registers

TCCR1A = 0;

TCCR1B = 0;

TCNT1 = 0;

OCR1A = 15624;      // 1 Hz (16000000/((15624+1)*1024))

TCCR1B |= (1 << WGM12);   // CTC (Timer on Compare –Timer karşılaştırma Modu) OCR1A ile karşılaştırılır

TCCR1B |= (1 << CS12) | (1 << CS10);  // Prescaler 1024

TIMSK1 |= (1 << OCIE1A);  // Output Compare Match A Interrupt Enable

interrupts(); // Kesmelere izin veriliyor

}

ISR(TIMER1_COMPA_vect) { //Karşılaştırma kesmesi (TCNT1==OCR1A)

digitalWrite(ledPin, digitalRead(ledPin) ^ 1); //LED’in durumunu değiştir. Yanıyorsa söndür, sönükse yak

}

void setup() {

pinMode(ledPin, OUTPUT);  // ledPin çıkış olarak tanımlandı

setupTimer1();

}

void loop() {

}

Kesme kullanmadan yapılan zamanlayıcı


#define ledPin 13

void setup() {

pinMode(ledPin, OUTPUT);

TCCR1A =0;

TCCR1B =0;

TCCR1B = (1<<CS10) | (1<<CS12); // prescaler 1024

OCR1A = 15624;      //1 saniye

TCNT1 = 0; // Timer1 sayacını sıfırla

}

void loop() {     //Eğer Timer1 Karşılaştırma Bayrağı ile kontrol

while((TIFR1 & (1<<OCF1A)) == 0);// Timer1 karşılaştırma bayrağı set(High) olana kadar bekle

digitalWrite(ledPin, digitalRead(ledPin) ^ 1); // ledi konum değiştir

TCNT1 = 0; // Timer1 sayacını sıfırla

TIFR1 |= (1<<OCF1A) ; //Timer1 karşılaştırma bayrağını sil ki daha sonra tekrar oluşabilsin

}

Kaynaklar:

http://www.arduinoslovakia.eu/application/timer-calculator

https://elektrokod.wordpress.com/2013/10/18/timer0-zamanlama-uygulamasi/

Yorum bırakın