
Merhaba Arkadaşlar,
Uzun bir aradan sonra yine birlikteyiz. Dersler, bitirme projesi ve birkaç farklı işle daha uğraştığımdan dolayı buraya zaman ayıramadım kusura bakmayın. Bu nedenle hızlıca derse giriş yapmak istiyorum. Bu derste basit bir kesme uygulaması gerçekleştireceğiz. Uygulamada kesme işaretini bir buton yardımıyla dışarıdan vereceğiz ve bu kesmeye göre işlemcimize birkaç farklı işlem yaptıracağız. O zaman başlayalım.
İlk olarak programda kullanacağımız komut ve kaydedicileri tanıyarak başlayalım. Daha sonra bölüm bölüm programımızı yazacağız.
- P1IE Kaydedicisi (8 bit): Interrupt Enable kaydedicisi Port1 modülünün hangi pininden kesme gelebileceği bilgisini saklar. Yani kesme yetkilendirme işlemini gerçekleştirdiğimiz kaydedici.
- P1REN Kaydedicisi (8 bit): Resistor Enable kaydedicisi Port1 modülünün pinlerinde bulunan dahili pull-down veya pull-up dirençlerini aktif etmemizi sağlar.
- P1IFG Kaydedicisi (8 bit): Interrupt Flag kaydedicisi kesmenin Port1 modülünün hangi pininden geldiği bilgisini saklar. Örneğin P1.1 den kesme geldiğinde P1IFG kaydedicisinin 1. biti 1 olmaktadır.
- eint komutu: dışarıdan gelecek kesmelerin dikkate alınmasını sağlar. Yani bu komutu kullanmadığınızda sabaha kadar butona bassanız da hiçbir şey olmayacaktır. Tecrübe ile sabit. 😀
- reti komutu: kesmen alt programından ana programa geri dönmemizi sağlar.
- inc hedef komutu: hedef kaydedicinin içeriğini 1 arttırır.
Şimdi önceki derste yaptığımız gibi programımızı 4 bölüme ayırıp kodlarını ayrı ayrı inceleyerek devam edelim.
1. Ayarlama Bölümü
#include "msp430.h"
org 0f800h
reset mov #0280h,SP
mov #WDTPW+WDTHOLD,&WDTCTL
bis.b #041h,&P1DIR
bis.b #08h,&P1IE
bis.b #08h,&P1REN
bic.b #08h,&P1IFG
eint
Kodları incelediğimizde 5. satıra kadar önceki programda yaptığımız işlemleri yapıyoruz. Bunları işlemcinin düzgün çalışması için gerekli komutlar olarak düşünebilirsiniz ki zaten öyle. 🙂
6. satırda P1.0 pini ve önceki programdan farklı olarak P1.6 pinini çıkış olarak tanımlıyoruz. Bu pinler sırasıyla kartımızın üzerindeki kırmızı ve yeşil LED’lere karşılık gelmektedir.
Kartın üzerinde bulunan butonu kullanacağımızdan dolayı 7. satırda P1.3 pininden kesme gelebilir yetkilendirmesini yapıyoruz. Daha sonra alt satırdaki komut ile aynı pin için pull-up direncini aktif ediyoruz. Ben burada anlatmayacağım ancak pull-up ve pull-down dirençlerinin neden kullanıldığını araştırmanız yararınıza olacaktır.
Önceki programlarımızdan dolayı P1IFG kaydedicisinin içerisinde veri kalmış olabileceği için 8. satırda P1.3 pininin kesme bayrağını temizliyoruz.
Son olarak eint komutu ile kesmelerin gelmesine izin vererek ayarlamalarımızı tamamlıyoruz.
2. Ana Program Bölümü
clr R5
loop xor.b #01h,&P1OUT
mov #050000,R4
l1 dec R4
jnz l1
jmp loop
Ana programda ilk olarak R5 kaydedicisini temizliyoruz. Daha sonra ise İlk Program dersinde yapmış olduğumuz LED yakıp söndürme işlemini bu sefer alt program kullanmadan gerçekleştiriyoruz.
3. Alt Program ve Kesme Programları Bölümü
Bu bölümde kesme geldiğinde işlemcimizin hangi işlemleri yapması gerektiğini belirten “Kesme Servis Programının” kodları yer almaktadır.
buton inc R5
xor.b #040h,&P1OUT
bic.b #08h,P1IFG
reti
“buton” etiketindeki kesme programı butona basıldığında çalışmaya başlayacaktır. Butona basılmadığı sürece işlemcimiz ana program döngüsünde kalacaktır.
Kesme geldiğinde ilk olarak R5 kaydedicisinin değeri bir arttırılmaktadır. Daha sonra 18. satırda P1.6 pininin durumunun tersi alınmaktadır. Yani kart üzerindeki yeşil LED yakılmakta veya söndürülmektedir.
Son olarak kesme programından sonra mutlaka yapmamız gereken P1IFG kaydedicisini ilgili bitini temizleyerek “reti” komutu ile ana programa geri dönüyoruz. Eğer P1IFG kaydedicisini temizlemeden ana programa geri dönmüş olsaydık, işlemci ana programa döndüğü anda tekrar kesme geldiğini zannederek kesme programına tekrar giderdi ve böylelikle işlemci sürekli olarak kesme programına girip çıkardı.
4. Kesme Vektör Tablosu Bölümü
org 0fffeh
dw reset
org 0ffe4h
dw buton
end
Bu bölümde önceki programda bulunan “reset” kesmesinin yanında “buton” kesmesinin de kesme vektör tablosundaki ayarlamalarının yapılması gerekmektedir.
21 ve 22 numaralı satırlar ile “reset” kesmesini ayarlıyoruz. Bunu daha önce anlatmıştım umarım dersleri sırayla okuyorsunuzdur. 🙂
MSP430G2553 işlemcisinin datasheet’ini incelediğimizde Port1 modülünün kesme vektör tablosundaki adresinin “0ffe4h” olduğu görülmektedir. (Sizde farklı bir işlemci varsa işlemcinizin datasheet’ini incelemeniz gerekir.) Buna göre 23 ve 24 numaralı satırlar yardımıyla Port1 modülünden bir kesme gelmesi durumunda işlemcimize “buton” etiketli kesme programındaki işlemleri gerçekleştirmesini söylüyoruz.
Böylelikle programımızı tamamlamış olduk. Şimdi birkaç cümle ile programın tamamının ne yaptığını açıklayacak olursak.
Program kırmızı LED’in belirli bir süre ile yakıp söndürürken kesme geldiğinde yeşil LED’in durumunun tersini almaktadır. Ayrıca R5 kaydedicisinde butona kaç defa basıldığı bilgisi saklanmaktadır.
Evet gördüğünüz gibi 25 satırlık program iki cümle ile özetlenebiliyor. Özellikle sınava yönelik çalışanların programları böyle yorumlayabilmesi oldukça önemlidir. Tabii ki bu yorum yeteneği çok fazla program görerek ve yazarak zamanla gelişecektir. O nedenle olabildiğince çok program yazmaya çalışın. Bunlar basit programlar olabilir. Unutmayın ki karmaşık programlar çok sayıda basit programın birleşmesinden oluşur. Bu yüzden sabırlı bir şekilde çalışmaya devam edin. 🙂 Böylelikle bir yazımızın daha sonuna geldik efendim sonraki yazılarda görüşmek üzere.