PIC16F628 Mikrodenetleyicisinde Kesmeler ve RB0/INT Kesmesi

2012-12-19-Dont-Interrupt

Interrupt (Kesme) Nedir?

Bütün bilgisayar ve mikrodenetleyicilerde interrupt(kesme) bulunur.  Kesme (Interrupt)   mikrodenetleyiciler ve işlemcilerde  kullanılan ve gerçekten çok önemli olan bir kavramdır.  Kesmenin ne olduğunu bir örnek ile basitçe açıklayacak olursak; siz işsiz bir elektronik mühendisiniz ve iş arıyorsunuz. Pek çok işyerine CV bıraktınız. Her an aranabilirim diye telefon bekliyorsunuz. Aynı zamanda mesleğiniz ile ilgili çalışmalar yapıyorsunuz. Tam tasarım aşamasında telefon geldi. İş ümidiyle telefonun ikinci kez çalmasına müsaade etmeden telefonu açıyorsunuz ve işinize ara veriyorsunuz. Telefon görüşmesi bitince de kaldığınız yerden devam ediyorsunuz. İşte kesme böyle birşey. Önceliği yüksek işlerin, mikrodenetleyici tarafından ana program akışı kesilerek yapılmasına kesme diyoruz.  Eğer bir kesme kaynağından mikrodenetleyiciye uyarı gelir ise mikrodenetleyici yapmakta olduğu işi bekletir, kesme alt programına gider, o programı icra eder, daha sonra ana programda kaldığı yerden devam eder. Peki biz kesmeleri nerelerde kullanırız? Genellikle çok hızlı yapılması gereken işlemlerde, anlık tepki verilmesi gereken yerlerde kesmeleri kullanırız. Örnek vermek gerekirse; bütün alarm sistemlerinde, dijital dimmerdeki  gibi faz tespitinde, zamanlayıcılarda vb.

PIC16F628A Kesmeleri

kesme

Şekil dikkatlice incelenirse ana grup altında;

  1. PORTB Change (PORTB Değişim Kesmesi),
  2. RB0 INT kesmesi (Hardware Interrupt),
  3. Timer0 Kesmesi
  4. Peripheral Interrupt ( Çevresel Kesmeler) bulunmaktadır.

PIC16F628A INT Kesmesi (RB0)

Bu kesmeye “donanım kesmesi” de denir. Gerekli kesme ayarları yapıldıktan sonra bu pin’de oluşabilecek değişiklik (OPTION_REG.INTEDG biti tanımına göre) anında mikrodenetleyici ana programı bekletir ve kesme rutinine gider,  kesme alt programındaki program kodlarını işledikten sonra tekrar ana programda kaldığı yerden devam eder.

R0Int_kesme_kapı

 INT Kesmesi nasıl kurulur?

  1. Yukarıdaki şekilde de görüldüğü gibi; önce kesmenin oluşacağı kenar seçilir yani normal durumda “H” iken “L” a düşünce kesme oluşsun istiyorsak ki buna düşen kenar (falling edge) diyoruz  bu durumda .INTEDG bitini “0” yapıyoruz. Eğer normalde “L” iken, “H” a yükselince kesme oluşsun istiyorsak .INTEDG bitini “1” yapmalıyız. Varsayılan değeri “1” yani yükselen kenar tetiklemedir.
  2. INTCON.INTE biti “1” yapılmalıdır. Yani INT girişinden kesmeye müsaade et demektir.
  3. INTCON.INTF bitini “0” yapmalıyız. Yani kesme oluştu bayrağını kaldırmalıyız.
  4. Son olarak ta INTCON.GIE bitini “1” yapmalıyız. Yani bütün kesmelere izin vermeliyiz.

INT Kesmesi oluştuğunda ne yapılır?

INT Kesmesi oluştuğunda mikrodenetleyici programı interrupt vektörüne (0x0004) yönlendirir. Interrupt alt programında oluşan kesmenin bayrağı daha sonraki kesmelerin oluşabilmesi için indirilir yani “0” yapılır.  Daha sonra kendi kodlarımızı ekleyip kesme alt programı bitirilir.

MikroC ile INT kesmesi Uygulaması

Bu uygulamamızda PIC16F628A mikrodenetleyicisinin RB0/INT girişine bir buton bağlayacağız. RB7 pinine de LED bağlayacağız. Butona basılınca kesme oluşacak ve LED terslenecek. Yani sönükse yanacak, yanıyorsa sönecek.

