PIC Programlama Dersleri 11: Kesmeler (Interrupts) – PIC16F628A
Bu derste, PIC mikrodenetleyicilerde kesme (interrupt) mantığını öğreneceğiz. Kesmeler, mikrodenetleyicinin normal program akışını geçici olarak durdurup önemli bir olaya yanıt vermesini sağlar. Kesme işlemi tamamlandığında program kaldığı yerden devam eder.
Örneğin bir butona basıldığında, zamanlayıcı taşması gerçekleştiğinde veya belirli bir donanım olayı oluştuğunda kesme kullanılabilir.
Bu derste PIC16F628A ve MikroC PRO for PIC üzerinden temel bir zamanlayıcı kesmesi örneği hazırlayacağız.
1. Kesme Nedir?
Normal bir program, komutları sırayla çalıştırır. Bir olayın gerçekleşip gerçekleşmediğini sürekli kontrol etmek gerekebilir. Bu yönteme sorgulama (polling) denir.
Kesme yönteminde ise bir olay gerçekleştiğinde donanım mikrodenetleyiciyi uyarır. İşlemci geçerli program akışını geçici olarak durdurur ve kesme servis rutinini çalıştırır.
Kesme işlemi tamamlandıktan sonra ana program kaldığı yerden devam eder.
Kesme kullanımının avantajları:
- Önemli olaylara hızlı yanıt verilebilir.
- Zamanlayıcılarla düzenli aralıklarla işlem yapılabilir.
- Ana programın sürekli aynı girişleri kontrol etme ihtiyacı azalabilir.
- Birden fazla işlemin daha verimli biçimde yönetilmesine yardımcı olur.
2. PIC16F628A'da Kesme Kaynakları
PIC16F628A'nın kesme kaynakları arasında şunlar bulunur:
| Kesme kaynağı | Görevi |
|---|---|
| TMR0 | 8 bitlik zamanlayıcı/sayıcı taşması |
| RB0/INT | RB0 pinindeki harici kesme olayı |
| PORTB değişim kesmesi | RB4–RB7 girişlerinin durum değişiklikleri |
| TMR1 | 16 bitlik zamanlayıcı/sayıcı taşması |
| TMR2 | Zamanlayıcı taşması ve ilgili çevre birimi olayları |
Kesme kaynağına göre ilgili etkinleştirme bitleri ve bayraklar ayarlanmalıdır. Ayrıca genel kesme izni de açılmalıdır.
3. Kesme Kullanımının Temel Mantığı
PIC16F628A'da kesme mekanizmasını kullanırken genellikle şu adımlar uygulanır:
- Kullanılacak kesme kaynağı seçilir.
- İlgili kesme bayrağı temizlenir.
- Kaynağın kesme izni açılır.
- Genel kesme izni etkinleştirilir.
- Kesme oluştuğunda kesme servis rutini çalışır.
- Kesme bayrağı gerektiğinde temizlenir.
4. Uygulama: TMR0 Kesmesiyle LED Durumunu Değiştirme
Bu örnekte TMR0 zamanlayıcısının taşması gerçekleştiğinde RB0 LED'inin durumu değiştirilecektir.
Gerekli malzemeler
- PIC16F628A mikrodenetleyici
- RB0 çıkışına bağlanacak LED
- LED için uygun seri direnç
- Deney kartı ve bağlantı kabloları
MikroC PRO for PIC kodu
Kod:
unsigned char sayac = 0;
void interrupt() {
if (INTCON.T0IF == 1) {
INTCON.T0IF = 0; // TMR0 kesme bayrağını temizle
TMR0 = 100; // TMR0 başlangıç değerini yükle
sayac++;
if (sayac >= 20) {
PORTB.F0 = !PORTB.F0;
sayac = 0;
}
}
}
void main() {
CMCON = 0x07;
TRISB = 0x00;
PORTB = 0x00;
OPTION_REG = 0b00000111;
TMR0 = 100;
INTCON.T0IF = 0; // Taşma bayrağını temizle
INTCON.T0IE = 1; // TMR0 kesmesini etkinleştir
INTCON.GIE = 1; // Genel kesme iznini aç
while (1) {
// Ana program başka işler yapabilir.
}
}
5. Kodun Açıklaması
TMR0 kesme bayrağı:
INTCON.T0IF, TMR0 taşma bayrağıdır. Taşma gerçekleştiğinde donanım tarafından 1 yapılır. Kesme servis rutininde bayrak temizlenir.
TMR0 kesme izni:
INTCON.T0IE = 1 komutu TMR0 kesmesini etkinleştirir.
Genel kesme izni:
INTCON.GIE = 1 komutu genel kesme iznini açar.
Ön bölücü ayarı:
Bu örnekte OPTION_REG = 0b00000111 ayarı, TMR0 için 1:256 ön bölücü oranını seçer. Dahili komut saatinin kullanıldığı varsayılmıştır.
Sayaç:
Her TMR0 kesmesinde sayac değişkeni artırılır. Sayaç 20 olduğunda RB0 çıkışının durumu tersine çevrilir.
6. Kesme Süresi Nasıl Hesaplanır?
TMR0 dahili saat kaynağıyla çalışırken zamanlayıcı artış aralığı, komut çevrimi süresine ve ön bölücüye bağlıdır.
PIC16F628A'da komut çevrimi süresi genel olarak şu şekilde hesaplanır:
Kod:
Komut çevrimi süresi = 4 / Fosc
Örneğin 4 MHz osilatörde komut çevrimi süresi 1 µs olur. TMR0 için 1:256 ön bölücü seçildiğinde her TMR0 artışı yaklaşık 256 µs sürer.
TMR0 başlangıç değeri 100 olarak yüklenirse taşmaya kadar 156 artış gerekir. Yeniden yükleme ve kesmeye giriş süresi de dikkate alındığında kesme aralığı yaklaşık olarak hesaplanabilir.
Gerçek süre; osilatör frekansı, ön bölücü ayarı ve programın kesme rutinindeki işlemlere bağlıdır.
7. Kesme Kullanırken Dikkat Edilecekler
- Kesme servis rutinini mümkün olduğunca kısa tutun.
- Kesme bayraklarının doğru yönetildiğinden emin olun.
- Kesme içinde uzun gecikmeler (Delay_ms) kullanmaktan kaçının.
- Kesme ile ana programın ortak kullandığı değişkenleri dikkatli yönetin.
- Zamanlama hassassa osilatör frekansını ve zamanlayıcı ayarlarını doğru belirleyin.
- TMR0 kesmesi kullanılırken ilgili bayrağın temizlenmesi gerektiğini unutmayın.
8. Alıştırmalar
- Örnekteki sayac >= 20 koşulunu 10 olarak değiştirin. LED'in durum değiştirme sıklığının nasıl etkilendiğini gözlemleyin.
- TMR0 başlangıç değerini değiştirerek kesme aralığının nasıl değiştiğini inceleyin.
- RB0 yerine başka bir PORTB çıkışını kullanmayı deneyin.
- Ana programın while (1) döngüsüne kesme dışında yürütülebilecek basit bir işlem ekleyin.
Sonuç
Bu derste kesmelerin temel çalışma mantığını, PIC16F628A'daki bazı kesme kaynaklarını ve TMR0 kesmesini etkinleştirmeyi öğrendik. Kesme yöntemi, zamanlama ve donanım olaylarına yanıt verme gerektiren projelerde önemli bir araçtır.
Bir sonraki derste PIC16F628A ile TMR0 zamanlayıcısını kullanarak gecikme ve zamanlama hesaplamalarını daha ayrıntılı inceleyeceğiz.