Bugunkü konumuz kesmeler (interrupts). Mikrodenetleyicilerde kesme konusu çok önemli bir yer tutar. Kesme mantığını ve işleyişini bilmeden gelişmiş programlmar yazmanız mümkün değildir. Yani kesme bilmeyen biri ben mikrodenetleyici biliyorum diye geçinmesin.

Peki kesme nedir? Gerçek hayattan kesmelere bir örnek verelim: Elinize bir roman almış odanızda yatarak okuyorsunuz. Siz kitabınızı okurken birden bire evin telefonu çalıyor. Evde kimse yok ve telefon yanıbaşınızda değil. Ne yapmak lazım? Kitabınızı okumayı bırakıyorsunuz, hatta kitaba nerede kaldığınıza dair bir işaret koyuyorsunuz. Ve gidip telefona bakıyorsunuz. Sonra geri dönüp işaretlediğiniz yerden kitap okumaya devam ediyorsunuz. İşte kesme mantığı kısaca böyledir. Mikroişlemcinin yaptığı işi, belli bir kesme gelmesiyle bırakması ve kesmenin işaret ettiği işi yapıp gerçek işine geri dönmesi.

Peki kesme olmasıydı bu iş nasıl olacaktı. Yani bir yerlerden telefon geleceğini biliyorsunuz ama telefonun zil sesi (kesme işareti) çalışmıyor. Bu durumda mesela her üç dakikada bir kitap okumayı bırakır telefonun başına geçer ve kimse aramış mı diye ahizeyi kaldırırdınız değil mi? Kitab okuma işiniz böylece sekteye uğrardı. Verimli bir okuma olmazdı. İşte biz de bazen öyle programlar olur ki eğer kesme kullanmazsanız eğreti çalışır.

Peki telefona baktığımızda kapı da çalsa yani araya başka kesme girse ne olacak? O zaman bizim telefondaki adama bir dakika kapı çalıyor gidip bakayım deme imkanımız olsa da mikrodenetleyicinin böyle bir imkanı yok. Yani bir kesme çalışırken diğer bir kesme çalışamaz. Bizim, evde kitap okurken genelde iki kesmemiz vardır:Kapı zili ve telefon zili. Ama PIC16F877A entegresine ait tam 14 adet kesme vardır. B

unlardan en önemlileri: Timer0 kesmesi RB0 ucuna gelen harici kesme Timer1 kesmesi Timer2 Kesmesi CCP1 ve CCP2 e ait kesmeler Biz şimdilik zamanlayıcılarla ilgili olan kesmelerle ilginleceğiz. O zaman bir şeyi açıklığa kavuşturmamız gerekiyor: Zamanlayıcı (TIMER) Nedir? Zamanlayıcı dediğimiz 8 ya da 16 bitlik bir register’den başka bir şey değildir.

Bunlar PIC’in içindeki osilator frekansıyla çalışırlar ve belli bir sürede +1 artarak devam ederler. Mesela PIC’in içindeki dahili osilatör 1 Hz ise Timer0 zamanlayıcısı her 1 saniyede 1 artacak ve 255 değerine geldiğinde (çünkü Timer0 8 bit) sıfıra geri dönecek. İşte sıfıra dönmesiyle bir kesme üretilir. Bu kesme fonksiyonu altında istediğimiz işlemleri yapabiliriz. Mesela 10 saniyede bir LED yanıp sönsün istiyoruz. Dahili frekansımız da 5 Hz. Yani 1/5= 0,2 saniye.

Bu şu demek: timer0 içeriği her 0,2 saniyede +1 artsın. O zaman 255 değerine ulaşıncaya kadar ne kadar süre geçer? 255 x 0,2=51 saniye. Bunun manasında şudur ki timer0 her 51 saniye de bir kesme işareti üretir. Yani kesme fonksiyonuna gider. Biz programımızda kesme fonksiyonunn altına “LED i tersle” komutu verirsek LED yanıyorsa söner, sönüyorsa yanar.

İyi de biz 10 saniyede bir led yakmak istiyorduk ama şurada 50 saniyede bir yanacak, ne iş? Evet haklısınız. İşte bu yüzden bir ayar çekmemiz lazım. Şimdi düşünün bakalım. Madem 255e kadar sayanda 50 saniye geçiyorsa, 10 saniye kadar geçmesi için kaça kadar saymalı. (255 –a) x (0,2sn)=10sn Bir denklem kurduk, burada a=205 çıkar.

Yani biz sayıcıyı sıfırdan değil de 205 den başlatırsak 255’e kadar 50 birim sayacak, 50*0,2=10 saniye verecektir. Peki zamanlayıcıyı böyle istediğimiz değere ayarlayabiliyor muyuz? Evet. Burada bir de ön bölücü kavramından bahsedelim. 1 - 2-4-8-16-32-64 gibi ön bölücüler, dahili frekansın kaç kere dönüp durduktan sonra timer’ı +1 artıracağını belirler.

Mesela yukarıdaki örnekte önbölücü 4 olsaydı her 0,2 saniyede bir değil de her 0,2 x4=0,8 saniyede bir artacaktı. Anladınız mı? O zaman size bir ödev verip bugünkü dersimizi noktalayalım: 8 Mhz kristal osilatörle çalışan bir PIC’te 250 mikrosaniyelik kesme yapması için timer0’ın kaçtan başlaması gerekir. (dahili frekansın harici frekansın çeyreği olduğunu unutmayın, önbölücü değerlerden birini de kullanınız)

TAGS: pic kesme,nterrupts,capture,counter,timer

Anahtar Kelimeler: Mikrodenetleyici

peynir6 suyu tozu , 13/06/2008-09:53 Facebook'ta Paylas