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:
- Mevcut işlemi durdurur ve mevcut CPU durumunu kaydeder.
- Belirlenen kesme fonksiyonunu (ISR - Interrupt Service Routine) çalıştırır.
- Kesme işlemi tamamlandıktan sonra kaydedilen CPU durumunu geri yükler.
- 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
Yorum Gönder