Dış Kesme (External Interrupt) Uygulaması

pr_01_37_max

 

Kesme işlemini günlük hayattan bir örnek vererek açıklayalım. Mesela yemek yiyorsunuz ve telefon çaldı. Ne yaparsınız? Yemek yemeyi bir süre için bırakır, telefona bakar sonra dönüp yemek yemeye devam edersiniz. İşte günlük hayatta karşılaştığınız bir kesme. Asıl işiniz yemek yeme olayı iken ihtiyaçtan (telefon çalması) dolayı asıl işinizi bırakıp diğer bir işi yaptınız (telefona bakma) ve geri dönüp asıl işinizde kaldığınız yerden devam ettiniz.

Mikrodenetleyicilerdeki kesme olayı yukarıdaki örneğe oldukça benzerdir. Kesme, mikrodenetleyicilerin herhangi bir kesme kaynağından gelen sinyal nedeniyle çalışmakta olan programı bırakması ve önceden hazırlanan kesme altprogramını çalıştırması olayıdır. Alt programın çalışması bittikten sonra ana program kaldığı yerden itibaren tekrar çalışmasına devam eder.

Aşağıda verilen örnekte mikrodenetleyiciye ait B0 pininde bir değişiklik olduğunda program mevcut işini bırakır ve kesme alt programınında tanımlanan işlemleri yapar.

Not: Programda verilmiş ama kesme içerisinde delay_ms() komutunu kullanmayınız. Amaç kesmeden hemen çıkmak olmalı ve programınızı bu yönde hazırlamalısınız.

/******************************************************
 PIC16F877 ile Dış Kesme (INT_EXT) Uygulaması
 PIC PROG/DEKA : Port B jumper'ı LED konumunda olmalı
*******************************************************/
#include <16f877.h> // Kullanılacak denetleyicinin başlık dosyası tanıtılıyor.

#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD // Denetleyici konfigürasyon ayarları

#use delay (clock=4000000) // Gecikme fonksiyonu için kullanılacak osilatör frekansı belirtiliyor.

#use fast_io(b) //Port yönlendirme komutları B portu için geçerli

int i; // Tamsayı tipinde değişken tanımlanıyor

//****** Dış Kesme Fonksiyonu *****************
#int_ext // Dış (External) RB0/INT kesmesi
void ext_kesmesi () // Dış kesme fonksiyonu
{
 output_high(pin_b1);
 delay_ms(1000);
 output_low(pin_b1);
 delay_ms(3000);

 for (i=0;i<10;i++)
 {
 output_high(pin_b1);
 delay_ms(500);
 output_low(pin_b1);
 delay_ms(500);
 }
}

/********* ANA PROGRAM FONKSİYONU********/

void main ( )
{
 setup_psp(PSP_DISABLED); // PSP birimi devre dışı
 setup_spi(SPI_SS_DISABLED); // SPI birimi devre dışı
 setup_timer_1(T1_DISABLED); // T1 zamanlayıcısı devre dışı
 setup_timer_2(T2_DISABLED,0,1); // T2 zamanlayıcısı devre dışı
 setup_adc_ports(NO_ANALOGS); // ANALOG giriş yok
 setup_adc(ADC_OFF); // ADC birimi devre dışı
 setup_CCP1(CCP_OFF); // CCP1 birimi devre dışı
 setup_CCP2(CCP_OFF); // CCP2 birimi devre dışı

 set_tris_b(0x01); // RB0 pini giriş,diğer uçlar çıkış olarak yönlendiriliyor
 output_b(0x00); // B portu çıkışı ilk anda sıfırlanıyor

 ext_int_edge(H_TO_L); // INT_EXT kesmesinin düşen kenarda aktif olacağını belirtir

 enable_interrupts(INT_EXT); // INT_EXT kesmesini aktif yapar
 enable_interrupts(GLOBAL); // Aktif edilen kesmelere izin ver

 while(1); // Sonsuz döngü
 }

Dış Kesme (External Interrupt) Uygulaması

Bu yazı CCS C Örnekleri kategorisine gönderilmiş ve , ile etiketlenmiş. Kalıcı bağlantıyı yer imlerinize ekleyin.