aynı pic üzerinde alıcı-verici kullanma

Başlatan mustan79, 19 Ocak 2015, 23:27:52

mustan79

selam arkadaşlar

ben aynı pic üzerinde hem alıcı ve hemde verici modülü kullanmak istiyorum. bunları port ve transistör ile kontrol etmek istedim. ekte devre resmini koydum. yazılımları aşağıdadır. transsistör olarak bc548 seçtim. (elimde ondan vardı). port high iken ilgili transistöre bağlı modül pasif, port low iken aktif şeklinde düşündüm. verici kısmı çalıştı fakat alıcı kısmı çalışmıyor. hatalarımı söyleyebilirseniz sevinirim. teşekkürler.



CCS C de ALICI KOD.
#include <16F877a.h>
//#device ADC=10
#fuses xt
#fuses nowrt,nowdt,nobrownout,nolvp,nocpd,nodebug,noprotect,noput
#use delay(clock=4000000)
#use rs232(baud=600,parity=N,xmit=pin_c6,rcv=pin_c7,stop=1, parity=N, stream=sensor)
#use rs232 (baud=9600,rcv=pin_d4, xmit=pin_d5, stop=1, parity=N, stream=pc )      //9600 baud rs232 ye giden gelen

char e, islem;

void uyan(void){      // RF cihzını uyandırmak için
    fputc(0x55,sensor);fputc(0x55,sensor);fputc(0x55,sensor);fputc(0x55,sensor);fputc(0x55,sensor);
    fputc(0x00,sensor);fputc(0x00,sensor);fputc(0x00,sensor);fputc(0x00,sensor);fputc(0x00,sensor);
    fputc(0xff,sensor);fputc(0xff,sensor);fputc(0xff,sensor);fputc(0xff,sensor);fputc(0xff,sensor);
    fputc('A',sensor);
  return;
}

#int_rda   // RX ucuna veri gelince meydane gelen kesme
void serihaberlesme_kesmesi ()
{
   disable_interrupts(int_rda); // int_rda kesmesini pasif yap

if(fgetc(sensor)=='x')
{
output_high(pin_d0);
e=fgetc(sensor);
if(e=='z')
{
fprintf(pc, "\r\n gelen = %c  ", e);
output_toggle(pin_d0);
output_toggle(pin_d3);
}
}
}

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(0x00);
output_b(0x00);
output_high(pin_d0);
output_high(pin_c2);
output_high(pin_c3);

fprintf(pc, "\r\n hem alıcı hem verici deneme 4");

while(1)
{
  output_low(pin_c3);
   enable_interrupts(int_rda);
   enable_interrupts(GLOBAL);

  if (input(pin_a2))
      {
      output_high(pin_c3);
      delay_ms(10);
      output_low(pin_c2);
      output_toggle(pin_d2);
      delay_ms(10);
       while (input(pin_a2));
          delay_ms(100);
          uyan();
          putc('B', sensor);
          delay_ms(100);
          output_high(pin_c2);
     }   
  }
}

CCS C de VERİCİ KOD
#include <16F877a.h>
#fuses xt
#fuses nowrt,nowdt,nobrownout,nolvp,nocpd,nodebug,noprotect,noput
#use delay(clock=4000000)
#use rs232(baud=600,parity=N,xmit=pin_c6,rcv=pin_c7,stop=1, parity=N)
#define buton pin_a2    //buton ifadesi pin_a2 ifadesine eşitleniyor

char mes, sa='z', e;
char pre='x';

void uyan(){      // RF cihzını uyandırmak için
    putc(0x55);putc(0x55);putc(0x55);putc(0x55);putc(0x55);
    putc(0x00);putc(0x00);putc(0x00);putc(0x00);putc(0x00);
    putc(0xff);putc(0xff);putc(0xff);putc(0xff);putc(0xff);
    putc(pre);
    return;
}

