rf parazit sorunu

Başlatan Emre MERMİ, 05 Temmuz 2015, 02:17:02

Emre MERMİ

merhaba hocalarım,

pic ile rf alıcı devre yaptım,  çözemediğim 2 sorunum var.

Birincisi pic sürekli rda kesmesine  giriyor kumandadan bilgi yollamasam bile ? parazitten mi etkileniyor ? hazır kumanda aldım,  kumandanın gönderdiği kodu bildeğim için kemeye girince işlemi yapmaya çalıştım ama sürekli kesmeye giriyor bunun nedeni ne olabilir ?

ikincisi ise aldığım hazır kumanda şu ;

http://www.robotistan.com/433-MHz-1-Kanal-RF-Elcik-Kumanda,PR-1792.html

bunun gönderdiği kodu arduinoya bir rf alıcı bağlayıp seri monitöre yollayarak yapmaya çalıştım ama yine bulamadım. gönderdiği bilginin baud ratesi nedir ne değildir onu bile bilmiyorum.

bu konudaki fikirleriniz nedir ?

#include <16F877a.h>

#FUSES NOPUT                    //No Power Up Timer
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection
#FUSES NOWRT                    //Program memory not write protected
#FUSES NOPROTECT                //Code not protected from reading

#use delay(crystal=20000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7)
int a=0, b=1;
const int digit[16]={0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7C, 0x07, 0x7F, 0x6F, 0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71};  //ortak katot display için port çıkışları
char c;

#INT_RDA
void  RDA_isr(void) 
{
output_b(digit[a]);
delay_ms(1000);
a=a+1;
}
}

void main()
{
   enable_interrupts(INT_RDA);
   enable_interrupts(GLOBAL);
   set_tris_b(0x00);
   output_b(0x00);
   set_tris_c(0xFF);
   set_tris_a(0x00);
   set_tris_d(0x00);
   output_high(pin_a0);
   output_high(pin_a1);
   output_high(pin_d2);
   output_high(pin_d3);
   output_high(pin_d4);
   output_high(pin_d5);
   while(TRUE)
   {

 
   }
}


kod böyle olunca sayı sürekli artıyor.

#include <16F877a.h>

#FUSES NOPUT                    //No Power Up Timer
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection
#FUSES NOWRT                    //Program memory not write protected
#FUSES NOPROTECT                //Code not protected from reading

#use delay(crystal=20000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7)
int a=0, b=1;
const int digit[16]={0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7C, 0x07, 0x7F, 0x6F, 0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71};  //ortak katot display için port çıkışları
char c;

#INT_RDA
void  RDA_isr(void) 
{
c=getch();
if(c=="asasa"){
output_b(digit[a]);
delay_ms(1000);
a=a+1;
}
}

void main()
{
   enable_interrupts(INT_RDA);
   enable_interrupts(GLOBAL);
   set_tris_b(0x00);
   output_b(0x00);
   set_tris_c(0xFF);
   set_tris_a(0x00);
   set_tris_d(0x00);
   output_high(pin_a0);
   output_high(pin_a1);
   output_high(pin_d2);
   output_high(pin_d3);
   output_high(pin_d4);
   output_high(pin_d5);
   while(TRUE)
   {

    
   }
}


böyle olunca da hiçbir işlem yapmıyor.

kodlarda kesme içinde işlem yapmamam lazım biliyorum sadece uğraşmaktan yorulduğum ve kodları sürekli değiştirdiğim  için kesme içinde bekleme koydum veya işlem yaptım.

baran123

"gönderdiği bilginin baud ratesi nedir ne değildir onu bile bilmiyorum."
Bunu bilmeden olmaz.

char c;
c=getch();
if(c=="asasa")


CCS c help de getch() return değeri 8 bit diyor yani string ile karşılaştıramazsınız.

Emre MERMİ

hocam tek karakter kullandım yine aynı.  nereden gidebilirim nasıl yapabilirim peki hocam ?

baran123