RB0_kesme

Yukarıdaki devreye göre kesmemizi kuralım. Önce tetikleme kenarını seçelim. INT girişi normalde “H” konumundadır. Butona basılınca “L”’a düşeceği için tetikleme ucunu “düşen kenar” seçmeliyiz.

option_reg

Bunun için OPTION_REG.INTEDG bitini “0” yapıyoruz.

OPTION_REG.INTEDG=0;  //düşen kenar tetikleme

Daha sonra INTCON registerinin .INTE bitini “1”, INTF bitini “0” yapıyoruz. En son olarak bütün kesmelere izin veriyoruz. Yani .GIE bitini “1″ yapıyoruz.

INTCON.INTE=1;                       // R0 kesmesine müsade et
INTCON.INTF=0;                       // INT bayrağını sil
INTCON.GIE=1;                        // Bütün kesmelere müsade et

Artık mikrodenetleyicimiz RB0/INT girişinden gelecek “H” dan “L”a geçişi (düşen kenar) beklemektedir. Böyle bir durum gerçekleştiğinde mikrodenetleyici kesme yöneticisi kesme rutinine bizi yönlendirecektir.

Kesme Alt Programı

Kesme alt programı(fonksiyonu) mikroC’de void interrupt() ile açılır.  Birden fazla kesme kullanılabilir. Aşağıdaki örnekte PORTB’nin 7.pini terslenmektedir.

void  Interrupt()
{
  if(INTCON.INTF)
  {
    INTCON.INTF=0;
    PORTB.B7=~PORTB.B7;
  }
}

Kodları toplu olarak yazalım;

</pre>
void interrupt() // kesme rutini -alt programı-
{
 if(INTCON.INTF) // eğer INT kesme bayrağı aktifse
 {
 INTCON.INTF=0; // bayrağı sıfırla
 PORTB.B7=~PORTB.F7; // PORTB'nin 7. pinini tersle
 }
}
//-----------------------------
void main()
{
 TRISB=1; // PORTA'nın 0.pini(INT girişi) giriş diğerleri çıkış
 PORTB=0; // PORTB'yi sıfırla
 OPTION_REG.INTEDG=0; // kesme kenarı "düşen kenar"
 INTCON.GIE=1; // bütün kesmelere izin ver
 INTCON.INTE=1; // INT kesmesine izin ver
 INTCON.INTF=0; // INT bayrağını sıfırla
 PORTB.B7=1; // LED'i test için LED'i yak,
 Delay_ms(1000); // 1 sn bekle
 PORTB.B7=0; // söndür
 while(1)
 {
 }
}
<pre>

Program çalıştırıldığında başlarken 1 saniye led yanacak ve sönecektir. Daha sonra butona basıldığında H”dan “L”a düşerken kesme oluşacak ve LED yanacaktır. Daha sonraki basılışta yine LED’i tersleyecektir.

Programa ait proje dosyalarını buradan indirebilirsiniz.

Reklamlar

8 thoughts on “PIC16F628 Mikrodenetleyicisinde Kesmeler ve RB0/INT Kesmesi

  1. Merhaba..
    Kodaları HI-TECH 9.71 a ile derlediğimde hata veriyor..
    Warning [1090] C:\Derleme 2\RB0_INT_Kesme.c; 11. variable “_TRISB” is not used
    Warning [1090] C:\Derleme 2\RB0_INT_Kesme.c; 14. variable “_INTCON” is not used
    Warning [1090] C:\Derleme 2\RB0_INT_Kesme.c; 6. variable “_PORTB” is not used
    Warning [1090] C:\Derleme 2\RB0_INT_Kesme.c; 13. variable “_OPTION_REG” is not used
    Error [499] ; 0. undefined symbol:
    _Delay_ms(aaaa.obj)

    • Kodlar hep register ayarlarıyla ilgili. Değişen bir olmayabilir. sadece register erişimin öğrenip ona göre değiştiriseniz uygunlaştırılabilir. Dley_ms() fonksiyonu farklı olabilir.

  2. __Delay_Ms fonksiyonu nu hata olarak gösterip compile ediyor.
    bu fonksiyonun MPLABC XC8 için olan fonksiyonunu bulamadım..

Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Google+ fotoğrafı

Google+ hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Connecting to %s