CCS C de Hem alıcı hem verici yapımı sorun!!!

Başlatan eemuratozan, 31 Mart 2012, 13:33:56

eemuratozan

arkadaşlar basit olarak pic16f877a ile veri gönderip yine karşı tarafta bunu pic16f877a ile alıp veri işlemek istiyorum bunu yapabiliyorum ancak istiyorum ki alıcı pic işlemi yaptıktan sonra verici gibi davranıp geribildirim göndersin vericim de bu geri bildirimi kesme ile alsın ancak bu çift taraflı iletimi başaramadım işte kodlarım sizce nerede hata yapıyorum:

Verici Kodları
#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)

char al,gel;
int alinan=0;

#int_rda
void geri_bildirim_kesmesi()
{
  diasble_interrupts(int_rda);
  gel=getch();
  if(gel==0x56)
  {
    al=getch();
    if(al==0x01)
    {
      alinan=0x01;
    }
  }
}
   
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(int_rda);
   enable_interrupts(GLOBAL);
   set_tris_b(0xFF);
   
   port_b_pullups(false);
   lcd_init();
   
   if(alinan==0x01)
   {
     lcd_gotoxy(1,1);
     printf(lcd_putc,"\f Led yandi...");
     delay_ms(100);
   }
     
   
   while(1)
   {
   if(input(pin_b0))
   {
     
    delay_ms(50);
    
    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);
   }
   }


}

Alıcı Kodları
#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;


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);
    
   set_tris_b(0x00);
   output_b(0x00);

   while(1)
   {
     gel=getch();
     if(gel==0x56)
     {
       al=getch();
       if(al==0x01)
       {
         output_high(pin_b0);
         delay_ms(500);
         output_low(pin_b0);
         delay_ms(500);
         
           
         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);
       }
     }
   }

}
I&C Engineer in Bereket Enerji Çates Elektrik Üretim A.Ş.

skara1214

 udeayada herhangi basit seviye rf modül çifti kullandığınızı varsayarak konuşuyorum(çünkü hiçbi ayrıntı vermemişsiniz).Ne yazıkki elinizdeki modüller sadece receiver(alıcı), transmitter(verici) olarak çalışıyor.Gidip transreceiver(hem alıcı hem verici) modüllerden 2 tane kullanmanız gerekli.
Herkes ölür ama herkes gerçekten yaşamaz

serhat1990

Kullandığın modüllerin ismini verirsen yardımcı olabiliriz. İyi günler.

eemuratozan

yapmak istediğim şey zaten 2 alıcı iki verici modülü kullanarak bunların seçimini anhtarlamayla yapıcam yani vericim bilgiyi vercek anhtarlama ile alıcıyı aktif hale getircek kullandığım modül arx-34 ile atx-34 ama zaten simülasyonda başarabilmiş değilim. tek yönlü iletişimde sıkıntı yok ancak dediğim gibi çift yönlüde kesme programı mı çalışmıyor karşıdaki alıcı mı hiç vermiyor anlamadım
I&C Engineer in Bereket Enerji Çates Elektrik Üretim A.Ş.

skara1214

Kullandığınız kodu buraya yazarmısınız
Herkes ölür ama herkes gerçekten yaşamaz

eemuratozan

verici
#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)

char al,gel;
int alinan=0;
#int_rda
void geri_bildirim_kesmesi()
{
  disable_interrupts(int_rda);
     
     gel=getch();
     if(gel==0x56)
     {
       al=getch();
       if(al==0x01)
       {
         alinan=0x01;
       }
     }     
   
}
   
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);
   
   port_b_pullups(false);
   lcd_init();
   if(alinan==0x01)
   {
     lcd_gotoxy(1,1);
     printf(lcd_putc,"\f Led yandi...");
     delay_ms(100);
   }
   
  while(1)
  {
     
   if(input(pin_b0))
   {
     
    delay_ms(50);
    
    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);
    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;


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);
    
   set_tris_b(0x00);
   output_b(0x00);

   while(1)
   {
     gel=getch();
     if(gel==0x56)
     {
       al=getch();
       if(al==0x01)
       {
         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);
           
         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);
       }
     }
   }
     
   

}
I&C Engineer in Bereket Enerji Çates Elektrik Üretim A.Ş.

skara1214

hocam bir tanesini yaptım 2 tanede sıkıntı çıkıyor demiştiniz acaba 2  tane problemli  olanı paylaşırmısınız?
Herkes ölür ama herkes gerçekten yaşamaz

eemuratozan

hayır demek istedim ki sadece veriyi karşıya iletiyor bunda sıkıntı yok yani butona basınca karşıdaki led yanıp sönüyor ama karşıdan bana ledin yandığına dair bilgi gelmiyor kodlarda ya kesme programı çalışmıyor ya da ledi yaktıktan sonraki putc ler çalışmıyor
I&C Engineer in Bereket Enerji Çates Elektrik Üretim A.Ş.

serhat1990

bana kalırsa simulasyon ortamında alıcının tx ucunu virtual terminale gir. geri dönüs gönderiyormu ona bak eger geri dönüs gönderiyorsa sıkıntı vericide ayrıca verici içinde kesmeye girince herhangi bir led yak söndür bu sayede kesmede bir sıkıntı olup olmadıgını görürsün. Diğer bir şey , bu uygulamayı gercege dökmek istersen söyliyeyim benzer bir islemi bende yaptım veri gönderimlerinden sonra vericiyi pasif et gerilimini kes. Yoksa vericinin olusturdugu rf baskı alıcının duyargasını azaltıyor ve gercekte veri alamıyorsun . şimdiden söyliyeyim İyi çalışmalar.

serhat1990

Ayrıca data gönderimlerinde 4 5 kez aynı dayayı gönderiyorsun , onda bir sıkıntı yok ama alırken datayı bir kere alıp digerlerini es gecip direk ana veriyi almaya calısıyorsun.

eemuratozan

işte int_rda kesmesi içini de sonsuz döngü yapmalıyım o zaman demi yoksa sadece ilk baytı alır ve çıkar
I&C Engineer in Bereket Enerji Çates Elektrik Üretim A.Ş.

eemuratozan

evet şimdi oldu yani kesme çalışıo led yanıor ancak lcd de bişi görünmüyor lcd komutlarını da kesmeye yazıcam dicem ama önerilmio çünkü uzun süren işlemler bunlar kesme içine goto konabilir mi ?
I&C Engineer in Bereket Enerji Çates Elektrik Üretim A.Ş.

serhat1990

bence vericide ne gönderiyorsan direk onları bekle . Örneğin söyle gönderiyorsun diyelim.

putc(0x55);
putc(0x55);
putc(0x01;
putc(0x01);



alırkende su sekilde al.



if(getc()==0x55)
{
   if(getc()==0x55)
   { 
      if(getc()==0x01)
      {
        if(getc()==0x01)
        {
          LED=!LED;
        }
      }
   }
}


eemuratozan

şu anda ki tek sıkıntı veriyi alıyorum ya alinan=0x01 diyorum ondan sonra ana programda da bunu eğer alinan 0x01 e eşitse lcd de led yandı yaz diyorum kesmeden çıktıktan sonra ana programdaki program parçasını çalıştırmıyor .
I&C Engineer in Bereket Enerji Çates Elektrik Üretim A.Ş.

eemuratozan

hocam sorunu hallettim çalışıyor çok şükür ama endişem şu kesme içine printf ve lcd komutları yazmak ne derece sağlıklıdır ?
I&C Engineer in Bereket Enerji Çates Elektrik Üretim A.Ş.