23 Ocak 2011 Pazar

2. Kesmeler (Interrupts)

Kesmeler mikrodenetleyici ile yapılacak tasarımlarda oldukça önemli bir yer tutar. Kesmeler program akışının belirli bir nedene bağlı olarak kesintiye uğratılması ve normal çalışmakta olan program prosedüründen çıkılarak farklı bir program alanına gidilmesini ve sonra kalınan yere geri dönülerek tekrar çalışmaya devam edilmesini sağlayan yapılardır.

Kesmeleri ve neden ihtiyaç duyduğumuzu bir örnekle açıklamaya çalışalım: Bir arkadaşınız ile konuşarak yolda yürümektesiniz. Bu yürüyüşünüz esnasında arkanızdan ye yakından bir korna sesisin keskin keskin çaldığını duyduğunuzda ne yaparsınız? Elbette bu durumda öncelikle yapmakta olduğunuz konuşmayı keser, gerekirse yürüyüşünüzü durdurur ve arkaya bakarak bu kornanın nedenini anlamaya çalışırsınız. Eğer size doğru freni patlamış bir aracın son sürat geldiğini fark ettiğinizde oradan kaçmak ilk yapacağınız şey olmalıdır. Eğer korna size yol vermeniz için çalıyorsa hemen yan tarafa geçerek araca yol verirsiniz. Diğer bir seçenek ise bu korna sizinle ilgilide olmayabilir. Sonuçta neden ne olursa olsun yapılması gereken şey o anda yapmakta olduğunuz işi sona erdirmek ve size gelen uyarıya yönlenmektir. Her üç durumdan sonra ise yapılacak iş ise yine önünüze dönerek yolunuza arkadaşınız ile konuşarak devam etmektir.

Burada size gelen bir uyartıya karşı sizin verdiğiniz bir tepki sonucu faaliyetiniz bir süreliğine kesilmiştir. Bu uyartının durumuna göre yapmanız gerekeni yaparak sonuçta kaldığınız yere geri dönerek kaldığınız yerden devam etmeniz gerekmektedir.

Başka bir örnek vermek gerekirse; diyelim ki bir arkadaşınıza arabanızın anahtarı gerekiyor. Ona anahtarı okulda vermek üzere anlaştınız. Arkadaşınız gelecek ama ne zaman gelecek bilmiyorsunuz. Aynı anda okulda da dersiniz var. Bu durumda sizin iki seçeneğiniz vardır. Ya derse gireceksiniz arkadaşınızı dışarıda bekletecek yada onun gelişini kaçıracaksınız. Yada dışarıda onun gelmesini bekleyip dersleri kaçıracaksınız.

Peki, hem derse girip, hem de arkadaşınızı nasıl kaçırmazsınız. Bunun için iki yöntem uygulayabilirsiniz. Birincisi dışarıya arkadaşınızı tanıyan başka birini bırakırsınız. O arkadaşınızın gelişini bekler geldiğinde size haber verir sizde anahtarı verirsiniz veya arkadaşınız geldiğinde sizi telefon ile arayarak haber verir sizde anahtarı arkadaşınıza teslim edersiniz. Böylelikle ne dersten mahrum kalırsınız nede anahtarı verememek gibi bir durumla karşı karşıya kalırsınız.

Kesmelerin bize sağladığı ikinci fırsatta bunun gibi durumlardır. Yani işlemcimiz sürekli olarak bir durumun oluşmasını bekler ise o sırada yapması gereken diğer işlemlere ya daha az zaman ayırmak zorunda kalır yada o işlemleri yapamaz. Onun yerine bu uyarının gerçekleşmesi durumunda gerekli işi yapmak diğer işler için bize yeterli zamanın kalmasını sağlayacaktır. İlk örneğimizde olduğu gibi korna acaba arkamdan çalacak mı diye her üç adımda bir arkamı dönüp bakmak yürüme zamanımı oldukça fazla uzatacaktır. Ayrıca eğer korna çalmadan araç arkamdan gelirse ve ben her üç saniyede bir arkama bakıyor isem ve araç ise ikinci saniyede arkamda belirdi ise ben arkama bakıncaya kadar araç zaten bana çarpmış olacaktır. Yani aracın gelişini kaçırmış olacağım.

Kesmeler mikrodenetleyici'de iki farklı şekilde oluşur. Bunlar harici ve dahili kesmeler olarak isimlendirilir. Harici kesmeler dışarıdan mikrodenetleyici'ye uygulanacak olan kesmelerdir. Bunlar mikrodenetleyici üzerindeki bu iş için ayrılmış uçlar aracılığı ile yapılır. Dahili kesmeler ise mikrodenetleyicinin içindeki modüllerden oluşturulur. Örneğin daha sonraki konularda görülecek zamanlayıcı kesmeleri, haberleşme kesmeleri gibi.

Kesme oluştuğunda program normal çalışma işlemini keserek kesme oluştuğunda çalışması gereken yere gider. Burada gelen kesmenin ne olduğu değerlendirilir. Uyartının ne olduğuna bağlı olarak yapılması gereken iş neyse yapılarak daha sonra programda kaldığınız yere geri dönmeniz sağlanır.

Mikrodenetleyici’de kesmeleri kontrol eden yazmaçlar bulunur. Bu yazmaçlar hangi kesmelerin kullanılacağını belirlemeniz için kullanılır. Bu yazmaçlarda yer alan kesmeler hem dahili kesmeler hem de harici kesmeler içindir.

