MSP430 Interrupt Uygulaması
Merhabalar bu yazımda sizlere MSP430 geliştirme kartı üzerinden interrupt(kesme) nedir ve nasıl kullanılır bundan bahsedeceğim.Donanımdan bağımsız kesmeleri şu şekilde anlatabiliriz.Bizim bugün bir kargomuz gelecek olsun.Kargocu geldiği zaman kargomuzu alacağız.Ama biz bu kargo beklerken her seferinde balkona çıkıyoruz,kargocu geldimi diye kontrol ediyoruz eğer kargo gelmedi ise işlerimize devam ediyoruz.Ama eğer kargocu biz diğer işlerimizi yaparken gelmiş olursa ve biz de bu durumu farketmezsek kargomuzu teslim alamıyoruz.Çünkü kargo geldiğinde biz ev işlermizle meşgüldük.Bunun yerine -genelde her evde bir adet bulunan- küçük kardeşimizi balkona koyuyoruz ve ona diyoruz ki sen burda bekle ve bana kargo geldiği zaman haber.(Bu işi yaptığı takdirde ona küçük bir ödül veriyoruz ki daha sonraki işlemizde kullanabilelim.)Kargo takibi için bir alarm oluşturduktan sonra kalan işlerimizi gönül rahatlığı ile devam ettirebiliriz.
Günlük hayatta olan bu uygulamaya benzer bir şekilde gömülü sistemlerde aynı yapıyı kullanıyoruz.Büyük kardeş olan işlemci çekirdeği ana işe ile meşkülken eğer yapması gereken ama sürekli olarak da yoklayamacağı bir işi de varsa bu işi,küçük kardeşine bırakıp ondan bir haber gelmesini bekliyor.
Yapacağımız uygulama şu olsun kartımızın üzerindeki iki adet dahili ledden birisi devamlı olarak belirli periyodlarda yanıp sönsün,diğer led ise sadece butona basıldığı zaman toggle(yanıyorsa sönsün, sönüyorsa yansın :) ) yapsın.
Proje taslağı oluşturma;
3 adet pine ihtiyacımız var.
2 adet çıkış için 1 adet giriş için
Gerekli pin konfigurasyonalarını yapıyoruz.
Daha sonra interrupt ayarlarını yapıyoruz.
Sü1. rekli çalışan kod bölümüne dahili ledi 100 ms aralığında yakıp söndürüyoruz.
Diğer ledi ise sadece butona basıldığı anda yakıp söndüryoruz.
Son.
Başlangıçta bu şekilde ne yapacağımıza kararverdiğimizde (Hazır bir donanımız varsa) kod aşamasında daha rahat çalışırız.
Kodlara geçip kodlar üzerinde devam edelim.
#include <msp430.h>
int main(void)
{
WDTCTL = WDTPW | WDTHOLD; // stop watchdog timer
P1DIR |= BIT0; // 1. portun 1. pini çıkış yapıldı
P1OUT = 0x00; // 1. portun başlangıç değeri 0
P1DIR |= BIT6; // 1. portun 6. pini çıkış yapıldı
P1OUT = 0x00; // 1. portun başlangıç değeri 0
P1IE = BIT3; //interrupt enable
P1IES = BIT3; //falling edge
P1IFG = 0x00; //claer the interrupt flag
_enable_interrupts(); //call the interrupt function
//fonksiyon tanımlaması yapıldı
volatile unsigned int i;
while(1)
{
P1OUT ^= 0x01; // toggle P1.0
for(i=10000; i>0; i--); // delay
}
}
#pragma vector = PORT1_VECTOR //port 1 den gelen kesme için ayarlandı
__interrupt void PORT1_ISR(void) //kesme geldiği zaman işlenecek fonsiyon
{
P1OUT ^= BIT6;
P1IFG = 0x00;
}
P1IES = BIT3; //falling edge
Burada high to low yapmamızın nedeniz kart üzerindeki buton active low yani butona basıldığı anda lojik sıfır değerine basılmadığı zaman ise lojik high değeri gitmektedir.
P1IFG = 0x00; //claer the interrupt flag
Her interrupt geldiğinde flag kalkar biz işlemlerimizi tamamladıktan sonra yeniden bir kesme geldiğinde okumak için biz bu bayrağı sıfırlarız.
Yorumlar
Yorum Gönder