Autor Tema: PIC16F88 y Transceptor nRF24L01 (comunicacion inalambrica)  (Leído 8377 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado nahueldiaz1992

  • PIC12
  • **
  • Mensajes: 75
PIC16F88 y Transceptor nRF24L01 (comunicacion inalambrica)
« en: 07 de Marzo de 2014, 15:07:04 »
Hola queria abrir un nuevo tema de esto porque me parece q los que ya tenia estan bastante desprolijos y no van a lo que realmente necesito

anteriores=

SPI -nRF24l01

nRF24L01 - assembler

GUIA=

https://sites.google.com/site/proyectosroboticos/nrf24l01/nrf24l01-18f4550

https://sites.google.com/site/proyectosroboticos/nrf24l01/16f876-nrf24l01


la idea seria tener un emisor y un receptor de primera mano con estos pics (16f88) por lo cual el precio para una comunicacion inalabrica buena , la cual tiene muchisima utilidad en todos los campos de la electronica , seria muy bajo , (en argentina serian 60 pesos el modulo nrf24l01 y 40 pesos el pic16f88 ademas de todos los componentes restantes no pasarian los 260 pesos)

Hasta ahora he utilizado los enlaces que deje como guia para poder realizar la comunicacion pero cambie un poco los programas  junto a la libreria para hacer compatibles las mismas con el pic16f88 .


Emisor = Como se puede ver mas abajo , use una rutina como debug por lo tanto cuando monto el circuito el led ubicado temporalmente en RB5 indicara como fue la comunicacion , 1 pitido -comunicacion correcta , 2 pitidos enviado pero no recibido , 3 pitidos no se pudo enviar

Este codigo funciona ya que estoy teniendo problemas con el receptor y el emisor me da 2 pitidos por lotanto oviamente no va a recibir el receptor pero estamos seguros de que el emisor funciona

Código: [Seleccionar]
#include <16F88.h>

#fuses XT //Oscilador a cristal standar
#fuses NOWDT //sin WatchDog Timer
#fuses NOPROTECT //sin proteccion de memoria de programa
#fuses PUT //sin PowerUp Timer
#fuses NOBROWNOUT //sin brownout
#fuses NOLVP //sin programación en baja tensión

#use delay(clock=4000000)

#include "PIC16F88E.h" // Librería modificada para el el nRF24L01 con el PIC 18F4550.

#byte porta=0x05              // Dirección de los puertos A, B, C, D y E.
#byte portb=0x06
 
 
   int8 cont=0XFF;
   int8 ret2;
  
  
void main()
{  
   RF_CONFIG_SPI();          // Configurar módulo SPI del PIC.
   RF_CONFIG(0x40,0x01);     // Configurar módulo RF canal y dirección de recepción de datos para este PIC.
   RF_ON();                  // Activar el módulo RF.
  
   delay_ms(5);              // Dejamos como mínimo 2.5ms antes de comenzar a enviar.
  
   set_tris_a(0b101011);     // Dejo RA5 como salida para evitar poner la resistencia de polarización.
   set_tris_b(0b00000011);


   while(true)
   {  
            
            delay_ms(2000);

      #asm
      btfss    PORTA,0
      bcf      cont,0
      BTFSC    PORTA,0
      BSF      cont,0

      btfss    PORTA,1
      bcf      cont,1
      BTFSC    PORTA,1
      BSF      cont,1

      btfss    PORTA,3
      bcf      cont,2
      BTFSC    PORTA,3
      BSF      cont,2
      #endasm
      
      RF_DATA[0] = cont;     // El contenido del contador lo cargo en RF_DATA[0] para ser enviado., se pueden enviar hasta 8 bytes desde data 0 hasta data 7
      RF_DATA[1] = cont;
      RF_DATA[2] = cont;
      RF_DATA[3] = cont;
      RF_DATA[4] = cont;
      RF_DATA[5] = cont;
      RF_DATA[6] = cont;
      RF_DATA[7] = cont;


      RF_DIR=0x08;           // Dirección del receptor.
      ret2=RF_SEND();        // Envía el dato.Ret 2 nos devuelve el estado del proceso (envio)
      delay_ms(50);          // Una pausa en cada incremento.

      if(ret2==0)             //se ha enviado y ha recibido ACK
      {
            #asm
            bsf  PORTB,5
            #ENDASM
            delay_ms(100);
            #ASM
            BCF   PORTB,5
            #ENDASM
            delay_ms(100);
        
         }

         else if(ret2==1)     // se ha enviado pero no ha recibido el ACK
         {
            #asm
            bsf  PORTB,5
            #ENDASM
            delay_ms(100);
            #ASM
            BCF   PORTB,5
            #ENDASM
            delay_ms(100);
            #asm
            bsf  PORTB,5
            #ENDASM
            delay_ms(100);
            #ASM
            BCF   PORTB,5
            #ENDASM
            delay_ms(100);
            
         }

         else                 // no ha podido ser enviado
         {

            #asm
            bsf  PORTB,5
            #ENDASM
            delay_ms(100);
            #ASM
            BCF   PORTB,5
            #ENDASM
            delay_ms(100);
            #asm
            bsf  PORTB,5
            #ENDASM
            delay_ms(100);
            #ASM
            BCF   PORTB,5
            #ENDASM
            delay_ms(100);
            #asm
            bsf  PORTB,5
            #ENDASM
            delay_ms(100);
            #ASM
            BCF   PORTB,5
            #ENDASM
            delay_ms(100);
         }
   }
}



Esquematico=





Receptor=con esto les queria pedir ayuda el receptor configura el modulo y se queda esperando a que lleguen los datos pero nunca mas reacciona ademas los lugares por donde deverian de salir los datos se mantienen en high sin motivo aparente alguien ha trabajado con esta libreria y portandola ha tenido problemas ?

Código: [Seleccionar]
#include <16F88.h>

#fuses XT //Oscilador a cristal standar
#fuses NOWDT //sin WatchDog Timer
#fuses NOPROTECT //sin proteccion de memoria de programa
#fuses PUT //sin PowerUp Timer
#fuses NOBROWNOUT //sin brownout
#fuses NOLVP //sin programación en baja tensión

#use delay(clock=4000000)

#include "PIC16F88R.h" // Librería para manejar el módulo SPI con el nRF24L01.

#byte porta=0x05           // Dirección del puerto A.
#byte portb=0x06           // Dirección del puerto B.

int8 ret1;
int8 data1;


#int_ext                   // Interrupción RB0/INT del módulo RF.
void int_RB0()
{
   ret1 = RF_RECEIVE();
   if ( (ret1 == 0) || (ret1 == 1) )
   {
      do
      {    
         data1=RF_DATA[0];  // Data1 contendrá el valor que le llege del emisor, a través de RF_DATA[0].
         data1=RF_DATA[1];
         data1=RF_DATA[2];
         data1=RF_DATA[3];
         data1=RF_DATA[4];
         data1=RF_DATA[5];
         data1=RF_DATA[6];
         data1=RF_DATA[7];
        
            #asm
            
            BTFSS    data1,0
            BCF      PORTA,4
            BTFSC    data1,0
            BSF      PORTA,4
      
            BTFSS    data1,1
            BCF      PORTA,2
            BTFSC    data1,1
            BSF      PORTA,2
      
            BTFSS    data1,2
            BCF      PORTB,3
            BTFSC    data1,2
            BSF      PORTB,3
            
            #endasm
            
        
         ret1 = RF_RECEIVE();
      } while ( (ret1 == 0) || (ret1 == 1) ); // Tanto si existe entrada múltiple o simple de datos los lee.
   }  
}

void main()                  //Programa principal
{
   set_tris_a(0b100000);     // RA0 sustituye a RB0 y se pone un LED en RA0.
   set_tris_b(0b00000011);   // RB0 es para la interrupción, el resto son LEDs.
  
   RF_INT_EN();              // Habilitar interrupción RB0/INT.
   RF_CONFIG_SPI();          // Configurar módulos SPI del PIC.
   RF_CONFIG(0x40,0x08);     // Configurar módulo RF (canal y dirección).
   RF_ON();                  // Activar el módulo RF.
  
   while(true);              // Bucle infinito.
      
}



Esquematico =





Datos , programa , libreria , todo completo

Proyecto
« Última modificación: 07 de Marzo de 2014, 15:10:13 por nahueldiaz1992 »

Desconectado dolphin_96

  • PIC12
  • **
  • Mensajes: 73
    • Ezkybel Electronics
Re: PIC16F88 y Transceptor nRF24L01 (comunicacion inalambrica)
« Respuesta #1 en: 07 de Marzo de 2014, 23:04:24 »
Hola de nuevo,
Tu dices que el transmisor esta enviando por que te regresa un 2 verdad?, pero tengo una duda, si tu quitas el modulo te regresa el 2?, o te regresa un 1, por que si te sigue regresando un 2 entonces no puedes estar seguro que el 2 significa que envio datos, pero si te regresa un 1 quiere decir que es correcta tu deduccion.

de ser asi te recomiendo que hagas esta prueba con ambos modulos con el mismo pic y el mismo programa asi estaras seguro que tus modulos funcionan bien y te concentraras en tu programa.
Visiten: www.xbot.es/ezkybel tengo tutoriales para pics con visual basic...:)

