CCS C ile B Portundaki B4…B7 Pinlerinde Değişiklik Kesmesi 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 B4-B5 pinlerinde bir değişiklik olduğunda program mevcut işini bırakır ve kesme alt programınında tanımlanan işlemleri yapar.

/******************************************************
 PIC16F877 ile B portu RB4...RB7 Değişiklik Kesmesi 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

//*Port B RB4, RB5, RB6 ve RB7 pinleri değişiklik Kesme Fonksiyonu *
#int_RB // PORTB de B4...B7 pinlerinde meydana gelen değişim kesmesi
void B_degisiklik () // Kesme fonksiyonu ismi
{
 if (input(pin_b4)) // RB4 pini girişi okunuyor.
 output_high(pin_b0); // RB0 çıkışı lojik-1 yapılıyor.
 if (input(pin_b5)) // RB5 pini girişi okunuyor.
 output_high(pin_b1); // RB1 çıkışı lojik-1 yapılıyor.
 if (input(pin_b6)) // RB6 pini girişi okunuyor.
 output_high(pin_b2); // RB2 çıkışı lojik-1 yapılıyor.
 if (input(pin_b7)) // RB7 pini girişi okunuyor.
 output_high(pin_b3); // RB3 çıkışı lojik-1 yapılıyor
 delay_ms(2000); // 2 sn gecikme veriliyor.
 output_b(0x00); // B portu çıkışı komple sıfırlanıyor.
}

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

void main ( )
{
 setup_psp(PSP_DISABLED); // PSP 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(0xF0); // RB7,RB6,RB5,RB4 giriş, diğer uçlar çıkış

 output_b(0x00); // B portu çıkışı ilk anda sıfırlanıyor

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

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

 }

B Portundaki B4…B7 Pinlerinde Değişiklik Kesmesi Uygulaması

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