Mikrodenetleyicilerde Kesme Yönetimi

 

Kesme (Interrupt) Yönetimi

Kesme (Interrupt), mikrodenetleyicinin belirli bir olay meydana geldiğinde ana program akışını geçici olarak durdurup özel bir işlemi gerçekleştirmesini sağlayan mekanizmadır. Bu mekanizma, hızlı tepki verilmesi gereken işlemlerde büyük avantaj sağlar.

Bu bölümde kesmelerin nasıl çalıştığını, türlerini ve nasıl kullanıldığını detaylıca ele alacağız.


1. Kesmenin Temel Çalışma Prensibi

Bir kesme meydana geldiğinde, mikrodenetleyici aşağıdaki işlemleri sırasıyla gerçekleştirir:

  1. Mevcut işlemi durdurur ve mevcut CPU durumunu kaydeder.
  2. Belirlenen kesme fonksiyonunu (ISR - Interrupt Service Routine) çalıştırır.
  3. Kesme işlemi tamamlandıktan sonra kaydedilen CPU durumunu geri yükler.
  4. Ana programın kaldığı yerden çalışmasına devam eder.

📌 Örnek Senaryo:
Bir butona basıldığında mikrodenetleyicinin bir LED’i yakması ve buton bırakıldığında LED’i söndürmesi için kesme kullanılabilir.


2. Kesme Türleri

Mikrodenetleyicilerde kullanılan kesmeler donanım kesmeleri ve yazılım kesmeleri olmak üzere ikiye ayrılır:

a) Donanım Kesmesi (Hardware Interrupt)

  • Harici veya dahili donanım bileşenlerinden gelen sinyaller tarafından tetiklenir.
  • Örnek: Butona basılınca, ADC tamamlandığında veya bir zamanlayıcı dolduğunda tetiklenen kesmeler.

📌 Örnek Donanım Kesmesi Kullanımı:

void buttonISR() {  
    digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));  // LED’in durumunu değiştir
}

void setup() {  
    pinMode(2, INPUT_PULLUP);  // Buton pini
    pinMode(LED_BUILTIN, OUTPUT);
    attachInterrupt(digitalPinToInterrupt(2), buttonISR, FALLING);  
}

void loop() {  
    // Ana program burada çalışmaya devam eder
}

🚨 "attachInterrupt()" fonksiyonu, belirlenen pini izler ve butona basıldığında (FALLING kenarında) "buttonISR" fonksiyonunu çalıştırır.


b) Yazılım Kesmesi (Software Interrupt)

  • Yazılım tarafından oluşturulan kesmelerdir.
  • Genellikle zamanlama (timer) veya işlem önceliği değiştirme işlemleri için kullanılır.

📌 Örnek: Timer Kesmesi ile belirli aralıklarla LED yakma

ISR(TIMER1_COMPA_vect) {  
    digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));  // LED'in durumunu değiştir
}

void setup() {  
    pinMode(LED_BUILTIN, OUTPUT);
    noInterrupts();  // Kesme işlemlerini durdur  
    TCCR1A = 0;  
    TCCR1B = (1 << WGM12) | (1 << CS12) | (1 << CS10);  // CTC Modu, Prescaler: 1024  
    OCR1A = 15624;  // 1 saniyelik zaman aşımı  
    TIMSK1 = (1 << OCIE1A);  // Kesme etkinleştir  
    interrupts();  // Kesme işlemlerini tekrar başlat  
}

void loop() {  
    // Ana program burada çalışmaya devam eder
}

🚨 Burada TIMER1 kullanılarak her 1 saniyede bir LED’in yanıp sönmesi sağlanır.


3. Kesme Kaynakları

Mikrodenetleyicilerde kullanılan yaygın kesme kaynakları şunlardır:

a) Harici Kesme (External Interrupts)

  • Harici bir sinyal (örneğin bir butona basılması) tarafından tetiklenir.
  • "attachInterrupt()" fonksiyonu ile kullanılır.

📌 Örnek:

attachInterrupt(digitalPinToInterrupt(2), ISR_Function, RISING);
  • LOW: Düşük seviyede tetiklenir.
  • CHANGE: Durum değiştiğinde tetiklenir.
  • RISING: Düşükten (0) yüksek seviyeye (1) geçerken tetiklenir.
  • FALLING: Yüksekten (1) düşük seviyeye (0) geçerken tetiklenir.

b) Timer Kesmesi (Timer Interrupts)

  • Zamanlayıcılar belirli bir süre sonunda kesme tetikler.
  • Örneğin, 1 saniyede bir işlem yapmak için kullanılabilir.

📌 Örnek: 500 ms’de bir LED yakma

ISR(TIMER0_COMPA_vect) {  
    digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));  
}

void setup() {  
    pinMode(LED_BUILTIN, OUTPUT);  
    cli();  // Tüm kesmeleri kapat  
    TCCR0A = (1 << WGM01);  // CTC modu  
    TCCR0B = (1 << CS02) | (1 << CS00);  // 1024 prescaler  
    OCR0A = 77;  // 500ms gecikme  
    TIMSK0 = (1 << OCIE0A);  // Timer kesmeyi aktif et  
    sei();  // Kesme işlemlerini başlat  
}

🚨 Burada TIMER0 kullanılarak her 500 ms’de bir LED yakılıp söndürülmektedir.


c) ADC Kesmesi (ADC Interrupts)

  • Analogdan dijitale çevirme işlemi tamamlandığında tetiklenir.
  • ADC tamamlandığında veri okumak için kullanılır.

📌 Örnek:

ISR(ADC_vect) {  
    int sensorValue = ADC;  // ADC değerini oku  
}

🚨 Bu sayede ADC işlemi tamamlandığında işlemci hemen veri okuyabilir.


4. Kesme Önceliği ve Çakışmaları Yönetme

Bazı mikrodenetleyicilerde birden fazla kesme aynı anda oluşabilir. Bu durumda kesme önceliği belirlenmelidir.

  • Donanım seviyesinde bazı kesmeler diğerlerinden daha öncelikli olabilir.
  • Kesme içinde başka bir kesmenin çalışmasını engellemek için "noInterrupts()" kullanılabilir.

📌 Örnek:

noInterrupts();  // Tüm kesmeleri devre dışı bırak
// Kesme içinde kritik kodları çalıştır
interrupts();  // Kesme işlemlerini tekrar aktif et

🚨 Kesme çakışmalarını önlemek için gereksiz kesmeleri devre dışı bırakmalısınız!


5. Kesme Kullanımında Dikkat Edilmesi Gerekenler

Kesme fonksiyonları mümkün olduğunca kısa ve hızlı olmalıdır.
Kesme içinde delay() kullanmayın! (Çünkü kesme içinde zaman kaybına yol açar.)
Kesme fonksiyonunda sadece değişken güncelleyip, ana döngüde (loop) gerekli işlemi yapmalısınız.
Kesmeler asla ana programı engellememelidir.


Sonuç

  • Kesme mekanizması, mikrodenetleyicinin olaylara hızlı tepki vermesini sağlar.
  • Harici kesmeler, zamanlayıcı kesmeleri ve ADC kesmeleri gibi farklı türleri vardır.
  • Kesme öncelikleri iyi yönetilmeli ve çakışmalar önlenmelidir.
  • Kesme fonksiyonları mümkün olduğunca kısa ve verimli yazılmalıdır.

📌 Kesme kullanımı özellikle düşük güç tüketimi, gerçek zamanlı işlem gereksinimleri ve hızlı tepki gerektiren sistemler için hayati öneme sahiptir! 🚀

Yorumlar

Sitedeki popüler yayınlar:

Kullanım Alanlarına Göre Farklı Linux Dağıtımları 3

Kullanım Alanlarına Göre Farklı Linux Dağıtımları

Kullanım Alanlarına Göre Farklı Linux Dagıtımları 2