int_rda kesmesine sadece bir kez giriyor.

Başlatan alperyazir, 20 Mayıs 2012, 03:49:05

alperyazir

ustalar 3 pic'i haberleştirmek istiyoruz bir tane merkez pic seçtik 2 tane alıcı pic şeklinde.merkez pic'ten alıcılara bilgi gönderme ve alıcılardan merkez pic'e bilgi alma işlemi yapmaya çalışıyoruz. Ancak merkez pic'te rda kesmesine yalnızca 1 kez giriyor. main'de rda kesmesini aktif yaptığım halde bir daha onu görmüyor bu sorunu anlayamadım.yardımcı olur musunuz ? şimdiden cok tesekkür ederim. kodları kopyaladım ayrıca devre şemasıyla birlikte upload ediyorum

merkez
#include <16f877A.h>

#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD

#use delay (clock=4000000)

#use rs232 (baud=9600, xmit=pin_c6, rcv=pin_c7, parity=N, stop=1, bits=8)
#use rs232 (baud=9600, xmit=pin_b1, rcv=pin_b0, parity=N, stop=1, bits=8, STREAM=iletisim)

char al;

#int_rda
void serial_interrupt()
{
    disable_interrupts(int_rda);
   al=getch();
   if(al=='e') output_high(pin_b4); 
   if(al=='f') output_low(pin_b4);

}

char al1;
#int_ext
void seri() {
disable_interrupts(int_ext);
     al1=fgetc(iletisim);
   if(al1=='g') output_high(pin_b5); 
   if(al1=='h') output_low(pin_b5);
}


int x,y;
void main()
{
   setup_psp(PSP_DISABLED);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_CCP1(CCP_OFF);
   setup_CCP2(CCP_OFF);
   
   set_tris_b(0x0D);
   set_tris_c(0x80);
   set_tris_d(0x01);
   output_low(pin_b4);
   output_low(pin_b5);
 
   enable_interrupts(GLOBAL);
   while(1)
   {
 
      enable_interrupts(int_rda);
      
      enable_interrupts(int_ext);
      
      x=input(pin_b2);
      y=input(pin_b3);
       
      if(x==1) putc('a');
      if(x==0) putc('b');
      if(y==1) fputc('c',iletisim);
      if(y==0) fputc('d',iletisim);
        
   }
}


alıcı1
#include <16f877A.h>

#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD

#use delay (clock=4000000)

#use rs232 (baud=9600, xmit=pin_c6, rcv=pin_c7, parity=N, stop=1, bits=8)


char al;
#int_rda
void serial_interrupt()
{
   disable_interrupts(int_rda);
   al=getch();
   if(al=='a') output_high(pin_b2);
   if(al=='b') output_low(pin_b2);
  
}


int x;
void main()
{
   setup_psp(PSP_DISABLED);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_CCP1(CCP_OFF);
   setup_CCP2(CCP_OFF);
   
   set_tris_b(0x02);
   set_tris_c(0x80);
  
   output_low(pin_b2);
   output_low(pin_d2);
  

   enable_interrupts(GLOBAL);
   while(1)
   {
      enable_interrupts(int_rda);
      
      x=input(pin_b1);
      
      if(x==1) putc('e');
      if(x==0) putc('f');
     
      
      
   }
}


alıcı2
#include <16f877A.h>

#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD

#use delay (clock=4000000)

#use rs232 (baud=9600, xmit=pin_c6, rcv=pin_c7, parity=N, stop=1, bits=8)


char al;
#int_rda
void serial_interrupt()
{
   disable_interrupts(int_rda);
   al=getch();
   if(al=='c') output_high(pin_b2);
   if(al=='d') output_low(pin_b2);
}


int x;
void main()
{
   setup_psp(PSP_DISABLED);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_CCP1(CCP_OFF);
   setup_CCP2(CCP_OFF);
   
   set_tris_b(0x02);
   set_tris_c(0x80);
   
   output_low(pin_b2);
  

   enable_interrupts(GLOBAL);
   while(1)
   {
      enable_interrupts(int_rda);
      
      x=input(pin_b1);
  
      if(x==1) putc('g');
      if(x==0) putc('h');
      
   }
}



FEHMİ_ASM

#1
     Slave (ikincil) cihazlarda veri göndermede sorun yoksa ve istediğin aralıkta veri gönderiyorsa sorun Master PIC'tedir.  Master PIC' için kesme oluştuğunda aşağıdakileri yap.

Kesme Oluştu:
1. Bir sonraki gelecek kesmeleri engelle (Disable RCIE)
2. Alıcı kesme bayrağını sıfırladığından emin ol (Clear RCIF)
    ...kesme kodları...
3. Bir sonraki kesmeleri geçerli yap (Enable RCIE)
4. Çıkış

eemuratozan

kesme programları içindeki işlemler bitince enable_interrupts(int_rda) yaz

sana örnek kod yollayayım
VERİCİ
#include <Verici_Kodları.h>
#use delay(clock=4000000)
#define use_portd_lcd TRUE
#include <LCD.C>
#use rs232(baud=600,xmit=pin_c6,rcv=pin_c7,parity=N)
#use fast_io(b)
#use fast_io(a)

char al,gel;
int gelen=0,veri;


#int_rda
void geri_bildirim_kesmesi()
{
     disable_interrupts(int_rda);
     gel=getch();
     if(gel==0x56)
     {
       al=getch();
       if(al==0x01)
       {
         gelen=1;        
         
       }
       if(al==0x02)
       {
         gelen=2;
                 
       }
     } 
     enable_interrupts(int_rda);
     }
     

   
