hhuurrkkaann
Üye
- 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);
}
}
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);
}
}