Neste Tutorial Estarei mostrando
como Fazer a comunicação entre dois Pic16f628a utilizando Módulo RF 315Mhz.
PINAGEM do MÓDULO RF:
No circuito a instalação da antena é essencial para grandes distancias até 200 metros. Outro detalhe é que o módulo transmissor aceita tensões na faixa de 3,5 a 12v, o que também faz uma grande diferença no alcance da transmissão.
Veja abaixo o detalhe da pinagem dos dois módulos:
Modulo RF Transmissor e Receptor com frequencia de 315Mhz
Para fazer essa transmissão e recepção, utilizarei a linguagem de programação em C.
utilizando o compilador Micro C.
Trabalhei com interrupção do pic16f628a. pois assim ficou mais Fácil.
Vou mostrar o esquema eléctrico no Proteus...
mas vocês podem testar na pratica pois irá funcionar correctamente.
Para o fim de simulação usou-se uma ligação direita...
mas você pode colocar os módulo na pratica ..
da seguinte forma.
TRANSMISSOR
vcc +5volts ou +12volts.
GND - negativo
Data- Ligar no RB0(Pino 6 do pic16f62a
RECEPTOR:
vcc +5volts.
GND- negativos.
Data - Ligar no RA2(Pino 1 do pic16f628a)
Mas voce pode alterar as configurações para outros fins..
Esse projecto é um acionamento de leds a distancia...
CODIGO-FONTE DO TRANSMISSOR COMPILADOR MICRO C:
unsigned short usDevice_ID=0b11100111;
unsigned short variavel1=0,variavel2=0,variavel3=0,variavel4=0,variavel5=0;
sbit signal_out at RB0_bit;
sbit Led at RA4_bit;
void send_data(unsigned short usData,unsigned short Id_data);
void main() {
OSCF_bit=1; // Configurara o oscilador para 4Mhz
CMCON=5;
VRCON=0b11100001;
OPTION_REG.B7=0;
TRISA=0b00000110;
TRISB=0b11111110;
Led=0;
while(1){
if(PORTB.B1){
variavel1=1;
}
if(!PORTB.B1 && variavel1){
usDados=0b10000000;
send_data(usDados,usDevice_ID);
Led=1;
variavel1=0;
}
else if(PORTB.B2){
variavel2=1;
}
if(!PORTB.B2 && variavel2){
usDados=0b11000000;
send_data(usDados,usDevice_ID);
variavel2=0;
}
else if(PORTB.B3){
variavel3=1;
}
if(!PORTB.B3 && variavel3){
usDados=0b11100000;
send_data(usDados,usDevice_ID);
variavel3=0;
}
else if(PORTB.B4){
variavel4=1;
}
if(!PORTB.B4 && variavel4){
usDados=0b11110000;
send_data(usDados,usDevice_ID);
variavel4=0;
}
else if(PORTB.B5){
variavel5=1;
}
if(!PORTB.B5 && variavel5){
usDados=0b11111000;
send_data(usDados,usDevice_ID);
variavel5=0;
}
}
}
//---------- corpo da função que envia dados ----------------------------------
void send_data(unsigned short usData, unsigned short Id_data){
unsigned short i=0;
unsigned short usData_temp;
unsigned short usTipo=0;
signal_out=1;
delay_us(2400);
signal_out=0;
delay_us(600);
while(usTipo<2){
if(usTipo==0)usData_temp=usData;
if(usTipo==1)usData_temp=Id_data;
while(i<8){
if(usData_temp.B0){
signal_out=1;
delay_us(1200);
}else{
signal_out=1;
delay_us(600);
}
signal_out=0;
delay_us(600);
usData_temp>>=1;
i++;
}
i=0;
usTipo++;
}
}
RECEPTOR:
CODIGO-FONTE DO RECEPTOR COMPILADOR MICRO C:
unsigned short usDados; // Guarda os Dados recebidos apartir controle
unsigned int uiTempo; // Guarda o coneúdo de timer 1
unsigned short usRecebido; // Guarda dados processado pela função que lè o Sinal do IR
unsigned short usFlag; // variavel de sinalização
unsigned short usDevice_ID=0b11100111; // Gurda o ID do despositivo
unsigned int uiDebounce_time; // tempo decorrido para saída mudar de estado
unsigned int uiTemporizador_1;
unsigned short usTemporizador_2;
//==================================== Prototipo das Funções usadas ===================================
unsigned short Ler_Rf(); // Prototipo da função que lê o sinal do comando
void Pisca_led(); // Protótipo da função que faz pscar o led
void conta_tempo();
//======================================= Definição dos bits ========================================
sbit IR_sinal at RA2_bit; // Define RA1 como entrada do sinal de IR
sbit IR_tratado at usFlag.B0 ; // Flag Indicador de IR tratado
sbit Time_out at usFlag.B2; // Flag indicador de tempo de recepção esgotado
sbit Passou_1s at usFlag.B3;
sbit Rele at RB4_bit;
sbit Led at RA1_bit;
//============================= Processo das Interrupções =============================================
void interrupt(){ // Função que trata da interrupção do Modulo Timer0
if(INTCON.T0IF){ //Testa se hou interrupção
INTCON.T0IF=0; //Zera Flag indicador de interrupção
Time_out=1; // seta time out
TMR0=100;
}
}
//==================================
void main() {
OSCF_bit=1; // Configura Oscilador a 4Mhz
CMCON=7; // Configura todos pinos do port A como Digital
PORTA=0; //Zera Porta
PORTB=0; //carrega 7 no portb
TRISA=0b00000100; // configura RA2 como entrada os demais como saidas
TRISB=0; // configura todos os pinos do portb como saída
T1CON =0b00010000; // Configura timer1 com ps de 1/2, timer1 off
INTCON=0; //Desliga todas as interrupções
TMR0=100; //Inicializa timer0 com 100
OPTION_REG=135; //Desabilita pullups, ps de 255, timer0 como temporizador
INTCON.T0IE=1; //Habilita interrupção do Timer0
usFlag=0; //Zera Flag
uiDebounce_time=0;
uiTemporizador_1=0;
usTemporizador_2=0;
Delay_ms(10); // Aguarda 10 mili segundo para iniciar
PORTB.B0=1;
delay_ms(1000);
PORTB.B0=0;
while(1){
TMR0=100; //Inicializa timer0 com 100
INTCON.GIE=1; //Liga a Chave geral de interrupçáo
usRecebido = Ler_Rf(); // carrega valor retornado pela função em usRecebido
INTCON.GIE=0; //Desliga a Chave geral de interrupçáo
Time_out =0; // zera time out
conta_tempo();
if(usRecebido==0b10000000){
RB1_bit=~RB1_bit;
delay_ms(100);
}
else if(usRecebido==0b11000000){
RB2_bit=~RB2_bit;
delay_ms(100) ;
}
if(usRecebido==0b11100000){
RB3_bit=~RB3_bit;
delay_ms(100);
}
if(usRecebido==0b11110000){
RB4_bit=~RB4_bit;
delay_ms(100);
}
if(usRecebido==0b11111000){
RB5_bit=~RB5_bit;
delay_ms(100);
}
}
}
// -----------------------------------------------
//=================== Função que recebe os dados do controle RF==================================
// ----------------------------------------------
unsigned short ler_Rf(){
unsigned short usordem=0; // indica a ordem do bit recebido
unsigned short usTipo=0;
unsigned short usDevice_ID_lido=0; // Guarda o ID do despositivo enviado pelo transmissor
unsigned short usDados_lido; // Guarda os Dados recebidos apartir controle
usDados_lido=0;
usDados=0; // inicializa dados com zero
if(!IR_sinal) return(0); //se não detectou sinal retorna com 0
else{ //Se detectou continua
TMR1L=0; // zera parte baixa do contador Timer1
TMR1H=0; // zera parte alta do contador Timer1
TMR1ON_bit=1; // Activa o contador Timer 1
}
while(IR_sinal){ //Aguarda até o sinal descer
if(Time_out) return(0);
}
TMR1ON_bit=0; // Desliga contador Timer1
uiTempo=TMR1H; // variavel tempo recebe a parte alta do timer1
uiTempo<<=8;
uiTempo=uiTempo | TMR1L; // variavel tempo recebe a parte baixa do timer1
if(!((uiTempo>975)&&(uiTempo<1425))) return(0); // se tempo não estiver entre 1,95ms e 2,85ms retorna0
//----- start bit recebido com exito, passa para recepção dos dados -----------------------------------
while(usTipo<2){
while(usordem!=8){
while(!IR_sinal){ // Aguarda a recepção do sinal
if(Time_out) return(0);
}
TMR1L=0; // zera parte baixa do contador Timer1
TMR1H=0; // zera parte alta do contador Timer1
TMR1ON_bit=1; // Activa o contador Timer 1
while(IR_sinal){ //Aguarda até o sinal subir
if(Time_out) return(0);
}
TMR1ON_bit=0; // Desliga contador Timer1
uiTempo=TMR1H; // variavel tempo recebe a parte alta do timer1
uiTempo<<=8;
uiTempo=uiTempo | TMR1L; // variavel tempo recebe a parte baixa do timer1
if(uiTempo>500){ //testa se tempo é maior que 1ms
asm{
bsf status,c // Seta carry
rrf _usDados,f
}
usordem++ ;
}
else {
asm{
bcf status,c //Reseta carry
rrf _usDados,f
}
usordem++;
}
}
if(usTipo==0)usDados_lido=usDados; // Guarda o ID lido
if(usTipo==1)usDevice_ID_lido=usDados; // Guarda o ID lido
usTipo++;
usordem=0;
}
if(usDevice_ID_lido==usDevice_ID){
return(usDados_lido);
}else {
return(0);
}
}
//======================================================================================
// -------------------------------------------------------------
//========== Função que Faz piscar o Led indicador de funcionamento Normal =============
// --------------------------------------------------------------
void Pisca_led(){
uiDebounce_time++;
if(uiDebounce_time==4000){
uiDebounce_time=0;
Led=~Led;
}
}
//=======================================================================================
//======================= Corpo da função que conta o tempo==============================
void conta_tempo(){
uiTemporizador_1++;
if(uiTemporizador_1>20000){
uiTemporizador_1=0;
Passou_1s=1;
}
}
//----------------------------------------------------------------------------------
|




Sem comentários:
Enviar um comentário