Desconectado nahueldiaz1992

  • PIC12
  • **
  • Mensajes: 75
Re: PIC16F88 y Transceptor nRF24L01 (comunicacion inalambrica)
« Respuesta #2 en: 07 de Marzo de 2014, 23:24:26 »
Hola de nuevo,
Tu dices que el transmisor esta enviando por que te regresa un 2 verdad?, pero tengo una duda, si tu quitas el modulo te regresa el 2?, o te regresa un 1, por que si te sigue regresando un 2 entonces no puedes estar seguro que el 2 significa que envio datos, pero si te regresa un 1 quiere decir que es correcta tu deduccion.

de ser asi te recomiendo que hagas esta prueba con ambos modulos con el mismo pic y el mismo programa asi estaras seguro que tus modulos funcionan bien y te concentraras en tu programa.


holaa cuando quito el transmisor me envia 3 pitidos el cual significa no enviado por lo cual podriamos decir que no es el transmisor , con el cual he provado mis nRF24L01 s

« Última modificación: 07 de Marzo de 2014, 23:35:03 por nahueldiaz1992 »

Desconectado dolphin_96

  • PIC12
  • **
  • Mensajes: 73
    • Ezkybel Electronics
Re: PIC16F88 y Transceptor nRF24L01 (comunicacion inalambrica)
« Respuesta #3 en: 07 de Marzo de 2014, 23:30:29 »
PErfecto entonces coincido contigo
Visiten: www.xbot.es/ezkybel tengo tutoriales para pics con visual basic...:)

