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)
 

D@rkbytes

Moderador
¿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: 4
Última edición:

D@rkbytes

Moderador
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.
 
Arriba