void main()
{
   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_psp(PSP_DISABLED);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   
   enable_interrupts(GLOBAL);
   set_tris_b(0xFF);
   set_tris_a(0x00);
   output_a(0x00);
   output_high(pin_a0);
   output_low(pin_a1);
   port_b_pullups(false);
   lcd_init();
   
   while(1)
   { 
   
   
     if(input(pin_b0))
     {
       veri=0x01;
       lcd_gotoxy(1,1);
       printf(lcd_putc,"\fArac ileri yonde");
       output_low(pin_a0);
       output_high(pin_a1);
       goto veriyi_gonder;
     }
     if(input(pin_b1))
     {
       veri=0x02;
       lcd_gotoxy(1,1);
       printf(lcd_putc,"\fArac geri yonde");
       output_low(pin_a0);
       output_high(pin_a1);
       goto veriyi_gonder;
     }
     
     if(gelen==1)
     { 
       output_high(pin_a5);
       delay_ms(50);
       output_low(pin_a5);
       lcd_gotoxy(1,2);
       printf(lcd_putc,"\fAlan bulundu..");
       gelen=0;
     }
     if(gelen==2)
     {
       output_high(pin_a5);
       delay_ms(50);
       output_low(pin_a5);
       lcd_gotoxy(1,2);
       printf(lcd_putc,"\fPark basarili..");
       gelen=0;
     }
     veriyi_gonder:
     delay_ms(100);
     putc(0x55);
     putc(0x55);
     putc(0x55);
     putc(0x55);
     putc(0x55);
     
     putc(0x56);
     putc(0x56);
     putc(0x56);
     putc(0x56);
     putc(0x56);
     
     putc(veri);
     putc(veri);
     putc(veri);
     putc(veri);
     putc(veri);
     veri=0x00;
     output_high(pin_a0);
     output_low(pin_a1);
     enable_interrupts(int_rda);
     
   }
   

}

ALICI
#include <Alıcı_Kodları.h>
#use delay(clock=4000000)
#use fast_io(b)
#use rs232(baud=600,xmit=pin_c6,rcv=pin_c7,parity=N)

char al,gel;
int gelen=0;

#int_rda
void geri_bildirim_kesmesi()
{
     disable_interrupts(int_rda);
     gel=getch();
     if(gel==0x56)
     {
       al=getch();
       if(al==0x01)
       {
         gelen=1;        
         
       }
       if(al==0x02)
       {
         gelen=2;
                 
       }
     } 
     enable_interrupts(int_rda);
     }


void main()
{
   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_psp(PSP_DISABLED);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   enable_interrupts(GLOBAL);
   enable_interrupts(int_rda);
   set_tris_b(0x00);
   output_b(0x00);
   output_high(pin_b2);
   output_low(pin_b3);
   while(1)
   {
     if(gelen==1)
     {
         output_high(pin_b0);
         delay_ms(500);
         output_low(pin_b0);
         delay_ms(500);
         output_high(pin_b0);
         delay_ms(500);
         output_low(pin_b0);
         delay_ms(500);
         output_high(pin_b0);
         delay_ms(500);
         output_low(pin_b0);
         delay_ms(500);
         gelen=0; 
         output_low(pin_b2);
         output_high(pin_b3);
         delay_ms(100);
         putc(0x55);
         putc(0x55);
         putc(0x55);
         putc(0x55);
         putc(0x55);
    
         putc(0x56);
         putc(0x56);    // vericiye 0x56 adını verdik
         putc(0x56);    // vericiye 0x56 adını verdik
         putc(0x56);    // vericiye 0x56 adını verdik
         putc(0x56);
    
         putc(0x01);
         putc(0x01);
         putc(0x01);
         putc(0x01);
         putc(0x01);
         output_high(pin_b2);
         output_low(pin_b3);
         enable_interrupts(int_rda);
       }
       if(gelen==2)
       {
         output_high(pin_b1);
         delay_ms(500);
         output_low(pin_b1);
         delay_ms(500);
         output_high(pin_b1);
         delay_ms(500);
         output_low(pin_b1);
         delay_ms(500);
         output_high(pin_b1);
         delay_ms(500);
         output_low(pin_b1);
         delay_ms(500);
         gelen=0; 
         output_low(pin_b2);
         output_high(pin_b3);
         delay_ms(100);
         putc(0x55);
         putc(0x55);
         putc(0x55);
         putc(0x55);
         putc(0x55);
    
         putc(0x56);
         putc(0x56);    // vericiye 0x56 adını verdik
         putc(0x56);    // vericiye 0x56 adını verdik
         putc(0x56);    // vericiye 0x56 adını verdik
         putc(0x56);
    
         putc(0x02);
         putc(0x02);
         putc(0x02);
         putc(0x02);
         putc(0x02);
         output_high(pin_b2);
         output_low(pin_b3);
         enable_interrupts(int_rda);
       }
     }
   }
     
   
sistem hem alıcı hem verici şeklinde çalışmaktadır bizzat tarafımdan boardda denenmiş ve başarılı olmuştur
I&C Engineer in Bereket Enerji Çates Elektrik Üretim A.Ş.

ferdem

Kesme içerisinde enable, disable işlemlerine gerek yoktur. CCS C rda kesmesinin forumda örnekleri var.
Merkez e gelen TX leri birbirine bağlayıp merkez RX e mi girdiniz? Bu sakıncalı bir harekettir çünkü veri göndermeyen TX, hattı 5V ta tutmak ister. Diğer PIC veri göndermek istediğinde o hattı toprağa çekmek istediğinden çakışma olur. İki TX bir RX e nasıl girilir düşünmeli, şu anda aklıma en basitinden AND lemek geliyor. Kolay gelsin.