Página 1 de 1

Dificuldade com RF + PIC18F4520

MensagemEnviado: 04 Nov 2011 17:38
por uilter
Olá pessoal.

Estou tentando fazer com que dois PIC's se comuniquem por RF.

Comprei dois módulos simples.
TWS-DS-3 e RWS-375-6. Ambos os dois de 433.92 MHz.

Datasheets
http://www.wenshing.com.tw/Data_Sheet/T ... _Sheet.pdf

http://www.wenshing.com.tw/Data_Sheet/R ... _Sheet.pdf

Fiz antenas de 17,5 cm cada uma.

A taxa de transferência que estou usando na USART é de 2400bps.
Tudo ocorre muito bem quando estou me comunicando por um fio qualquer na protoboard diretamente entre os PIC's.
Porém ao ligar os módulos RF aos PIC's não existem comunicação alguma.

O circuito é alimentado com 5V.
Já tentei taxas de transferências mais altas do que 2400bps e não tive sucesso.

Código do PIC que transmite.
Código: Selecionar todos
#include <p18F4520.h>
#include <usart.h>
#include <delays.h>
#include <stdio.h>
//#include "C:\Program Files (x86)\Microchip\mplabc18\v3.38\h\P18F4520.h"

// Frequencia do oscilador = 8MHz
// Ciclo de máquina  = 1/(Fosc/4) = 0,5us

//#pragma config OSC = XT           //Configura o oscilador a cristal
#pragma config OSC = HS
#pragma config WDT = OFF        //Desabilita o Watchdog Timer (WDT).
#pragma config PWRT = ON      //Habilita o Power-up Timer (PWRT).
#pragma config BOREN = ON      //Habilita Brown-out reset
#pragma config BORV = 1           //Tensão do BOR é 4,33V.
#pragma config PBADEN = OFF    //RB0,1,2,3 e 4 configurado como I/O digital.
#pragma config LVP = OFF          //Desabilita o Low Voltage Program.


#define    bEnviar    PORTDbits.RD2



void main()
{
   TRISB = 0x00;         
   TRISC = 0x0F;          
   TRISD = 0b00;          
   TRISE = 0x00;         
   
   
   OpenUSART(USART_TX_INT_OFF      //desabilita interrupção de transmissão
         & USART_RX_INT_OFF      //desabilita interrupção de recepção
         & USART_ASYNCH_MODE      //modo assíncrono
         & USART_EIGHT_BIT      //transmissão e recepção em 8 bits
         & USART_BRGH_LOW,      //Baud Rate em baixa velocidade
         51);               //SPBRG
   
   while(1)
   {
      if(bEnviar == 0)
      {
               
         putcUSART(0x55);         
         while (BusyUSART());     //Aguarda o final da transmissão
         Delay10KTCYx(50);
      }
   }
}


Código do PIC que recebe.
Código: Selecionar todos
#include<p18f4520.h>
#include<delays.h>
#include<usart.h>

//Cristal de 8Mhz

#pragma config OSC = HS
#pragma config WDT = OFF
#pragma config PWRT = ON
#pragma config BOREN = ON
#pragma config BORV = 1
#pragma config PBADEN = OFF
#pragma config LVP = OFF

unsigned char byte=0x00;

void main()
{
   ADCON1 = 0x0F;         //Desabilita todos os canais AD
   
   //TRISA = 0x00;
   TRISB = 0x00;
   TRISD = 0x00;
   PORTB = 0;
   PORTD = 0;
   TRISC = 0x80;
   //TRISE = 0x00;

   OpenUSART(USART_TX_INT_OFF         //desabilita interrupção de transmissão
             & USART_RX_INT_OFF   //desabilita interrupção de recepção
             & USART_ASYNCH_MODE   //modo assíncrono
             & USART_EIGHT_BIT      //transmissão e recepção em 8 bits
             & USART_BRGH_LOW,   //Baud Rate em baixa velocidade
             51);               //SPBRG
   
while(1)
{
   while(!DataRdyUSART());
   byte = getcUSART();
   
   PORTB = 0xff;
   Delay10KTCYx(0xff);
   PORTB = 0x00;
   
   if(byte==0x55)
   {
      PORTD = 255;
      Delay10KTCYx(0xff);
      byte=0x00;
      PORTD = 0;
   }
   else
   {
      PORTD = 0;
      Delay10KTCYx(0xff);
      byte=0x00;
   }
   
}
}




Obrigado e até mais!

MensagemEnviado: 04 Nov 2011 21:00
por tcpipchip
Poe a serial em INVERTED mode.
TCPIPCHIP

MensagemEnviado: 04 Nov 2011 21:03
por marcelo campos
Este tipo de rádio joga tudo quanto é sujeira (ruído branco) na uart rx do microcontrolador, se você monitorar o error bit, vai ver que dá erro direto, umas das coisas (num PIC) é que primeiro tem que resetar este bit antes de ler o rxreg,