#int_rda   // RX ucuna veri gelince meydane gelen kesme
void serihaberlesme_kesmesi ()
{
   disable_interrupts(int_rda); // int_rda kesmesini pasif yap

if(getch()=='A')
{
output_high(pin_d1);
e=getch();
if(e=='B')
{
output_toggle(pin_d0);
output_toggle(pin_d1);
}
}
}

void main()
{
set_tris_b(0x00);
output_b(0x00);
output_high(pin_d0);
output_low(pin_c2);
output_low(pin_c3);

while(true)
   {
   output_high(pin_c3);
   enable_interrupts(int_rda);
   enable_interrupts(GLOBAL);
   
   if (input(pin_a2))
      {
      output_low(pin_c3);
      delay_ms(10);
      output_high(pin_c2);
      output_toggle(pin_d2);
      delay_ms(10);
      while (input(pin_a2));
      delay_ms(100);
      uyan();
      putc(sa);
      delay_ms(50);
      output_low(pin_c2);
     }
   }
}

Salih

Öncelikle modüllerin Vcc uçlarını direk Vcc'ye bağla.
Gnd uçlarını da transistör üzerinden Gnd'ye bağla.
Bu şekilde denermisin.

hasankara

4k7 üzerinden akım çok sınırlanmış olur. bu şekilde pic den high verince ilgili modül deaktif yapmaya çalışmışsın anladığım kadarı ile. salih in dediği gibi bağlantı yaptığında high ile modülü aktif etmiş olursun yazılımda ilgili alanları değiştirmen gerekir. yada pic in kontrol çıkışlarını değillemen gerekir.

mustan79

@salih hocam dediğiniz gibi donanım ve yazılım değişikliklerini yaptım. sonuç değişmedi.
@hasankara hocam 4.7k yerine 220 ohm denedim yine alıcı modül çalışmadı.

hasankara

pekala koda hiç bakmadan şöyle bir kaç soru sorayım. verici kısmının çalıştığını nasıl anladın? denetleyiciyi yalnızca alıcı olarak kullanmayı denedin mi? yani besleme uçlarını doğrudan besleyip alıcı modülü çalıştırdın mı?

mustan79

@hasankara hocam evet ilk denememde tek tek denedim transistör olmadan uçları doğrudan bağlayarak sadece alıcı ve verici olarak çalışıyor. sonra sadece vericiyi transistör ile yol verip denedim iletim yine var çalışıyor. alıcıyı denediğimde ise çalışmadı. alıcı modülü transistörle çalıştıramadığım için aynı anda pic üzerinde 2 modülü birden de deneyemedim. anten konusunda antenler ayrı ayrı dizayn olacak.

yilmaz_kk

#use rs232(baud=600,parity=N,xmit=pin_c6,rcv=pin_c7,stop=1, parity=N, stream=sensor)
#use rs232 (baud=9600,rcv=pin_d4, xmit=pin_d5, stop=1, parity=N, stream=pc )      //9600 baud rs232 ye giden gelen


İki defa yazılmış. Klavye hatası mıdır? Alıcı kısmında burası düzeltilmeli.

mustan79

#7
@yilmaz_kk orada bir yanlışlık yok 600 baud ile vericiden bilgi alıyor. 9600 baud ile rs232 vasıtasıyla pc'ye bilgi yolluyor.
komutlara bakarsanız farklı olduklarını görebilirsiniz
fputc('A',sensor);
fprintf(pc, "\r\n.... ")
gibi

RaMu

Ben aynı picde alıcı verici çalıştırmıştım ama
kodu asm ile yazmıştım,
faydası olacaksa tüm dosyaları linkde var;
http://www.mediafire.com/download/4sjyadjkf89r2vo/28_RF_TUBITAKveFOTO.rar
devrenin nasıl çalıştığı ve amacı +
aşamalı asm programlar + kodlar açıklamalı +
uart protokolünün ve 16f877 deki registerlarının açıklamalı anlatımı +
isis şema + ares pcb + hazır devrenin fotoları.

Şifre: ucanel
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

mustan79

@ramu dosyalar için teşekkürler.
bir sorum olacaktı asm bilmiyorum ama devreler rx-tx olarak mı çalışıyor. devrende modüllerin kontrolünü sadece port ve kodla mı yaptın ayrıca anten kısmını göremedim.

RaMu

Anten yok,
kapalı ortamda (üniversite derslikde devre koridorda diğer devre) 20-30 metre haberleşti.

Herbir devre hem alıcı hem verici,
aynı anda hem alıcı hemde verici değiller tabiki,
veri gönderecekken verici oluyor,
geri kalanda zamanda alıcı olarak çalışıyorlar.

Devre şemadaki gibi,
zaten hazır halide mevcut,
modülleri ekstra transistör vs. kullanmadan kontrol ettim,
pic in uart modülünü veri alıp verirken kullandım,
yani;
Alıntı yapılan: mustan79 - 23 Ocak 2015, 16:47:55
devrende modüllerin kontrolünü sadece port ve kodla mı yaptın 
sormak istediğini doğru anladıysam, evet.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

mustan79

merhaba arkadaşlar alıcı problemini çözdüm. artık transistör ile kontrol edebiliyorum. çözüm alıcı modülün her iki Vcc ucunuda bağlamamla oldu. ben tekini kullanıyordum. şuan ki sorunum, ana döngüde başlangıçta int_rda kesmesi ile data alıyorum fakat buton kontrollü verici ile data yolladıktan sonra int_rda kesmesi bir daha çalışmıyor. algoritma alıcı hep aktif fakat verici aktif olacağı zaman pasif olacak. bunuda transistör ve port kontrolü ile yapıyorum. yukarda devresi var. bu konuda yardımcı olabilirmisiniz.

while(1)
{
  output_low(pin_c3);
   enable_interrupts(int_rda);
   enable_interrupts(GLOBAL);

  if (input(pin_a2))
      {
      output_high(pin_c3);
      delay_ms(10);
      output_low(pin_c2);
      output_toggle(pin_d2);
        while (input(pin_a2));
          uyan();
          putc('B', sensor);
          delay_ms(100);
          output_high(pin_c2);
     }   

hasankara

İlk aklıma gelen şey, gelen veriyi okumadan tekrar bir tane daha gelip taşma hatası oluşması. Bu durumda tekrar alır hale gelmesi için modülü yeniden kurman gerekebilir. evet, şimdi koda bakınca gördüm ki printf kodunu interrupt içinde kullanmışsın. yorucu bir işlem olan printf işlerken üst üste veri geliyor olabilir.

çözüm önerisi: bir tane global değişken tanımla bu senin özel bayrağın olsun bunu interrupt içindeki printf komutu yerine yazıp içine 1 yükle. ana döngü içinde bu bayrağı kontrol et. 1 ise önce bayrağı 0 layıp printf işlemini burada yaptır.

mustan79

devrede ufak değişiklik yaptım. rf modülleri direk pic16f877a nın portlarından kontrol etmeyi deniyorum. bunda da şöyle sıkıntı oluştu. devreleri aktif ettiğimde ilk kimin butonuna basarsam veriyi yolluyor. fakat sonra diğer pic butonuna bastığımda çalışmıyor. yazılımları aynı önce ikisinde dinlemede fakat butona bastığım an dinleme portu pasif oluyor iletim aktif oluyor. butona basma işi bittikten sonra iletim pasif ve dinleme modu aktif oluyor. kodların son hali aşağıdadır. yardımlarınızı bekliyorum.

alıcı kod:
#include <16F877a.h>
#fuses xt
#fuses nowrt,nowdt,nobrownout,nolvp,nocpd,nodebug,noprotect,noput
#use delay(clock=4000000)
#use rs232(baud=600,parity=N,xmit=pin_c6,rcv=pin_c7,stop=1, parity=N, stream=sensor)
#use rs232 (baud=9600,rcv=pin_d4, xmit=pin_d5, stop=1, parity=N, stream=pc )      //9600 baud rs232 ye giden gelen

char e;

void uyan(void){      // RF cihzını uyandırmak için
    fputc(0x55,sensor);fputc(0x55,sensor);fputc(0x55,sensor);fputc(0x55,sensor);fputc(0x55,sensor);
    fputc(0x00,sensor);fputc(0x00,sensor);fputc(0x00,sensor);fputc(0x00,sensor);fputc(0x00,sensor);
    fputc(0xff,sensor);fputc(0xff,sensor);fputc(0xff,sensor);fputc(0xff,sensor);fputc(0xff,sensor);
    fputc('A',sensor);
  return;
}

#int_rda   // RX ucuna veri gelince meydane gelen kesme
void serihaberlesme_kesmesi ()
{
   disable_interrupts(int_rda); // int_rda kesmesini pasif yap
if(fgetc(sensor)=='x')
      {
      output_high(pin_d3);
      e=fgetc(sensor);
      if(e=='z')
         {
            //fprintf(pc, "\r\n gelen = %c  ", e);
            output_toggle(pin_d0);
            output_toggle(pin_d3);
         }
      }
}

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);           
   enable_interrupts(int_rda);
   enable_interrupts(GLOBAL);

