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

Bu blogdaki popüler yayınlar

ESP32 Debug Mod Kullanımı

ESP32-WROOM AT Komutları Kullanımı

ESP32 IDF Kurulumu ve Kullanımı