Anasayfa » Arduino – Kesmeler – Zaman Kesme – Aynı Anda iki işlem – Robotik Kodlama Dersleri – 75 –

Arduino – Kesmeler – Zaman Kesme – Aynı Anda iki işlem – Robotik Kodlama Dersleri – 75 –

zaman_kesmesi_75

Arduino – Kesmeler – Zaman Kesme – Aynı Anda iki işlem  hakkında bilgilere yer vereceğiz.

Arduino ile çalışırken algoritma içinde sırası gelen işlemler yukarıdan aşağıya satır satır çalışmaktadır. Bizim belirleyeceğimiz şartlara ve koşullara göre tüm kod blokları çalışır yada atlanır. Algoritma içinde bazı durumlarda delay, for gibi algoritmayı bekleten yada oyalayan döngüler kullanılmaktadır. Bu esnada arduino bazı sensörleri okumaz ve veri akışı gerçekleşmez. Çok hassas anlık durumlarda ikinci bir şartı da sorgulamak yada çalıştırmak isteyebiliriz.

Örnek vermek gerekirse; “Evde müzik dinliyorsunuz ve postacı posta kutusuna bir mektup bıraktı. Siz müzik dinlerken postacının gelip gelmediğini beklemiyordunuz sadece kendinizi müziğin ritmine verdiğinizi varsayalım. Postacının geldiği gördünüz mektubu bıraktığını da gördünüz ve gidip o mektubu alıp açmanız gerekiyor ve ne yazdığını okumak  istiyorsunuz fakat o anda dinlediğiniz müziği de hala dinlemeye devam etmek istiyorsunuz. Müziği kapatmadan dinlerken  yerinizden kalkıp mektubu posta kutusundan alıp okursunuz ve sonra önemli bir mektup olmadığını görür bir kenarıya bırakırsınız. Bu sırada dinlediğiniz müzik hala çalıyor ve siz onu hala aynı şekilde dinlemeye devam ediyorsunuz.”

Arduino yukarıdaki örnekteki gibi “void loop” içerisinde  her ne yapılıyorsa yapılsın beklenmedik ikinci bir olaya da farkedince tepkiler verebilir ve yürütebilir hem de loop içindeki işine ara vermeden. Arduinonun bu yaptığı işe KESME adı verilmektedir. Kesmeler iki çeşittir. Zaman Kesmesi(Timer Interrupt) ve Dış Kesme(External Interrupt) olarak ikiye ayrılır.

1-Dış kesmeler

2-Zaman kesmesi

Bu yazımızda sizlerle ZAMAN (Timer) KESMELER üzerinde duracağız. DIŞ KESMELER ile ilgili yazımız için tıklayınız.

Zaman kesmesi (timer interrupt), belirli süre aralıklarında belirli görevlerin yapılabilmesi için kullanılır. Örneğin bir LED’in saniyede bir yakıp söndürülmesi gerekmektedir. Bu işlem için loop fonksiyonunun kullanılması yerine, zaman kesmesinin kullanılması Arduino programının rahatlamasını sağlayacaktır. Kullanılan kesme her saniyede bir Arduino’ya haber vererek, LED’in yakılıp söndürülmesini sağlayacaktır.

Zaman kesmelerinin ayarlanabilmesi için bazı program değişkenlerinin ayarlanması gerekir. Bunlardan en önemlisi zaman sayıcısıdır. Bu değişkende tutulan değer, her saat darbesinde bir artar. Taşma değerine ulaştığında sıfırlanır ve Arduino’ya sürenin dolduğunu, kesmenin yapılması gerektiğini bildirir. Bu değişkenin başlangıç değeri ayarlanarak, kesmeler arasındaki geçecek zaman ayarlanabilir.

Farz edelim ki, 8 bitlik zaman sayıcısının ilk değeri 50 olarak belirlendi. Her adımda bu değer bir artırılacaktır. Zaman sayıcısının değeri 255 olduktan bir adım sonra sıfırlanacaktır. Bu noktada zaman kesmesi gerçekleşecektir. Kesme gerçekleştiğinde Arduino otomatik olarak “ISR(TIMERx_COMPA_vect)” fonksiyonunu çalıştıracaktır. Bu fonksiyonun içerisine her kesmede yapılması istenilen görevler yazılır.

Zaman kesmesinin ne kadar sürede bir gerçekleşeceği, her adımın ne kadar sürede gerçekleşeceğiyle de alakalıdır. Bu süre Arduino’nun kristalinin 1, 1/8, 1/64, 1/256 ve 1/1024 oranında olması sağlanabilir. Zaman kesmesinin oluşma süresi aşağıdaki formül ile hesaplanabilir.

 

