Arduino'da kesmeler (interrupts), işlemcinin o an yaptığı işi anında durdurup çok daha öncelikli bir görevi yerine getirmesini sağlayan mekanizmalardır. Normal akışta (loop içerisinde) bir butona basılıp basılmadığını kontrol etmek için sürekli "digitalRead" yapmanız gerekir (polling). Ancak kesmeler sayesinde, olay gerçekleştiği anda işlemci haberdar edilir.
Normal kod akışı (main loop) bir nevi günlük rutin işler gibidir. Kesme ise aniden çalan bir telefon gibidir; yaptığınız işi bırakır, telefona cevap verir (ISR - Interrupt Service Routine) ve telefon kapandıktan sonra kaldığınız yerden devam edersiniz.
Her Arduino pininde kesme özelliği bulunmaz. En yaygın modellerde kesme pinleri şunlardır:
Arduino Uno / Nano / Mini: Pin 2 ve Pin 3.
Arduino Mega 2560: Pin 2, 3, 18, 19, 20, 21.
Bir kesmeyi tanımlamak için şu üç parametreyi kullanırız:
attachInterrupt(digitalPinToInterrupt(pin), ISR, mode);
digitalPinToInterrupt(pin): Kullanılan fiziksel pini kesme numarasına çevirir.
ISR (Interrupt Service Routine): Kesme tetiklendiğinde çalışacak fonksiyonun adıdır.
Mode (Mod): Kesmenin ne zaman tetikleneceğini belirler:
LOW: Pin düşük voltajdayken sürekli tetiklenir.
CHANGE: Pindeki voltaj değiştiğinde (yüksekten düşüğe veya tam tersi).
RISING: Voltaj düşükten yükseğe çıktığında (Yükselen kenar).
FALLING: Voltaj yüksekten düşüğe indiğinde (Düşen kenar).
Kesmeleri kullanırken dikkat edilmesi gereken üç altın kural vardır:
Kısa Tutun: ISR fonksiyonu olabildiğince hızlı bitmelidir. İçerisinde delay() çalışmaz, Serial.print() kullanılması önerilmez.
Volatile Değişkenler: Eğer ISR içerisinde bir değişkenin değerini değiştirip ana loop içerisinde kullanacaksanız, o değişkeni volatile olarak tanımlamalısınız.
Örnek: volatile int sayac = 0;
Zamanlayıcılar: millis() fonksiyonu ISR içinde artmaz, ancak en son değerini okuyabilirsiniz.
İçeriğe ekleyebileceğiniz basit ve etkili bir örnek:
volatile int butonSayaci = 0;
const byte kesmePini = 2;
void setup() {
Serial.begin(9600);
pinMode(kesmePini, INPUT_PULLUP);
// 2 numaralı pinde düşen kenar (butona basılma) kesmesi tanımlıyoruz
attachInterrupt(digitalPinToInterrupt(kesmePini), sayacArtir, FALLING);
}
void loop() {
// Ana döngü başka işler yaparken bile kesme arka planda sayacı artırır
Serial.print("Butona basılma sayısı: ");
Serial.println(butonSayaci);
delay(1000);
}
// Kesme servis rutini (Hızlı ve kısa)
void sayacArtir() {
butonSayaci++;
}

Henüz yorum yapılmamış. İlk yorumu siz yapın!