Arduino'da kesme (interrupt) kullanımı

👤 Yazar: ozcan 📅 Tarih: 13.05.2026 10:39 👁️ Görüntüleme: 10

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.

1. Kesme (Interrupt) Nedir?

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.

2. Donanım Kesmeleri (External Interrupts)

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.

3. attachInterrupt() Fonksiyonu

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).

4. Kritik Kurallar (İçerikte Mutlaka Belirtilmeli)

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.

5. Örnek Kod Taslağı

İç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++;
}
Bu yapı, özellikle döner enkoder (rotary encoder) okuma, hız ölçümü (takometre) veya acil durdurma butonları gibi hassas zamanlama gerektiren projeler için temel teşkil eder.

Devre tasarımı:

arduino kesme örneği

💬 Yorumlar

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

Bir Yorum Bırakın

Güvenlik Kontrolü:

Yenidir.com
Sayfa Başı
Yenidir CMS V0.1