Invariavelmente, terá que ter um protocolo mesmo que simples, pra sinalizar pelo menos o começo da transmissão. Eu costumo colocar 0x55 e 0xFF (depende do rádio mais de um de cada 55 / FF), explico:
- o 55 ajuda a balancear o demodulador (veja data sheet dos radiometrix) em AM não sei se precisa
- o FF sempre acaba gerando um stop bit, assim a uart fica parada esperando o próximo bit e consegue-se sincronizar

qualquer dúvida poste aí

abraço e boa sorte,

MArcelo Campos

MensagemEnviado: 04 Nov 2011 21:04
por marcelo campos
tcpipchip escreveu:Poe a serial em INVERTED mode.
TCPIPCHIP

gostei desta também, é uma possbilidade

MensagemEnviado: 04 Nov 2011 21:23
por uilter
tcpipchip escreveu:Poe a serial em INVERTED mode.
TCPIPCHIP


Como eu habilito esse "mode inverted" nesse PIC? sabe me dizer?
Eu não conheço nada sobre esse modo.

Obrigado!

MensagemEnviado: 04 Nov 2011 21:29
por uilter
marcelo campos escreveu:Este tipo de rádio joga tudo quanto é sujeira (ruído branco) na uart rx do microcontrolador, se você monitorar o error bit, vai ver que dá erro direto, umas das coisas (num PIC) é que primeiro tem que resetar este bit antes de ler o rxreg,

Invariavelmente, terá que ter um protocolo mesmo que simples, pra sinalizar pelo menos o começo da transmissão. Eu costumo colocar 0x55 e 0xFF (depende do rádio mais de um de cada 55 / FF), explico:
- o 55 ajuda a balancear o demodulador (veja data sheet dos radiometrix) em AM não sei se precisa
- o FF sempre acaba gerando um stop bit, assim a uart fica parada esperando o próximo bit e consegue-se sincronizar

qualquer dúvida poste aí

abraço e boa sorte,

MArcelo Campos


Olá Marcelo,

Eu vou fazer um protocolo de 6 bytes só que não tinha pensado nessa possibilidade.

Vou realizar uns testes com 3 bytes então pra ver se consigo.
0x55, byte do dado, 0xFF

Assim que tiver resultados posto aqui.

MensagemEnviado: 06 Nov 2011 12:00
por Andre_Cruz
uilter,

Véio usei uma certa vez um desses radinhos, pra ele enviar corretamente precisei sempre enviar algum dado, pois quando eu parava de enviar e precisava enviar algum dado ele não funcionava direito.
Tem um tópico do fabim falando programa para controle remoto que ele sugere um resistor ñ me lembro em qual pino ele vai mas ele ajuda a diminuir o ruído.
Acredito que jaja o próprio de a dica.

Abraço

MensagemEnviado: 06 Nov 2011 14:41
por hertzing
Fiz como Projeto de final de curso, um carrinha de controle remoto.
Utilizei dois PIC e uns módulos parecidos com esses, mas da Telecontrolli.

Estais trabalhando com qual tensão no módulo emissor?
Comparasse no osciloscópio o TX com o RX?

MensagemEnviado: 06 Nov 2011 14:48
por hertzing
Usei em meu projeto a taxa de transmissão em 1200Bps.

Uma dica, nos módulos que trabelhei, percebi que os primeiros Bits transmitidos chegavam falhados. Mas após de alguns enviados a comunicação ficava estável.
Se tiveres o mesmo problema, faça um protocolo com checksum. Assim sempre quando iniciares uma comunicação envie um "lixo" antes do dado.

Abraço

MensagemEnviado: 07 Nov 2011 14:10
por uilter
Andre_Cruz escreveu:uilter,

Véio usei uma certa vez um desses radinhos, pra ele enviar corretamente precisei sempre enviar algum dado, pois quando eu parava de enviar e precisava enviar algum dado ele não funcionava direito.
Tem um tópico do fabim falando programa para controle remoto que ele sugere um resistor ñ me lembro em qual pino ele vai mas ele ajuda a diminuir o ruído.
Acredito que jaja o próprio de a dica.

Abraço


Obrigado pela dica. Vou procurar esse tópico do Fabim.

Vlw
o/

MensagemEnviado: 07 Nov 2011 14:24
por uilter
hertzing escreveu:Fiz como Projeto de final de curso, um carrinha de controle remoto.
Utilizei dois PIC e uns módulos parecidos com esses, mas da Telecontrolli.

Estais trabalhando com qual tensão no módulo emissor?
Comparasse no osciloscópio o TX com o RX?



O PIC que esta enviando os dados esta alimentado com 3.3v e oq esta recebendo esta alimentado com 5V.