Haberler:

Foruma Resim Yükleme ve Boyut Sınırlaması ( ! )  https://bit.ly/2GMFb8H

Ana Menü

kesme sorunu

Başlatan cseb, 05 Mayıs 2011, 15:34:51

cseb

arkadaşlar pic16f628 için yazmış olduğum bir kesme programı var. program başlangıçta kesmeleri algılıyor güzel çalışıyor ancak bir kaç defa sonra kesme geldiğinde yapması gereken işi yapmıyor. sadece kesmeyi algılıyor ancak yapması gereken işi yapmıyor. programın tamamı alttadır.

#use delay (clock=20000000)
#byte PORTB = 6
#bit RB0 = PORTB.0
#bit RB6 = PORTB.6
#byte PORTA = 5
#bit RA1 = PORTA.1
#use fast_io(b)
#define buzzer PIN_B6
int n,m;
int8 x=0;
void alarm(void);
////////////////////////////////////MAIN PROGRAM///////////////////////////////////////////////////
void main()
{
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   setup_oscillator(False);
   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
   output_low(pin_b3);
   output_low(pin_b4);
   output_high(pin_b5);
   output_low(buzzer);


while(1){
if(RA1==0){/////////////EXT AC1 GİRİŞİ YOKSA////////////////////
   output_low(buzzer);
   disable_interrupts(GLOBAL);
   output_low(pin_b3);
   output_low(pin_b4);
   output_high(pin_b5);
   output_low(buzzer);
}
if(RA1==1){/////////////EXT AC1 GİRİŞİ VARSA////////////////////
   output_low(buzzer);
   ext_int_edge(H_TO_L);
   enable_interrupts(INT_EXT);  // INT_EXT kesmesini aktif yapar
   enable_interrupts(GLOBAL);
   output_low(pin_b3);
   output_high(pin_b4);
   output_high(pin_b5);

}
}
}/////////////////////////////MAIN PROGRAM END//////////////////////////////////////////////////////

#int_ext //////////////////// Dış (External) RB0/INT kesmesi////////////////////////////////////////////
void  ext_kesmesi ()    // Dış kesme fonksiyonu
{
output_low(buzzer);
for(n=1;n<=4;n++){
delay_ms(2);
x=input(pin_b0);
}
if(x==0){   ///////////////////////////////////alt/üst bölgede ise///////////////////////////////////////////////////////////////
  if(input(pin_a3)){////////////////manuel durumda ise///////////////////////////////////////////////
    goto mmode;
}
output_low(pin_b4);
output_low(pin_b5);
output_high(pin_b3);
output_high(buzzer);
delay_ms(500);
output_low(buzzer);
delay_ms(500);
output_high(buzzer);
delay_ms(500);
output_low(buzzer);
delay_ms(500);
output_high(buzzer);
delay_ms(500);
output_low(buzzer);
output_low(pin_b3);
output_low(buzzer);
goto finish;

mmode:////////////////////////////////////////MANUEL DURUM/////////////////////////////////////////////////////
output_low(pin_b4);
output_low(pin_b5);
output_high(pin_b3);
while(1){
if(input(pin_a0))
goto finish;
output_high(buzzer);
delay_ms(500);
if(input(pin_a0))
goto finish;
output_low(buzzer);
delay_ms(500);
if(input(pin_a0))
goto finish;
}
}
if(x>0){////////////////////////////////////////////////orta bolgede ise/////////////////////////////////////////////////////////////////
alarm();
}
finish:
m=0;
output_low(buzzer);
}
void alarm(void){
output_high(buzzer);
delay_ms(40);
}

GreeN

1-Kesmeyi RA1 in durumuna göre aktif hale getiriyorsun. Bir kere kesme gelince RA1 in durumuna bakılmaksızın external kesme hep aktif kalıyor.
RA1 hakkında yada proje hakkında kısa bir bilgi iyi olabilir.
2-Kesme geldikten sonra kesmedeki kodu işlemeden bir kesme daha gelirse problemli çalışabilir. Kodu baştan işletebilir. Kesmeye dallandıktan sonra kesmeyi durdur. Çıkışta aktif hale getirebilirsin.
3-Birde şu dikkatimi çekti , if , while , for gibi yapıların içerisinde goto ile çıkma. C'ye ters işler bunlar. Goto kullanmamaya çalış.
Terörü Lanetliyoruz.