Desconectado nahueldiaz1992

  • PIC12
  • **
  • Mensajes: 75
Re: PIC16F88 y Transceptor nRF24L01 (comunicacion inalambrica)
« Respuesta #4 en: 07 de Marzo de 2014, 23:39:12 »
lo peor de esto es que me quedo sin muchas opciones en que fijarme , ahora modifique el codigo del receptor para ver si entraba alguna vez en el ciclo de recepcion de datos , colocando un led como debug , como realize en el comentario de arriba , en el emisor y lo que sucede es que se cuelga , queda en un loop infinito , esta puesto para que parpadee
con el while luego de la configuracion del receptor y nunca sale de ahi :/

Desconectado nahueldiaz1992

  • PIC12
  • **
  • Mensajes: 75
Re: PIC16F88 y Transceptor nRF24L01 (comunicacion inalambrica)
« Respuesta #5 en: 09 de Marzo de 2014, 15:43:43 »
Hola de nuevo,
Tu dices que el transmisor esta enviando por que te regresa un 2 verdad?, pero tengo una duda, si tu quitas el modulo te regresa el 2?, o te regresa un 1, por que si te sigue regresando un 2 entonces no puedes estar seguro que el 2 significa que envio datos, pero si te regresa un 1 quiere decir que es correcta tu deduccion.

de ser asi te recomiendo que hagas esta prueba con ambos modulos con el mismo pic y el mismo programa asi estaras seguro que tus modulos funcionan bien y te concentraras en tu programa.


holaa cuando quito el transmisor me envia 3 pitidos el cual significa no enviado por lo cual podriamos decir que no es el transmisor , con el cual he provado mis nRF24L01 s




Para que se entienda el video me olvide de colocar el codigo modificado para ver , por medio de "ret2" cual fue el estado de la comunicacion con el modulo

Código: [Seleccionar]
#include <16F88.h>

#include "PIC16F88E.h" // Librería modificada para el el nRF24L01 con el PIC 16F88.

#fuses XT //Oscilador a cristal standar
#fuses NOWDT //sin WatchDog Timer
#fuses NOPROTECT //sin proteccion de memoria de programa
#fuses PUT //sin PowerUp Timer
#fuses NOBROWNOUT //sin brownout
#fuses NOLVP //sin programación en baja tensión

#use delay(clock=4000000)


#byte porta=0x05              // Dirección de los puertos A, B, C, D y E.
#byte portb=0x06
 
 
   int8 cont=0XFF;
   int8 ret2;
   
   
