quinta-feira, 1 de setembro de 2016

Comunicação RF com Pic16f628a

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