Tek karakterden ziyade "s" değil 's' olmalı.
Adım adım gitmek gerekli
C portunda RX ve TX bulunuyor.RX pini giriş olmalı TX çıkış olmalı.(sanırım @Tagli hocam demişti TX de giriş olabilir diye tam hatırlamıyorum)
Önce RX giriş TX çıkış ayarlayın.
Sonra kumandanın datasheetini - dökümanını bulun.Ne gönderiyor nasıl gönderiyor bunu anlayalım.
kodu basitleştirin.Elinizde var ise 628A kullanın teferruatı azdır.
Mesela kumanda 9600 8N1 de A göndersin.
//mesela
#INT_RDA
void RDA_ISR(void) 
{
c=getch();
if(c== 'A')
{
//biraz bekle ve led yak
}

Kumandanın üzerindeki yazı-kodlardan dökümanını bulmaya çalışabilirsiniz.

Emre MERMİ

#4
hocam ilk olarak yaptığım devrede 6 tane 7 segment, 2 sensör, 2 tane de display kullandığım için pin sayısı yetmiyor.

zaten " kullanınca derleme hatası veriyor ccs c.

döküman olarak hiçbirşey bulamadım hocam. yarın robotistanı arayıp soracağım ama pek umudum yok.  kumandanın üstünde de hiçbirşey yazmıyor.

baskı devrede de bir sorun yok gibi pinler doğru duruyor. iletim var. sorun yok.

kullandığım alıcı ise ;

http://cdn.sparkfun.com/datasheets/Wireless/General/RWS-371-6_433.92MHz_ASK_RF_Receiver_Module_Data_Sheet.pdf


mesaj birleştirme:: 05 Temmuz 2015, 03:49:25

anlamadığım bir soru ise pic neden sürekli kesmeye giriyor ?
bu arada kumandanın butonuna bastığımda ve elimi çektiğimde alıcı data bacağında gerilimde değişmeler oluyor (aynı şekilde bağlı olduğu pic rx bacağında da değişmeler oluyor). yani alıcıda da sorun yok gibi.

mesaj birleştirme:: 05 Temmuz 2015, 03:52:21

aklıma gelmişken yarın pazar robotistanı arayamam :D


Emre MERMİ

#6
@mehmet hocam yanıtınız için çok teşekkür teşekkür ederim, baskı devreyi yaptım tekrardan baskı yapmam beni biraz zorlayacak gibi. Üstündeki modülü kullanarak bir şey yapamam mı ?

mesaj birleştirme:: 05 Temmuz 2015, 07:17:37

kumandanın içinde söylediğiniz entegre var hocam kartın üzerinde de au 401 - 1 rev 2010.12.31 yazıyor.

mehmet

PT2262 ve PT2272 entegreleri işleri kolaylaştırmak
açısından kullanılır. El kumandasını kendiniz yaparsınız.
Buton, uC ve rf verici kullanmanız gereklidir.

Hazır el kumandası ve alıcısını kullanırsanız sadece
buton kullanıyormuşsunuz gibi işlem yaparsınız...
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr

Emre MERMİ

hocam bir konuda ete hocam şöyle birşey yazmış ;

Alıntı YapPT2262 ve PT2272 nin hem adres hemde data bacakları mevcuttur.
Adres bacakları genelde şifre ayarlamak için kullanılır. Data bacaklarıda bu amaçla kullanılabileceği gibi verici ve alıcı karşılklı ayarlanarak birden fazla alternatifle çıkış alınabilir. Önce birinci alternatife bakalım.
12 adet adres ve data bacağı mevcut olup şayet bir haberleşme yapıldığında her iki tarafta adres ve data bacakları aynı şekilde ayarlanmış ise PT2272 nin VT bacağından high çıkışı verilir. Şayet bacakların ayarı bir birini tutmuyor ise bu bacakta daima Low mevcuttur. Şimdi şifre uyumu var ise VT bacağı High vereceği için bu bacak direk bir pic bacağına bağlanabilir. Ancak dikkat edilmesi gereken nokta PT2272 nin de 5V ile beslenmesi ve böylece PT2272 çıkışından 5V seviyesinde bir sinyal alınmasıdır. Şayet farklı voltaj ile besleniyor ise gerilim bölücü ile VT çıkışı 5V seviyesine düşürülüp pice girilmelidir.
Bu şekilde pic ile haberleşmenin yada şifrenin doğruluğu test edilebilir.

bu gönderici şifresini çözmem mümkün mü ?  yani adres bacaklarına ne bağlı olduğunu bulabilirmiyim ?

baran123

Cesitli baudlarda deneyip gelen veriyi direk ekrana yaz.Ard arda ayni veriyi alabiliyorsan okey ama her seferinde yanlis geliyorsa baud degistirip dene :)