void main()

   RF_CONFIG_SPI();          // Configurar módulo SPI del PIC.
   RF_CONFIG(0x40,0x01);     // Configurar módulo RF canal y dirección de recepción de datos para este PIC.
   RF_ON();                  // Activar el módulo RF.
   
   delay_ms(5);              // Dejamos como mínimo 2.5ms antes de comenzar a enviar.
   
   set_tris_a(0b101011);     // Dejo RA5 como salida para evitar poner la resistencia de polarización.
   set_tris_b(0b00000011);


   while(true)
   { 
           
            delay_ms(2000);

      #asm
      btfss    PORTA,0
      bcf      cont,0
      BTFSC    PORTA,0
      BSF      cont,0

      btfss    PORTA,1
      bcf      cont,1
      BTFSC    PORTA,1
      BSF      cont,1

      btfss    PORTA,3
      bcf      cont,2
      BTFSC    PORTA,3
      BSF      cont,2
      #endasm
     
      RF_DATA[0] = cont;     // El contenido del contador lo cargo en RF_DATA[0] para ser enviado., se pueden enviar hasta 8 bytes desde data 0 hasta data 7
      RF_DATA[1] = cont;
      RF_DATA[2] = cont;
      RF_DATA[3] = cont;
      RF_DATA[4] = cont;
      RF_DATA[5] = cont;
      RF_DATA[6] = cont;
      RF_DATA[7] = cont;


      RF_DIR=0x08;           // Dirección del receptor.
      ret2=RF_SEND();        // Envía el dato.Ret 2 nos devuelve el estado del proceso (envio)
      delay_ms(50);          // Una pausa en cada incremento.

      if(ret2==0)             //se ha enviado y ha recibido ACK
      {
            #asm
            bsf  PORTB,5
            #ENDASM
            delay_ms(300);
            #ASM
            BCF   PORTB,5
            #ENDASM
            delay_ms(300);
         
         }

         else if(ret2==1)     // se ha enviado pero no ha recibido el ACK
         {
            #asm
            bsf  PORTB,5
            #ENDASM
            delay_ms(300);
            #ASM
            BCF   PORTB,5
            #ENDASM
            delay_ms(300);
            #asm
            bsf  PORTB,5
            #ENDASM
            delay_ms(300);
            #ASM
            BCF   PORTB,5
            #ENDASM
            delay_ms(300);
           
         }

         else                 // no ha podido ser enviado
         {

            #asm
            bsf  PORTB,5
            #ENDASM
            delay_ms(300);
            #ASM
            BCF   PORTB,5
            #ENDASM
            delay_ms(300);
            #asm
            bsf  PORTB,5
            #ENDASM
            delay_ms(300);
            #ASM
            BCF   PORTB,5
            #ENDASM
            delay_ms(300);
            #asm
            bsf  PORTB,5
            #ENDASM
            delay_ms(300);
            #ASM
            BCF   PORTB,5
            #ENDASM
            delay_ms(300);
         }
   }
}

Desconectado nahueldiaz1992

  • PIC12
  • **
  • Mensajes: 75
Re: PIC16F88 y Transceptor nRF24L01 (comunicacion inalambrica)
« Respuesta #6 en: 09 de Marzo de 2014, 18:37:24 »
Como va ? estuve revisando todo el programa del receptor e incluso lo monte aparte en una breadborad tratando de revisar las conecciones y encontre que una vez que se enciende el micro del receptor , los pines donde saldrian los disparos quedan en HIGH siendo que yo en el programa limpio los puertos  y no se el motivo , aunque yo quiera cambiar los estados de los bits que envio siempre tengo HIGH en los puertos designados como "disparo" ubicados en el siguiente esquema



Desconectado nahueldiaz1992

  • PIC12
  • **
  • Mensajes: 75
Re: PIC16F88 y Transceptor nRF24L01 (comunicacion inalambrica)
« Respuesta #7 en: 10 de Marzo de 2014, 17:26:44 »
Hola amigos intente de seguir con el tema y realize el programa para una comunicacion full duplex en vez de andar intentando una comunicacion unidireccional  por lo que prove ahora ambos envian y deberian de recibir pero ambos me dan 2 piticos como que envian pero la rutina de recepcion nunca funciona .. :/

Desconectado dolphin_96

  • PIC12
  • **
  • Mensajes: 73
    • Ezkybel Electronics
Re: PIC16F88 y Transceptor nRF24L01 (comunicacion inalambrica)
« Respuesta #8 en: 10 de Marzo de 2014, 17:52:29 »
es muy raro, no se que mas podrias hacer para probar la comunicacion, y como te comente yo no tengo de esos micros para poder hacer pruebas, si se e ocurre algo te lo hago saber
Suerte!
Visiten: www.xbot.es/ezkybel tengo tutoriales para pics con visual basic...:)

Desconectado nahueldiaz1992

  • PIC12
  • **
  • Mensajes: 75
Re: PIC16F88 y Transceptor nRF24L01 (comunicacion inalambrica)
« Respuesta #9 en: 02 de Abril de 2014, 20:25:07 »
Como les va despues de un tiempo llegue a la conclusion de que no podia estar asi sin resolver el drama asi que me puse a armar el circuito con el programa y los micros originales y sorprendentemente me salio el proyecto a la primera ... despues mas adelante voy a ver si los puedo portar a los pics 16f88 pero con mas tiempo y mas tranqui asi averiguo el porque no querian funcionar .


a continuacion les muestro lo que hice con el proy. original de biblioman =







Lo que si como se ve en el ultimo video cuando paso el receptor a una placa tengo problemas , la verdad es que ni idea que puede ser pero seguramente una tonteria como un falso contacto o demas , si tienen alguna idea de que puede ser .. pero aparte de eso estoy contento de que minimamente funciona .