Comunicación por Radiofrecuencia entre PICs y nRF24L01

Puede ser que se trabe el programa.
Podrias compartirlo el de ambos (tx/rx)?
Cual seria el funcionamiento?
 
Este es el código del emisor
#Include <16F876A.h>
#fuses NOWDT, XT, PUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(clock=4000000)
#include "lib_rf2gh4_10.h"
#byte porta=0x05
#byte portb=0x06
#int_ext // Esta rutina está para un futuro si haces comunicaciones bidireccionales.


void int_RB0() // Si te da error esta línea, sustituir por: void int_ext_isr(void).
{ // Se encargaría de la recepción de datos.
int8 ret1;

ret1 = RF_RECEIVE();
if ( (ret1 == 0) || (ret1 == 1) )
{
do
{
ret1 = RF_RECEIVE();
}while ( (ret1 == 0) || (ret1 == 1) );
}
}


void main()
{
int8 ret2;
RF_INT_EN(); // Habilitar interrupción RB0/INT.
RF_CONFIG_SPI(); // Configurar módulo SPI del PIC.
RF_CONFIG(0x40,0x01); // Configurar módulo RF canal y dirección de recepción. Para recibir datos tiene la dirección 0x01.
RF_ON(); // Activar el módulo RF.

delay_ms(5); // Le damos un mínimo de 2.5 milisegundos para que se ponga en marcha.

set_tris_a(0b111111); // Todo el puerto A como entradas.

while(true) // Bucle infinito.
{
RF_DATA[0]=porta; // Cargamos el dato en RF_DATA[0].
RF_DIR=0x08; // Dirección del receptor.
ret2=RF_SEND(); // Enviar datos.
}
}
Código del receptor
#include <16F876A.h>
#FUSES NOWDT, XT, PUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(clock=4000000)
#include "lib_rf2gh4_10.h"
#byte porta=0x05 // Dirección del puerto A.
#int_ext // Interrupción del módulo RF.


void int_RB0() // Si te da error esta línea, sustituir por: void int_ext_isr(void).
{
int8 ret1;
ret1 = RF_RECEIVE();
if ( (ret1 == 0) || (ret1 == 1) ) // Tanto si hay recepción simple o múltiple, leer datos.
{
do
{
porta=RF_DATA[0]; // El puerto A contendrá el valor que le llegue del emisor, a través de RF_DATA[0].
ret1 = RF_RECEIVE(); // "ret1" nos dirá si hay recepción simple, múltiple o no hay datos para leer.
}while ( (ret1 == 0) || (ret1 == 1) ); // Mientras haya datos para leer, seguir leyendo.
}
}


void main() // Programa principal.
{
set_tris_a(0b000000); // Todo el puerto A como salida.
porta=0; // Inicialmente lo ponemos a cero.

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.

}
Ambos estan compilados en ccs
Porfavor si alguien sabe el Motivo de porque podria colgarse esporadicamente
 
Personalmente no veo nada extraño.
No se si algo de fuses, o alguna configuracion que se me escape.
Podrias decir bien en qué situaciones se da el cuelgue y cual de los dos pic?
Aparte del pic y el modulo rf, tenes conectado algo mas?
Como los alimentas?

PD: Para la proxima adjunta el codigo dentro de una etiqueta, aca cómo se hace [TUTO] ¿Cómo subir archivos? (XenForo)
 
¿Podrias decir bien en qué situaciones se da el cuelgue y cuál de los dos PIC?
Exactamente eso es lo que hace falta saber.
Viendo los códigos lo único que puede causar dudas es el "while ( (ret1 == 0) || (ret1 == 1) ); "
O sea que eso genera un bucle infinito sin hacer otra cosa que esperar un 1 o un 0
Habrá que ver si la librería responde con otra cosa para que se pueda salir del bucle.
 
Muchas gracias por responder, parece ser que se cuelga el Emisor porque cuando le doy reset o lo apago y prendo vuelve a funcionar sin problemas, se cuelga de repente no se el momento preciso y las circunstancias exactas ya que debe estar encendido todo el tiempo, adjuntare el código y la libreria mas tarde espero lo vean, de nuevo muchas gracias por su tiempo
 
Última edición:
Si D@rk, lo primero que pense, pero me fije en la libreria (la cual adjunto sacada de todopic), y son diferentes banderas, osea que el 0 y el 1, son banderas que indican si hay datos, si no los hay, manda mas de "2".

Ya que ya adjunte la libreria, mejor dinos lo que te consulte mas arriba
 

Adjuntos

  • lib_rf2gh4_10.zip
    3.4 KB · Visitas: 20
Última edición:
Pues sí, y resetearlo en los lugares donde se crea que no haya problemas.
Si el WDT se resetea en donde el programa se pueda colgar, no serviría de nada.
 
Depende del software con que programes, puede ya disponer de librerias que lo hagan por tí.
En caso que no la tengas, deberás estudiar el protocolo.

Mas que precaución, yo diría que lo tengas en cuenta.
La emulación por software implica gastos de recursos, así que se te reduce la memoria de programa y RAM, y aumenta el uso de CPU, aumentando los tiempos de ejecución.
Y dependiendo de la librería, puede consumirse interrupciones, pines y timers.
 
Gracias DJT3...quería ensayar el programa de d@rkbytes, para ir a lo seguro (jaja...es un genio encubierto y me convertí en su "salieri") y leí por ahí que le decía a alguien que usaba el 16f628a que debía emular el protocolo...estoy usando CCS y hasta ahora sabía que se podía emular RS232, pero no me aparece nada en concreto sobre emular SPI...voy a seguir buscando o esperar que d@rkbytes se inspire con algo que quiera compartir.
 
Quizás no es la forma mas optimizada para hacerlo pero:

La función en C seria así (para el Modo 0):

C:
unsigned char spi_write(unsigned char byte)
{
      unsigned char i, SPI_Valor = 0;

      for (i = 0; i < 8; i++) { // 8 bit a transmitir
                                         SCK = 0;
                                         MOSI = (byte & 128) >> 7;
                                         SCK = 1;
                                         SPI_Valor = SPI_Valor << 1;
                                         SPI_Valor = SPI_Valor | MISO;
                                         byte = byte << 1;
                                      }
      MOSI = 1;
      return SPI_Valor;
}

Ojo que el ejemplo es para datos de 8 bits.




(Después subo al foro lo que había escrito, en mi blog, sobre el protocolo SPI).
 
Atrás
Arriba