Harici kesmeler ise dışarıdan gelen uyartılar için olduğunu daha önce söylemiştik. Örneğin bir motoru kontrol eden bir devrenin her zaman için motorun koruma kapağının açıldığını kontrol etmesine gerek yoktur. Eğer motor kapağı açılırsa güvenlik açısından motorun durdurulması gerekmektedir. Kapağa monte edilecek bir anahtar vasıtasıyla bu kesme oluşturulup mikrodenetleyici'ye aktarılırsa bu durum oluştuğunda kesmeler devreye otomatik olarak girecek ve ilgili işlem olarak motorun durdurulması gerçekleşmiş olacaktır.

Kesmelerde önemli bir durumda bayraklardır. Bayraklar (flags) bir kesmenin olduğunu gösteren bitlerdir. Bu bitler Logic 1 ise kesme oluşmuş demektir.

Bayraklarda en önemli olan konu ise bayrakların sıfırlanması işlemini programcının yapması gereğidir. Bunu da bir örnekle açıklamak istersek bir futbol maçında yan hakemler herhangi bir kural ihlali olduğunda orta hakeme bunu bildirmek için ellerindeki bayrakları kaldırırlar. Bu durumu orta hakem görünceye kadar devam ederler. Buradaki genel mantıkta buna benzer. Herhangi bir kesme oluştuğunda bayrak otomatik olarak bire gider. Bu bayraklardan herhangi biri Logic olarak 1 olduğunda program normal çalışma rutininden çıkarak kesme için ayrılan yere gider. Kesme rutinine gidildiğinde gereken işlemleri yaptıktan sonra rutinden geri dönerken bu bayrağı sizin tekrar Logic 0 durumuna getirmeniz gerekmektedir. Eğer bu işlemi yapmazsanız ana programa geri döndüğünüzde bayrak hala 1 olduğu için yeniden kesme rutinine geri dönersiniz.

Kesme oluştuktan sonra 1 olan bayrağın 0 yapılmaması program içinde kısır bir döngünün oluşmasına neden olacaktır.

Bayraklar sadece ilgili kesmenin aktif olması durumunda Logic 1 durumuna gider. Şartlar sağlanmış olsa da, dışarıdan uyartı gelse de kesmeler aktif değilse bayraklar asla Logic 1 olmaz.

Mikrodenetleyici programları çalıştırırken içindeki program sayacı ile hangi program satırının ( adresinin ) çalıştığını kontrol eder ve kaydeder. Bu Sayac FSR (File Status Register) olarak isimlendirilir. Programların normal çalışması sırasında kesme oluştuğunda çalışılmakta olan program satırından farklı bir satıra gidilir. Kesmeden önceki satıra geri dönmek için bu adres saklanmalıdır. Ayrıca kesme oluştuğunda program halen kullanmakta olduğu değişkenleri ve değerleri saklamalıdır. Program kesmeden önceki yere geri döndüğünde değişkenlerin değerleri aynen yerine konmalıdır. Değişken değerleri mikrodenetleyicide LIFO tipi belleklerde saklanır.


Şekil 11
 
FIFO ( First In First Out ): İlk giren ilk çıkar tipi bellek. Sıralı erişimli bellek tiplerindendir. Bu tip belleğin çalışmasını bir boru içine yerleştirilen toplar ile anlatabiliriz. Bir borunun sol tarafından içeriye sırası ile mavi, sarı, kırmızı toplar atarsak ve diğer ucundan bu topları alırsak yine aynı sıra ile toplara ulaşabiliriz. Buna ilk giren ilk çıkar tipi bellek adı verilir.

Şekil 12

LIFO ( Last In First Out ): Son giren ilk çıkar tipi bellek. Borunun sağ tarafı kapalı ise mavi,sarı, kırmızı girer çıkarken kırmızı, sarı, mavi olarak çıkar. Yani son giren ilk çıkmıştır.

Mikrodenetleyici içindeki LIFO tipi bellekler tampon bellek olarak kullanılır. Bu belleklerde isteğe bağlı olarak değerler saklanabilir. Fakat burada dikkat edilmesi gereken konu bu belleklerin sıralı erişim özelliğine sahip olduğudur. Aşağıdaki örnekle bu konuyu daha iyi anlamaya çalışalım.

POP 10
POP Deger
POP 1254

PUSH Var1
PUSH Var2
            PUSH Var3


Pop komutu sıralı erişimli belleğe değer atamak için kullanılır. Aynen topların borudan içeriye alınması gibi bir yöntemde verileri belleğe alır. Yukarıda belleğe önce 10 değeri arkasından Deger değişkeninin değeri ve 1254 değeri sırası ile alınmıştır. Sonra Push Var1 komutu çalıştığında belleğe en son atılan 1254 değeri Var1 değişkenine atanır. ( Not: Burada Var1 değişkeninin word olduğunu düşünmelisiniz.) Var2 değişkenine Deger değişkeninin değeri ve en son olarak ta Var3 değişkenine 10 değeri aktarılır.

Kısaca tekrar söylemek gerekirse belleğe hangi sıra ile değerleri atarsanız o sıranın tam tersi şeklinde bellekten değerleri geri almanız gerekmektedir.

Önce kesmeler için kullanılacak yazmaçları inceleyelim:

Hiç yorum yok:

Yorum Gönder