Ir ao conteúdo
  • Cadastre-se
rtmc

RESOLVIDO Problemas com módulo RF

Recommended Posts

Olá, estou tendo problemas para pôr em funcionamento uma comunicação por um módulo RF. Consegui fazer funcionar no mundo perfeito do simulador do ISIS, mas não consegui replicar para o circuito real.

 

Estou usando o modelo pic12f675. Este modelo não possui UART, o que acredito complicar um pouco as coisas. Minha tentativa foi implementar o que o usuário Chaurais explica nesse tópico (http://forum.clubedohardware.com.br/topic/369926-rr3-433mhz-pic-16f628/) sobre o HT6P20B. Fiz algumas modificações de bits, mas a ideia é a mesma.

 

Tentei uma outra abordagem, conectando a saída do receptor no conversor A/D, na tentativa de diferenciar melhor o que é high/low. Mas não obtive muito sucesso.

 

Alguém teria uma luz? Obrigado!

 

Segue os códigos utilizados, ambos compilados com o XC8. ("xc8 --chip=12f675 arquivo.c"). Também anexei o schematic do ISIS.

 

receptor:

#include <xc.h>#pragma config FOSC = INTRCIO#pragma config WDTE = OFF#pragma config PWRTE = ON#pragma config MCLRE = OFF#pragma config BOREN = ON#pragma config CP = OFF#pragma config CPD = OFF#define _XTAL_FREQ 4000000int rbit(){	int b;	__delay_us(500);	__delay_us(249);	b = GP1;	__delay_us(250);	__delay_us(500);	return (?1:0;}int rf_in(){	int addr = 0, data = 0, anticode = 0;	int count = 0;	while(!GP1){		count++;		__delay_us(100);		if(count > 138)			return 0;	}	if(count < 92)		return 2;	__delay_us(500);	for(int i = 0; i < 16; i++)		addr |= rbit() << i;	for(int i = 0; i < 4; i++)		data |= rbit() << i;	//for(int i = 0; i < 4; i++)	//	anticode |= rbit() << i;	if(addr == 0xC66C)		return data;	else		return 1;}int main(){	CMCON  = 0x07;	VRCON  = 0x00;	TRISIO = 0b00010010;	GPIO   = 0x00;	ADCON0 = 0x0;	ANSEL = 0x0;	int val;	while(1){		val = rf_in();		if(val == 9){			GP2 = 1;			__delay_ms(1000);		}		GP2 = 0;	}	return 0;}

transmissor:

#include <xc.h>#pragma config FOSC = INTRCIO#pragma config WDTE = OFF#pragma config PWRTE = ON#pragma config MCLRE = OFF#pragma config BOREN = ON#pragma config CP = OFF#pragma config CPD = OFF#define _XTAL_FREQ 4000000int avgrd(int channel){	int avg = 0;	ADCON0 = (ADCON0 & ~(3<<2)) | ((channel&3)<<2);	for(int i = 0; i < 8; i++){		ADCON0 = ADCON0 | 0x2;		while(ADCON0 & 0x2);		avg += (ADRESH<<2) | (ADRESL>>6);	}	avg = avg >> 3;	return avg;}void pilot(){	for(int i = 0; i < 23; i++){		GP0 = 0;		__delay_us(500);	}	GP0 = 1;	__delay_us(500);}void sbit(int {	GP0 = 0;	__delay_us(500);	GP0 = b;	__delay_us(500);	GP0 = 1;	__delay_us(500);}void anticode(){	GP0 = 0;	__delay_us(500);	GP0 = 1;	__delay_us(500);	GP0 = 0;	__delay_us(500);	GP0 = 1;	__delay_us(500);}void rf_out(){	pilot();	int addr = 0xC66C;	for(int i = 0; i < 16; i++)		sbit((addr>>i)&0x1);	int data = 0x9;	for(int i = 0; i < 4; i++)		sbit((data>>i)&0x1);	anticode();}int main(){	CMCON  = 0x07;	VRCON  = 0x00;	TRISIO = 0b00010000;	GPIO   = 0x00;	ADCON0 = 0b00001101;	ANSEL = 0b00111010;	int val, send = 1;	GP0 = 0;	while(1){		val = avgrd(3);		if(val > 100){			if(send){				GP2 = 0;				rf_out();				__delay_ms(1000);				send = 0;			} else				GP2 = 1;		} else {			send = 1;			GP2 = 1;		}	}	return 0;}

post-754097-0-39109600-1422943745_thumb.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Teste antes sem os módulos Tx e Rx, para saber se o restante está funcionando.

Esses módulos (os mais baratos vendidos no Ebay) são muito ruins.

O receptor apresenta ruído na saída, quando não há sinal. Então você tem que enviar, ANTES DO SEU DADO, o que chamam de preâmbulo.

A função é "acordar" o receptor, de modo a que ele altere seu ganho para o nível do sinal recebido.

Sem sinal o ganho do receptor é tão grande que ele capta ruído.

Com sinal (o preâmbulo) o ganho vai reduzindo até que o ponto de operação seja estabelecido.

Nesse endereço tem tudo que você precisa para entender o problema.

http://www.romanblack.com/RF/cheapRFmodules.htm

MOR_AL

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado, consegui. Adicionei o preambulo enviando 6 bytes antes do piloto. 

 

Também corrigi alguns delays, especialmente no while do !GP1, onde diminui de 100 para 90 us.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações 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

×