HARİCİ KESMEDE engel sorunu

samed.01

Üye
Katılım
15 Ocak 2014
Mesajlar
10
Puanları
1
Yaş
29
Konum
konya
merhabalar
ben pic ile nrf24l01 modülü vasıtasıyla haberleşme uygulaması yapıyorum.
gelen veriyi almak için harici kesme kullanıyorum fakat kesme engelleniyor diyerek ccs c kesmeyi kapatıyor ve bunu hata olarak değil uyarı olarak veriyor. sonuç olarak uyarı da olsa harici kesme yi çalıştırmıyor. biraz araştırdım sorunun kesme içinde delay(); kullanımından olabileceği ni söylemişler genelde amam benim fonksiyonumda bir bekleme yok sadece ana fonksiyonum da var ama o da kesmeyi etkilemez diye düşünüyorum.hatayı ve hatanın verildiği kodu buraya atıyorum. yardımlarınızı bekliyorum teşekkür ederim.

bu da uyarıda yazan fonksiyonlar;

C:
/+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

void nRF24L01_write(unsigned char d)

{

unsigned char s = 0;

for(s = 0; s < 8; s++)

{



if((d & 0x80) != 0)

{output_bit(MOSI_pin, nrf_HIGH);}



else

{output_bit(MOSI_pin, nrf_LOW);}



d <<= 1;

output_bit(SCK_pin, nrf_HIGH);

output_bit(SCK_pin, nrf_LOW);

}

}





//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

void register_write(unsigned char reg, unsigned char value)

{

output_bit(SS_pin, nrf_LOW);

nRF24L01_write((reg | W_REGISTER_cmd));

nRF24L01_write(value);

output_bit(SS_pin, nrf_HIGH);

}





//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

bu da ana fonksiyonda ki kod:


C:
#INT_EXT

void EXT_isr(void)

{

register_write(CONFIG_reg,0x0F);

output_toggle(pin_d2);

receive_data(5,gelen);

flush_TX_RX();

//delay_ms(20);

}

Adsız.png
 
enable_interrupts(INT_EXT);
enable_interrupts(GLOBAL);
main içine bunları yazdınmı.
 
enable_interrupts(INT_EXT);
enable_interrupts(GLOBAL);
main içine bunları yazdınmı.
evet main in içinde yazdım kod bu hocam
C:
#INT_EXT

void EXT_isr(void)

{

register_write(CONFIG_reg,0x0F);

output_toggle(pin_d2);

receive_data(5,gelen);

flush_TX_RX();

//delay_ms(20);

}
 
bu fonksiyonu main içinemi yazdın. fonksiyonun içine fonksiyon yazılmaz.
 
hayır yanlış anlaşıldım hocam durum şu;
benim ana fonksiyonumun dışında bir harici kesme fonksiyonum var bu fonksiyonda uyarı gösteriyor kesme yi de kapatıyor.
şöyle paylaşıyım;
C:
#include <ALICI.h>

#use fast_io(a)
#use fast_io(b)
#use fast_io(c)
#use fast_io(d)
#use fast_io(e)

#include "E:\nrf_generic_driver.c"

unsigned int gelen[5]={};

#INT_EXT
void  EXT_isr(void)
{ register_write(CONFIG_reg,0x0F);
   output_toggle(pin_d2);
   receive_data(5,gelen);
   flush_TX_RX();
   delay_ms(20);
}

void main()
{ 
   set_tris_d(0x00);
   set_tris_b(0xff);
   set_tris_a(0b01000000);
   set_tris_c(0x00);
   output_d(0x00);
   output_b(0x00);
   output_c(0x00);
   output_e(0x00);
   enable_interrupts(INT_EXT);
   enable_interrupts(GLOBAL);
   ext_int_edge(H_to_L);
    
   nRF24L01_RX_init();
   delay_ms(500);
   output_high(CE_pin);     
   delay_us(250);

   output_high(pin_d3);
   while(TRUE)
   {
     output_high(pin_d4);
      if((gelen[0]==1)&&(gelen[1]==2)&&(gelen[3]==4)&&(gelen[4]==5)){
        if(gelen[2]==1){
         output_high(pin_d0);}
      
      if(gelen[2]==2){
        output_high(pin_d1);}
      }
   }

}

fonksiyonun uyarı verdiği yer harici kesme fonksiyonu uyarıyı da paylaşayım fotoğraf olarak;
Adsız.png
 
Gelen dizisinin bitleri ya 0 ya bir olur. 2 ,4 ,5 olmaz.
 
Gelen dizisinin bitleri ya 0 ya bir olur. 2 ,4 ,5 olmaz.
ama ben vericiden dizi olarak
giden[5]={1,2,0,3,4,5};
bu şekilde gönderiyorum olmaz mıniye olmaz anlamadım hocam
vericimde şu şekilde çünkü;
C:
#include <VERICI.h>

#use fast_io(a)
#use fast_io(b)
#use fast_io(c)
#use fast_io(d)
#use fast_io(e)

#include "E:\nrf_generic_driver.c"

unsigned int giden[5]={1,2,0,4,5};


void gonder (void)
{
   register_write(CONFIG_reg, 0x0E);
   flush_TX_RX();
   send_data(5,giden);
   delay_us(200);
   output_toggle(pin_e0);
}

void main()
{
   set_tris_d(0xff);
   set_tris_b(0xff);
   set_tris_a(0b01000000);
   set_tris_c(0x00);
      set_tris_e(0x00);
   output_c(0x00);
   output_e(0x00);
   setup_ccp1(CCP_OFF);     
   setup_vref(FALSE);
   setup_CCP1(CCP_OFF);       
   disable_interrupts(global);
   output_high(pin_e1);
    
      nrF24L01_TX_init();
      delay_ms(1000);
      
   while(TRUE)
   {
   while(input(pin_d0)!=0){delay_ms(20);giden[2]=1;gonder();}
   while(input(pin_d1)!=0){delay_ms(20);giden[2]=2;gonder();}
   }

}
 
haklısın int dizisiymiş şimdi farkettim.
 
bence isr fonksiyonunun içinde bir ledi yak. kesme oluşup oluşmadığını gör.
 

Forum istatistikleri

Konular
128,126
Mesajlar
915,243
Kullanıcılar
449,839
Son üye
Qkay

Yeni konular

Geri
Üst