Emre MERMİ

Değerli hocalarım, bir tane usb ttl dönüştürücü aldım ve terminal ekranında gelen kodları inceledim. 7200 baud rate de kumandadan gelen verinin '8' olduğunu gördüm. Buraya kadar sorun yok. Gözüme çarpan başka birşey ise terminal ekranına kumandaya basmadığım zamanda bile çok fazla veri geliyor. Aralarından birçok da anlamlı karakter çıkıyor. Bu parazitler yüzünden pic sürekli kesmeye giriyor. Bu parazitlerden kurtulmamın bir yolu var mı ? Pic in sürekli kesmeye girmesi sanırım program akışında sorunlara neden olacak. Ben alıcı modülün bacağına pic e direk bağladım arada herhangi bir eleman kullanmama gerek var mı ? Teşekkürler

EGE

Alıntı yapılan: Emre MERMİ - 11 Temmuz 2015, 14:51:57
Değerli hocalarım, bir tane usb ttl dönüştürücü aldım ve terminal ekranında gelen kodları inceledim. 7200 baud rate de kumandadan gelen verinin '8' olduğunu gördüm. Buraya kadar sorun yok. Gözüme çarpan başka birşey ise terminal ekranına kumandaya basmadığım zamanda bile çok fazla veri geliyor. Aralarından birçok da anlamlı karakter çıkıyor. Bu parazitler yüzünden pic sürekli kesmeye giriyor. Bu parazitlerden kurtulmamın bir yolu var mı ? Pic in sürekli kesmeye girmesi sanırım program akışında sorunlara neden olacak. Ben alıcı modülün bacağına pic e direk bağladım arada herhangi bir eleman kullanmama gerek var mı ? Teşekkürler

Sağlıklı ve kısa yoldan  cevap almak  istiyorsan ,Şema-program-varsa kart resmini buraya  koy,

ismail kaya

CCS C'de manchester code denedim çalışıyor parazit'de almıyor.

TX
#include <12F683.h>
#device ADC=16
#include <string.h>
#include <stdlib.h>
#FUSES NOWDT                    //No Watch Dog Timer
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOMCLR

#use delay(internal=4000000)

#use rs232(baud=1200,parity=N,xmit=PIN_A5,bits=8,stream=PORT1)

#define LED PIN_A4
#define DELAY 1000
char durum="N";


#INT_EXT
void  EXT_isr(void) 
{
if(input(PIN_A2)) durum="A";
else durum="N";
}

void SEND_DATA(BYTE txbyte) 
{ 

    int i,j,b,me; 
    
    b = txbyte; 
    
    for (i=0; i<2; i++) { 
        me = 0;         // manchester encoded txbyte 
        for (j=0 ; j<4; j++) { 
            me >>=2; 
            if (bit_test(b,0) ) 
                me |= 0b01000000; // 1->0 
            else 
                me |= 0b10000000; // 0->1 
            b >>=1; 
        } 
        putc(me); 
        delay_ms(50); 
        
    } 
} 


main() { 

   enable_interrupts(INT_EXT);
   enable_interrupts(GLOBAL);

while(1) 
{ 

// sleep();

 
  if(input(PIN_A2))
  {
    output_high(LED);
    delay_ms(DELAY);
    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(0xF0);
  
 
SEND_DATA('H'); 
SEND_DATA(durum); 

       
putc(0xF0);
putc(0xF0);
    
output_low(LED);
delay_ms(DELAY);

  }
} 



}

RX
#include <16F628A.h>
#FUSES NOWDT                    //No Watch Dog Timer
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O

#use delay(internal=4000000)

#define LED PIN_B3
#define DELAY 1000

#use rs232(baud=1200, parity=N, xmit=pin_B2, rcv=pin_B1, bits=8)
#use rs232(baud=9600, parity=N, xmit=pin_B5, rcv=pin_B4, bits=8,stream=PORT1) 