Zaman kesmesi için örnek devre; Kara şimşek devresi ile sıralı yana 6 adet mavi led ve tek başına yanıp sönen kırmızı led. Bizim belirleyeceğimiz zaman aralığında kırmızı led yanıp sönecektir. Kırmızı led yanıp sönerken aynı anda 6 adet mavi led sıralı şekilde yanıp sönecek ve animasyon yapacaktır.

Timer kesmesi iki farklı şekilde kullanılabilmektedir; Kütüphane olmadan ve Kütüphane ile aşağıda her iki kodları da bulabileceksiniz.

 

timer_kesme

 




//Görsel İşitsel Teknoloji Kanalı
//wwww.teknikerler.com
//Kerim Arı Youtube kanalı Timer-Zaman Kesmesi Kodları - kullanımı örnek Kodları

const int LEDdizisi[] = {4,5,6,7,8,9,10};
int j = 0;

void setup()
{
  Serial.begin(9600);
  
  for(int i=0; i<7 ;i++)    
  { /* For döngüsüyle LEDdizisi elemanlarına ulaşıyoruz */
    pinMode(LEDdizisi[i], OUTPUT); /* LED pinleri çıkış olarak ayarlandı */
  } 
  
  cli();
  /* Ayarlamaların yapılabilmesi için öncelikle kesmeler durduruldu */

  /* Timer1 kesmesi saniyede bir çalışacak şekilde ayarlanacaktır (1 Hz)*/
  TCCR1A = 0;
  TCCR1B = 0;
  TCNT1  = 0;
  OCR1A = 35624;// Bir saniye aralıklar için zaman sayıcısı ayarlandı
  TCCR1B |= (1 << WGM12);//Adımlar arasında geçen süre kristal hızının 1024'e bölümü olarak ayarlandı 
  TCCR1B |= (1 << CS12) | (1 << CS10);
  TIMSK1 |= (1 << OCIE1A);// Timer1 kesmesi aktif hale getirildi 

  sei(); //Timer1 kesmesinin çalışabilmesi için tüm kesmeler aktif hale getirildi

}

/* Arduino otomatik olarak her saniye aşağıdaki fonksiyonu çalıştıracaktır */
  ISR(TIMER1_COMPA_vect){
  digitalWrite(4, !digitalRead(4)); 
  }




void loop()
{
 Serial.println("Arduino burada baska islemler yapabilir");
for(int i=1; i<7; i++){         
    digitalWrite(LEDdizisi[i],LOW);   
       
  }
  digitalWrite(LEDdizisi[j],HIGH); 
  
  j ++;
  if(j > 6)
    j = 1;

delay(100);

 
 
 
}

Yukarıdaki kodların zaman hesaplaması karmaşık geldiyse kütüphaneli algoritma ile de aynı animasyonu ve zaman kesmesini çalıştırabilirsiniz.

TimerOne.h kütüphanesini projenize eklemeden önce daha önce arduino dizinine eklemeniz gerekmektedir. Kütüphanelerin arduino dizinine nasıl ekleneceğini bilmiyorsanız bu yazımıza göz atabilirsiniz.

 




//Görsel İşitsel Teknoloji Kanalı
//wwww.teknikerler.com
//Kerim Arı Youtube kanalı Timer-Zaman Kesmesi Kütüphaneli Kodları - kullanımı örnek Kodları

#include <TimerOne.h>

const int LEDdizisi[] = {4,5,6,7,8,9,10};
int j = 0;


void setup() {
  
for(int i=0; i<7 ;i++)    
  { 
    pinMode(LEDdizisi[i], OUTPUT);
  } 
  
  Timer1.initialize(800000);//mikrosaniye cinsinden. Sizin Kullandığınız donanıma göre zaman belirleyebilirsiniz
  Timer1.attachInterrupt(zaman_kesme);//çalışacak fonksiyon ismi belirlendi
}


void zaman_kesme()
{
  
  digitalWrite(4,!digitalRead(4));//0 ise 1 olsun  ise 0 olsun demek
  
  }


void loop() {


Serial.println("Arduino burada baska islemler yapabilir");
for(int i=1; i<7; i++){         
    digitalWrite(LEDdizisi[i],LOW);   
       
  }
  digitalWrite(LEDdizisi[j],HIGH); 
  
  j ++;
  if(j > 6)
    j = 1;

delay(100);

 


}
Videoyu İzlemek İçin Tıklayınız

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir