CCS-C'de Kesmeden çıkamıyorum,,,

Katılım
26 Ağu 2008
Mesajlar
124
Puanları
1
Yaş
40
Arkadaşlar selamlar,

CCS C'de RB değişiklik kesmesi gelince, program kesmeye gidiyor, kesme fonksiyonundaki işlemi devamlı olarak (başa dönerek) yapıyor. Yani kesme fonksiyonunda tanımlı işlemi yaptıktan sonra kesmeden çıkıp "main" fonksiyonunda işleme kaldığı yerden devam etmiyor.

Kesmenin mantığı, kesme geldiğinde kesmeye gidip, kesmeyi işleyip sonra işleme kaldığı yerden devam etmesi değil midir? Ben neyi yanlıs yapıyorum bilemedim. Kod aşağıda...


#include <16f877.h> // Kullanılacak denetleyicinin başlık dosyası tanıtılıyor.
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD
#use delay (clock=4000000) // Gecikme fonksiyonu için kullanılacak osilatör frekansı belirtiliyor.
#use fast_io(c) //Port yönlendirme komutları C portu için geçerli
#use fast_io(e) //Port yönlendirme komutları E portu için geçerli
#use fast_io(b) //Port yönlendirme komutları B portu için geçerli
#define use_portd_lcd TRUE // LCD D portuna bağlı
#include <lcd.c> // lcd.c dosyası tanıtılıyor

#INT_RB // ADC çevrimi bitti kesmesi

void interrupt_RB ( ) //KESME GELİNCE DEVAMLI C1'i YAKIP SÖNDÜRÜYOR, 1 KERE YANIP SONDUKTEN //SONRA MAİN FONKSİYONUNA DÖNMESİ GEREKMEZ Mİ?
{
output_high(pin_c1);
delay_us(2000);
output_low(pin_c1);
delay_us(2000);
return;
}

//********** 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_CCP1(CCP_OFF); // CCP1 birimi devre dışı
setup_CCP2(CCP_OFF); // CCP2 birimi devre dışı

while(1) // sonsuz döngü

{
set_tris_b(0xF0); // RB7,RB6,RB5,RB4 giriş, diğer uçlar çıkış
set_tris_c(0x00);
output_c(0x00);

enable_interrupts(INT_RB); // RB DEĞİŞİKLİK KESMESİ AKTİF
enable_interrupts(GLOBAL); // Aktif edilen kesmelere izin ver

output_high(pin_c0);
delay_ms(3000);

lcd_init();
printf(lcd_putc,"\f main fonksiyonundasın "); // LCD'ye yazı yazdırılıyor
delay_ms(3500);

output_low(pin_c0);
}

}
 
Asm deki retfie komutunu denediniz mi? Return yerine #asm retfie 1 #endasm şeklinde bir denermisiniz?
 
Merhabalar,
1- İlk gözüme çarpan Kesme Fonksiyonundaki return koduna ihtiyacın yok..
Aşağıdaki Kodları Sonsuz Döngüde tanımlamayın ( Sonsuz Döngüden önce tanımlayın )
--Portların sigorta ayarlarını
-- Kesme Setup ayarlarını
--LCD ilk kurulum komutunu..

Kodlarınızın arasında B0 pini değişikliğini nereden yaptığını göremedim ama sanırım B0 pinine dışarıdan müdahale ediyorsun. Aksi durumda Kesmeye gitmez program.
 
Bu hangi dil bilmiyorum ama herhangi bir kesmeden çıkmanız için o kesmenin xIF bitini 0 yapmanız lazım, hani nerde?
 
#include <16f877.h> // Kullanılacak denetleyicinin başlık dosyası tanıtılıyor.
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD
#use delay (clock=4000000) // Gecikme fonksiyonu için kullanılacak osilatör frekansı belirtiliyor.
#use fast_io(c) //Port yönlendirme komutları C portu için geçerli
#use fast_io(e) //Port yönlendirme komutları E portu için geçerli
#use fast_io(b) //Port yönlendirme komutları B portu için geçerli
#define use_portd_lcd TRUE // LCD D portuna bağlı
#include <lcd.c> // lcd.c dosyası tanıtılıyor

#INT_RB // ADC çevrimi bitti kesmesi

void interrupt_RB ( ) //KESME GELİNCE DEVAMLI C1'i YAKIP SÖNDÜRÜYOR, 1 KERE YANIP SONDUKTEN //SONRA MAİN FONKSİYONUNA DÖNMESİ GEREKMEZ Mİ?
{
while(input(pin_b4))
{
output_high(pin_c1);
delay_us(2000);
output_low(pin_c1);
delay_us(2000);
}

while(input(pin_b5))
{
output_high(pin_c1);
delay_us(2000);
output_low(pin_c1);
delay_us(2000);
}

while(input(pin_b6))
{
output_high(pin_c1);
delay_us(2000);
output_low(pin_c1);
delay_us(2000);
}

while(input(pin_b7))
{
output_high(pin_c1);
delay_us(2000);
output_low(pin_c1);
delay_us(2000);
}
}

//********** 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_CCP1(CCP_OFF); // CCP1 birimi devre dışı
setup_CCP2(CCP_OFF); // CCP2 birimi devre dışı

set_tris_b(0xFF); // RB7,RB6,RB5,RB4 giriş, diğer uçlar çıkış
set_tris_c(0x00);
output_c(0x00);

enable_interrupts(INT_RB); // RB DEĞİŞİKLİK KESMESİ AKTİF
enable_interrupts(GLOBAL); // Aktif edilen kesmelere izin ver

while(1) // sonsuz döngü
{
output_high(pin_c0);
delay_ms(3000);

lcd_init();
printf(lcd_putc,"\f main fonksiyonundasın "); // LCD'ye yazı yazdırılıyor
delay_ms(3500);

output_low(pin_c0);
}
}
 

Ekli dosyalar

  • c ve hex dosyalari.rar
    2.1 KB · Görüntüleme: 9
Bu siteyi kullanmak için çerezler gereklidir. Siteyi kullanmaya devam etmek için onları kabul etmelisiniz. Daha fazla bilgi edin…