char c,a,i,dec,dec1,dec2,enc,pattern,son,j; 
char nib[2]; // 
char x; 

BYTE DECODE_DATA()  //decode function for machester encoded data. This code is working fine. I checked it. 
{ 
enc = nib[0]; 
        
    if (enc == 0xf0)    //  start/end condition encountered 
        return 0xf0; 
        
    dec = 0;    
    for (i=0; i<4; i++) { 
    
        dec >>=1; 
        pattern = enc & 0b11;        
        if (pattern == 0b01)        // 1 
           bit_set(dec,3); 
        else if (pattern == 0b10) 
           bit_clear(dec,3);       // 0 
        else 
            return 0xff;            // illegal code 
            
        enc >>=2; 
        dec1=dec; 
    } 
enc = nib[1]; 
        
    if (enc == 0xf0)    //  start/end condition encountered 
        return 0xf0; 
        
          
    dec = 0;    
    for (i=0; i<4; i++) { 
    
        dec >>=1; 
        pattern = enc & 0b11;        
        if (pattern == 0b01)        // 1 
           bit_set(dec,3); 
        else if (pattern == 0b10) 
            bit_clear(dec,3);       // 0 
        else 
            return 0xff;            // illegal code 
            
        enc >>=2; 
        dec2=dec; 
    } 
dec2<<=4; 
son=dec1|dec2; 
x=0; 
dec=0; 
dec1=0; 
dec2=0; 
return (son); 
} 


#int_rda 
void komut_al() //interrupt for receiving manchester coded data 
{ 
disable_interrupts(int_rda); 


      c=getc();
      if  (x<2) 
      nib[x]=c; // assign low and high nibble of data 
      x=x+1; 

         
     
enable_interrupts(int_rda);  
} 

main() 
{ 
x=0; 
nib[0]=0; 
nib[1]=0; 
enable_interrupts(int_rda); 
enable_interrupts(GLOBAL); 

while(1) 
{ 

if  (x>1) 

{ 
x=0; 
a=DECODE_DATA(); 


 
      if  (a=='H') 
         { 
         fprintf(PORT1,"GELEN=%c\r\n",a);
         } 
      if  (a=='N') 
         { 
         fprintf(PORT1,"NORMAL-%c\r\n",a);
         } 
      
       if  (a=='A') 
         { 
         fprintf(PORT1,"ALARM-%c\r\n",a);
         }
          
        
enable_interrupts(int_rda); 
} 
 
          
} 
}

Emre MERMİ

#13
Hocam benim göndericim sabit olduğu için gönderici kodunu değiştiremiyorum. Nasıl yapabilirim ?

Alıntı yapılan: ismail kaya - 12 Temmuz 2015, 01:38:39
CCS C'de manchester code denedim çalışıyor parazit'de almıyor.

TX
#include <12F683.h>
#device ADC=16
#include <string.h>
#include <stdlib.h>
#FUSES NOWDT                    //No Watch Dog Timer
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOMCLR

#use delay(internal=4000000)

#use rs232(baud=1200,parity=N,xmit=PIN_A5,bits=8,stream=PORT1)

#define LED PIN_A4
#define DELAY 1000
char durum="N";


#INT_EXT
void  EXT_isr(void) 
{
if(input(PIN_A2)) durum="A";
else durum="N";
}

void SEND_DATA(BYTE txbyte) 
{ 

    int i,j,b,me; 
    
    b = txbyte; 
    
    for (i=0; i<2; i++) { 
        me = 0;         // manchester encoded txbyte 
        for (j=0 ; j<4; j++) { 
            me >>=2; 
            if (bit_test(b,0) ) 
                me |= 0b01000000; // 1->0 
            else 
                me |= 0b10000000; // 0->1 
            b >>=1; 
        } 
        putc(me); 
        delay_ms(50); 
        
    } 
} 


main() { 

   enable_interrupts(INT_EXT);
   enable_interrupts(GLOBAL);

while(1) 
{ 

// sleep();

 
  if(input(PIN_A2))
  {
    output_high(LED);
    delay_ms(DELAY);
    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(0xF0);
  
 
SEND_DATA('H'); 
SEND_DATA(durum); 

       
putc(0xF0);
putc(0xF0);
    
output_low(LED);
delay_ms(DELAY);

  }
} 



}