output_high(pin_d0);
output_low(pin_c2);   // dinleme pasif yapıldı
output_low(pin_c3);   //iletim pasif yapıldı

fprintf(pc, "\r\n hem alici hem verici deneme 4");

while(1)
{
  output_high(pin_c2);   //dinleme aktif yapıldı
  enable_interrupts(int_rda);   //gelen giden varmı

  if (input(pin_a2))
      {
      output_low(pin_c2);  //dinleme pasif
      delay_ms(10);
      output_high(pin_c3);   //iletim aktif
      output_toggle(pin_d2);
      //delay_ms(10);
       while (input(pin_a2));
       uyan();
       putc('B', sensor);
       delay_ms(100);
       output_low(pin_c3);    //iletim pasif
       output_high(pin_c2);   //dinleme aktif
      }   
   }
}

verici kod:
#include <16F877a.h>
#fuses xt
#fuses nowrt,nowdt,nobrownout,nolvp,nocpd,nodebug,noprotect,noput
#use delay(clock=4000000)
#use rs232(baud=600,parity=N,xmit=pin_c6,rcv=pin_c7,stop=1, parity=N)
#define buton pin_a2    //buton ifadesi pin_a2 ifadesine eşitleniyor

char mes, sa='z', e;
char pre='x';

void uyan(){      // RF cihzını uyandırmak için
    putc(0x55);putc(0x55);putc(0x55);putc(0x55);putc(0x55);
    putc(0x00);putc(0x00);putc(0x00);putc(0x00);putc(0x00);
    putc(0xff);putc(0xff);putc(0xff);putc(0xff);putc(0xff);
    putc(pre);
    return;
}

#int_rda   // RX ucuna veri gelince meydane gelen kesme
void serihaberlesme_kesmesi ()
{
   disable_interrupts(int_rda); // int_rda kesmesini pasif yap
   if(getch()=='A')
   {
      output_high(pin_d1);
      e=getch();
      if(e=='B')
      {
         output_toggle(pin_d0);
         output_toggle(pin_d1);
      }
   }
}

void main()
{
enable_interrupts(int_rda);
enable_interrupts(GLOBAL);
set_tris_b(0x00);
output_b(0x00);
output_high(pin_d0);
output_low(pin_c2);   // dinleme pasif yapıldı
output_low(pin_c3);   // iletim pasif yapıldı

while(true)
   {
   output_high(pin_c2);   // dinleme aktif yapıldı
   enable_interrupts(int_rda);
   
   if (input(pin_a2))
      {
      output_low(pin_c2);   // dinleme pasif yapıldı
      delay_ms(10);
      output_high(pin_c3);  //iletim aktif yapıldı
      output_toggle(pin_d2);
      while (input(pin_a2));
      uyan();
      putc(sa);
      delay_ms(100);
      output_low(pin_c3);   // iletim pasif yapıldı
      output_high(pin_c2);  // dinleme aktif yapıldı   
     }
  }
}

