Ir ao conteúdo

Comunicação serial RF de PIC 18f4550 a PIC 18f4559


horusess

Posts recomendados

Postado

Bom dia pessoal !

Estou fazendo um projeto na faculdade para controlar um robô a distância.

Consiste em uma placa com um PIC 18f4550 que recebe o comando de um controle de supernintendo, e transfere do seu pino TX pro módulo transmissor RT4 433.92Mhz o sinal serial.

Já na placa receptora que fica no robô, um módulo receptor RR3 433.92Mhz recebe o dado transmitido em RF e manda pro pino RX do segundo PIC 18f4550 e então este dá os comandos de ação.

Estou usando o mikroC PRO e nele só tem a biblioteca UART, então estou usando ela pra mandar e receber os sinais seriais.

O problema é que: quando eu faço o teste sem os modulos RF, ou seja, conecto o pino TX do primeiro PIC diretamente ao pino RX do segundo e faço a transmissão serial, a comunicação fica perfeita, com 100% de acerto, mas quando eu adiciono os módulos RT4 e RR3 e então uso a comunicação por RF a taxa de acerto é muito baixa.

Os módulos estão funcionando perfeitamente, já foram testados e substituídos inclusive.

Abaixo estão meus códigos simplificados para apenas teste da comunicação:

Código TRANSMISSOR:



void main(){ // CÓDIGO PARA PIC TRANSMISSOR, QUE TEM O CONTROLE.
int valor=200,i=0;
unsigned char bytetransmitido = 0x1E;
ADCON1 = 0b00001111;
trisd = 2;
trisb = 0; // DATA = PORTD.F1 (entrada)
trisd.f3 = 0; // STROBE = PORTD.F3
trisd.f2 = 0; // CLOCK = PORTD.F2
portb = 0;
Uart1_Init(600);
while (1){
valor = getButtons(); // getButtons() é uma função para interpretar o que foi enviado pelo controle, ocultei por nao ser importante agora
switch (valor){
case 10:
portb.f3 = 1; // Isso é apenas pra piscar um LED para teste
delay_ms(100);
portb.f3 = 0;
delay_ms(30);
portb.f3 = 1;
delay_ms(200);
portb.f3 = 0;
break;
case 20:
portb.f3 = 1;
delay_ms(100); // Isso é apenas pra piscar um LED para teste
portb.f3 = 0;
delay_ms(50);
break;
}
bytetransmitido = valor;
UART1_Write(bytetransmitido);
}
}

Código RECEPTOR:


void main() {
unsigned char recebeserial = 0x1E;
ADCON1 = 0b00001111;
trisa = 0;
trisb = 0;
trisc = 0;
trisd = 0;
porta = 0;
portb = 0;
portc = 0;
portd = 0;
UART1_Init(600);
while(1){
if (UART1_Data_Ready() == 1) {
recebeserial = UART1_Read();
}
switch(recebeserial){
case 10:
porta.f1 = 1; // Isso é apenas pra piscar um LED para teste
delay_ms(100);
porta.f1 = 0;
delay_ms(30);
porta.f1 = 1;
delay_ms(200);
porta.f1 = 0;
delay_ms(30);
break;
case 20:
porta.f1 = 1; // Isso é apenas pra piscar um LED para teste
delay_ms(50);
porta.f1 = 0;
delay_ms(50);
break;
}
recebeserial = 0;
}
}

Eu vi em uma monografia que foi usado USART para comunicar, ao invés de UART, seria esse o problema?

Gostaria de completar dizendo também que a comunicação RF acerta alguma vezes, mas quando eu aproximo minha mão de qualquer antena, a taxa de acerto sobe, então está sofrendo algum tipo de interferência.

Aceito qualquer sugestão, estou travado nesse problema a vários dias...

Muito Obrigado.

PS: Houve erro no título, os PICs são iguais, ambos são 18f4550

Postado

voce terá que implementar um protocolo de correção e/ou erro.

Os módulos RF vão considerar qualquer 'ruido',então voce deve fazer um protocolo para definir o que é válido e o que não será.

Ja pensou na possibilidade de usar um protocolo IR em vez de serial?

Os protocolos de IR testam a duração do primeiro pulso antes de continuar a decodificação.

Postado
voce terá que implementar um protocolo de correção e/ou erro.

Os módulos RF vão considerar qualquer 'ruido',então voce deve fazer um protocolo para definir o que é válido e o que não será.

Ja pensou na possibilidade de usar um protocolo IR em vez de serial?

Os protocolos de IR testam a duração do primeiro pulso antes de continuar a decodificação.

Obrigado pela resposta vtrx,

Bom, sou novo em eletrônica, entendi o que voce quis dizer mas não tenho ideia de como fazer, voce poderia dar um exemplo, algo do tipo por favor?

Existe a possibilidade de incorporar algum protocolo apenas por software, ou sempre vou precisar de mais CIs no circuito?

Postado

voce vai implementar por software,mas eu não tenho experiencia em módulos RF.

Se eu fosse fazer um protocolo de erro ou utilizasse um protocolo IR,talvez não conseguiria te explicar,ja que não tem experiencia.

Aguarde alguem que tenha passado pelo mesmo problema e conseguiu uma solução.

Postado
voce vai implementar por software,mas eu não tenho experiencia em módulos RF.

Se eu fosse fazer um protocolo de erro ou utilizasse um protocolo IR,talvez não conseguiria te explicar,ja que não tem experiencia.

Aguarde alguem que tenha passado pelo mesmo problema e conseguiu uma solução.

Esse protocolo IR se refere a que? Não consegui informações sobre...

E sobre o fato de eu estar usando UART ao invés de USART, você acha que não faz diferença mesmo?

De todo modo estou a espera de alguém que tenha experiencia nesse problema.

Muito obrigado novamente, vtrx.

  • 3 semanas depois...

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!