RX
#include <16F628A.h>
#FUSES NOWDT                    //No Watch Dog Timer
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O

#use delay(internal=4000000)

#define LED PIN_B3
#define DELAY 1000

#use rs232(baud=1200, parity=N, xmit=pin_B2, rcv=pin_B1, bits=8)
#use rs232(baud=9600, parity=N, xmit=pin_B5, rcv=pin_B4, bits=8,stream=PORT1) 

char c,a,i,dec,dec1,dec2,enc,pattern,son,j; 
char nib[2]; // 
char x; 

BYTE DECODE_DATA()  //decode function for machester encoded data. This code is working fine. I checked it. 
{ 
enc = nib[0]; 
        
    if (enc == 0xf0)    //  start/end condition encountered 
        return 0xf0; 
        
    dec = 0;    
    for (i=0; i<4; i++) { 
    
        dec >>=1; 
        pattern = enc & 0b11;        
        if (pattern == 0b01)        // 1 
           bit_set(dec,3); 
        else if (pattern == 0b10) 
           bit_clear(dec,3);       // 0 
        else 
            return 0xff;            // illegal code 
            
        enc >>=2; 
        dec1=dec; 
    } 
enc = nib[1]; 
        
    if (enc == 0xf0)    //  start/end condition encountered 
        return 0xf0; 
        
          
    dec = 0;    
    for (i=0; i<4; i++) { 
    
        dec >>=1; 
        pattern = enc & 0b11;        
        if (pattern == 0b01)        // 1 
           bit_set(dec,3); 
        else if (pattern == 0b10) 
            bit_clear(dec,3);       // 0 
        else 
            return 0xff;            // illegal code 
            
        enc >>=2; 
        dec2=dec; 
    } 
dec2<<=4; 
son=dec1|dec2; 
x=0; 
dec=0; 
dec1=0; 
dec2=0; 
return (son); 
} 


#int_rda 
void komut_al() //interrupt for receiving manchester coded data 
{ 
disable_interrupts(int_rda); 


      c=getc();
      if  (x<2) 
      nib[x]=c; // assign low and high nibble of data 
      x=x+1; 

         
     
enable_interrupts(int_rda);  
} 

main() 
{ 
x=0; 
nib[0]=0; 
nib[1]=0; 
enable_interrupts(int_rda); 
enable_interrupts(GLOBAL); 

while(1) 
{ 

if  (x>1) 

{ 
x=0; 
a=DECODE_DATA(); 


 
      if  (a=='H') 
         { 
         fprintf(PORT1,"GELEN=%c\r\n",a);
         } 
      if  (a=='N') 
         { 
         fprintf(PORT1,"NORMAL-%c\r\n",a);
         } 
      
       if  (a=='A') 
         { 
         fprintf(PORT1,"ALARM-%c\r\n",a);
         }
          
        
enable_interrupts(int_rda); 
} 
 
          
} 
}


mesaj birleştirme:: 12 Temmuz 2015, 01:47:18

Hocam şema ve program yollamamın sebebi devrede hiçbirşey kullanmamam, yani şuan sadece pic e gelen parazitin nedenini anlamk istiyorum. Aynısı usb ttl dönüştürücüde de aynısı oluyor. Rf nin data bacağını direk olarak rx pinine bağlıyorum.
Alıntı yapılan: EGE - 11 Temmuz 2015, 15:32:58
Sağlıklı ve kısa yoldan  cevap almak  istiyorsan ,Şema-program-varsa kart resmini buraya  koy,

ismail kaya

yolladığım kodda TX olan 12f683+DRA887TX 433mhz RF MODÜL(yada farketmez)+buton ile yapabilirsin. Ama hazır kumanda ile yapmak istiyorsan önce kumandanın yolladığı bilgiyi bilmen gerekir. Arduino ile http://www.princetronics.com/how-to-read-433-mhz-codes-w-arduino-433-mhz-receiver/ burada kumandanın ne bilgisi yolladığını çözüyor. Senin kumandanın ne bilgisi yolladığını bu şekilde öğrenirsen yardımcı oluruz.