Recep METE

Buda benim yaptığım hem alıcı hem verici.Çok güzel sorunsuz çalışıyor belki işine yarar.

Verici kodlar:
#include <16f877a.h>
#fuses XT,NOWDT,NOWRT,NOCPD,NOPUT,NOPROTECT,NODEBUG,NOLVP,NOBROWNOUT
#use delay(clock=4M)
#use rs232(baud=300,xmit=pin_c6,rcv=pin_c7,parity=N,stop=1,bits=8)
int8 veri=0,i;



#int_RDA
void  RDA_isr() 
{
disable_interrupts(int_rda);

veri=getch();
if(veri=='1') 
   {
   output_high(pin_b0);
   delay_ms(50);
   output_low(pin_b0);
   delay_ms(50);
   
   }
   
   
   if(veri=='2')
   {
   output_high(pin_b1);
   delay_ms(50);
   output_low(pin_b1);
   delay_ms(50);
   }
   
    if(veri=='3')
    {
    output_high(pin_b2);
   delay_ms(50);
   output_low(pin_b2);
   delay_ms(50);
    }
}




void rf_uyan()
{
putc(0b01010101);
}
void main()
{

   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_CLOCK_DIV_2);
   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(0x00);
output_b(0x00);


  while(true)
  {
 
 
 enable_interrupts(INT_RDA);
 
 
 if(input(pin_a0))
 {delay_ms(5);while(input(pin_a0));
 rf_uyan();
  putc('4');
 }
  if(input(pin_a1))
  {delay_ms(5);while(input(pin_a1));
  rf_uyan();
  putc('5');
  }
  
  if(input(pin_a2))
  {delay_ms(5);while(input(pin_a2));
  rf_uyan();
  putc('6');
  }
  }

}


Alıcı kodları:
#include <16f877a.h>
#fuses XT,NOWDT,NOWRT,NOCPD,NOPUT,NOPROTECT,NODEBUG,NOLVP,NOBROWNOUT
#use delay(clock=4M)
#use rs232(baud=300,xmit=pin_c6,rcv=pin_c7,parity=N,stop=1)

int8 veri=0,i;



#int_RDA
void  RDA_isr() 
{
disable_interrupts(int_rda);

veri=getch();
if(veri=='4') 
   {
   output_high(pin_b0);
   delay_ms(50);
   output_low(pin_b0);
   delay_ms(50);
   
   }
   
   
   if(veri=='5')
   {
   output_high(pin_b1);
   delay_ms(50);
   output_low(pin_b1);
   delay_ms(50);
   }
   
    if(veri=='6')
    {
    output_high(pin_b2);
   delay_ms(50);
   output_low(pin_b2);
   delay_ms(50);
    }
}

void rf_uyan()
{
putc(0b01010101);
}





void main()
{

   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_CLOCK_DIV_2);
   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(0x00);
   output_b(0x00);
  
   
   while(true)
   {
    enable_interrupts(INT_RDA);
   
   
 if(input(pin_a0))
 {delay_ms(5);while(input(pin_a0));
 rf_uyan();
  putc('1');
 }
  if(input(pin_a1))
  {delay_ms(5);while(input(pin_a1));
  rf_uyan();
  putc('2');
  }
  
  if(input(pin_a2))
  {delay_ms(5);while(input(pin_a2));
  rf_uyan();
  putc('3');
  }
  }
  
}


Buda isis çalışma videosu:
http://youtu.be/4j4Hs6L12ac
printf(lcd_putc,"\f  Ne kadar okursan oku, bilgine, yakışır şekilde davranmıyorsan cahilsin demektir.  \n   semfero");d