Programación Específica > Microcontroladores
Trf-2.4g Desesperada
(1/1)
vane_ccs:
Hola a todos, como estan?
Estoy trabajando en mi proyecto de tesis y lo unico que me falta para terminarla es poner a funcionar los RF. (lo cual llevo tratando de hacer hace tiempo)
Esta parte es importante en mi proyecto y he aprendido bastante (aunque siempre se aprende algo nuevo)...Tuve que aprender como funcionaba el SPI, ya que vi que habia muchas personas que hacian la comunicacion entre el pic y el rf por ahi, y existia una libreria en mcc18 (lo estoy haciendo en c) que ya tenia todo asi que era mas rapido. (reusabilidad)
Mi programa de comunicacion funciona perfecto con el SPI entre dos pic(master/slave)....y he estado tratando de hacer la comunicacion entre el rf y pic asi, pero nada...hice mi codigo para un receptor y un transmisor y el rf receptor no recibe nada, DR1 nunca se pone en uno.
He estado pensando en cual podia ser la causa....y esta puede ser que el rf no se esta configurando bien. (por tiempo o por como envio la palabra de configuracion o porque el spi tenga algun problema..)
Aqui les coloco el codigo a ver si pueden detectar algun error...
Esta es la libreria spi que hice para enviar y recibir datos por SPI. (usando funciones de spi.h mcc18)
--- Código: Text --- #include <p18F4620.h>#include <spi.h> void config_SPI(void){ OpenSPI( SPI_FOSC_16, MODE_00, SMPEND); } void config_SPI1(void){ OpenSPI( SLV_SSOFF, MODE_00, SMPEND);} void trasmitiendo_datos(unsigned char data[],int tamano){ signed char i; for(i=0;i<tamano;i++){ while(putcSPI(data[i])<0){ SSPCON1bits.WCOL = 0; data[i] = getcSPI(); ; } }} signed char recibiendo_datos(unsigned char data[],int tamano){ getsSPI(data,tamano); return(-1);}
Este es el codigo del transmisor
--- Código: Text --- #include <p18F4620.h>#include <delays.h>#include <spi.h>#include <sicc.h> //creada por mi para la declaracion de las funciones de mi proyecto //definicion de los pines del RF#define TX_CE PORTBbits.RB7#define TX_CS PORTBbits.RB6 #define CONFIG_READY PORTBbits.RB0 //definicion para configuracion del RF#define PAYLOAD_SIZE 232#define ADDR1 11#define ADDR_CRC_SIZE 0b00100011#define CH_SHOCK_250_FP 0b01001111#define RF_CH2_RXEN 0b00010100 //2410MHz unsigned char data_TX[7] = "HELLO!"; void config_rf_tx(void){ unsigned char config_wd[14]; //valores a la configuration word en ShockBurst config_wd[0]= PAYLOAD_SIZE; //payload 29Bytes * 8 = 232bits de data config_wd[1]= 0; config_wd[2]= 0; config_wd[3]= 0; config_wd[4]= 0; config_wd[5]= 0; config_wd[6]= 0; config_wd[7]= 0; config_wd[8]= 0; config_wd[9]= 0; config_wd[10]= ADDR1; // direccion config_wd[11]= ADDR_CRC_SIZE; // 8 bits direccion & 16 bits CRC habilitado config_wd[12]= CH_SHOCK_250_FP; // 1 canal de recepcion & ShockBurst & 250kbps & full power config_wd[13]= RF_CH2_RXEN; // RF_CH canal 2 RXEN de transmision Delay1KTCYx(15); // (tpd2stby) 5msec TX_CE = 0; TX_CS = 1; CONFIG_READY = 0; Delay10TCYx(40); // (tcs2data) 10usec trasmitiendo_datos(config_wd,14); Delay100TCYx(100); TX_CE = 0; TX_CS = 0; CONFIG_READY = 1; Delay10TCYx(40);} void Transmision(unsigned char data[],unsigned char rf_address){ TX_CE = 1; Delay10TCYx(40); // (tce2data) 10usec trasmitiendo_datos(rf_address,1); trasmitiendo_datos(data,7); TX_CE = 0; //Inicio de la transmision } void inicio_TX(void){ config_rf_tx();} void main(void){ unsigned char rf_address = 10; TRISAbits.TRISA6 = 0; TRISAbits.TRISA7 = 0; ADCON1 = 0b00001111; TX_CS = 0; TX_CE = 0; CONFIG_READY = 0; //configuro pines como salida CE y CS TRISBbits.TRISB7 = 0; TRISBbits.TRISB6 = 0; //configuro el pin RB0 como salida //ente indica que la configuracion ha sido realizada TRISBbits.TRISB0 = 0; config_SPI(); inicio_TX(); while(1){ Transmision(data_TX,rf_address); Delay1KTCYx(30); }}
y por ultimo el codigo del receptor
--- Código: Text --- #include <p18F4620.h>#include <xlcd.h>#include <delays.h>#include <spi.h>#include <sicc.h> //definicion de los pines del RF#define RX_CE PORTBbits.RB7#define RX_CS PORTBbits.RB6#define RX_DR1 PORTBbits.RB4 //definicion para configuracion del RF#define PAYLOAD_SIZE 232#define ADDR1 10#define ADDR_CRC_SIZE 0b00100011 #define CH_SHOCK_250_FP 0b01001111#define RF_CH2_RXEN 0b00010101 //2410MHz unsigned char data_RX[7]; void config_rf_rx(void){ unsigned char buffer[17]="INICIANDO CONFIG"; unsigned char buffer1[17]="FIN CONFIG......"; unsigned char config_wd[14]; //valores a la configuration word en ShockBurst config_wd[0]= PAYLOAD_SIZE; //payload 29Bytes * 8 = 232bits de data config_wd[1]= 0; config_wd[2]= 0; config_wd[3]= 0; config_wd[4]= 0; config_wd[5]= 0; config_wd[6]= 0; config_wd[7]= 0; config_wd[8]= 0; config_wd[9]= 0; config_wd[10]= ADDR1; // direccion config_wd[11]= ADDR_CRC_SIZE; // 8 bits direccion & 16 bits CRC habilitado config_wd[12]= CH_SHOCK_250_FP; // 1 canal de recepcion & ShockBurst & 250kbps & full power config_wd[13]= RF_CH2_RXEN; // RF_CH canal 2 RXEN de transmision Delay1KTCYx(15); RX_CE = 0; RX_CS = 1; Delay10TCYx(40); // (tcs2data) 10usec trasmitiendo_datos(config_wd,14); Delay100TCYx(100); RX_CE = 1; RX_CS = 0; //empiezo a monitoriar el aire Delay10TCYx(40); } void Recepcion(int tamano){ RX_CE = 0; data_RX[0]='\0'; if(recibiendo_datos(data_RX,tamano)<0); RX_CE = 1; //Inicio de nuevo monitoreo del aire} void inicio_RX(void){ unsigned char buffer[17]="RF_RX INICIADO."; config_SPI(); config_rf_rx(); } void main(void){ TRISAbits.TRISA6 = 0; TRISAbits.TRISA7 = 0; ADCON1 = 0b00001111; //configuro pines como entrada DR1 y salida CE y CS TRISBbits.TRISB7 = 0; TRISBbits.TRISB6 = 0; TRISBbits.TRISB4 = 1; OpenXLCD(FOUR_BIT & LINES_5X7); inicio_RX(); while(1){ if(RX_DR1==1){ Recepcion(6); while(BusyXLCD()); SetDDRamAddr(0x00); putsXLCD(data_RX); } }}
Se que el post esta bastante largo, disculpen :losiento: pero pienso que es la unica manera de que entiendan que estoy haciendo...
Si estoy cometiendo alguna burrada en alguna parte del codigo por favor diganme, escucho cualquier sugerencia.
Muchas gracias de antemano.
© Jonathan ©:
Bueno vane, segun tus comentarios creo que queda descartado que la rutina de comunicacion SPI sea la falla.
--- Citar ---Mi programa de comunicacion funciona perfecto con el SPI entre dos pic(master/slave)
--- Fin de la cita ---
Me inclino en que la falla esta o bien en la configuracion del modulo de RF o con seguridad en el armado del circuito electronico. La radiofrecuencia es muy sensible a las impurezas del circuito realizado en la placa y mas todavia a la frecuencia que trabaja ese modulo, si eres tan amable me interesaria mucho ver el esquema que estas utilizando y saber tmb si la placa la tienes hecha en PCB o utilizas el protoboard para realizar las pruebas. Estoy buscando la manera de ayudarte y lograr manejar tmb el modulito, ya que he visto que es tema de consulta en varios post del foro. Saludos
Yuliettte:
Hola Jonathan:
He leido tus foros y se que sabes mucho de estos modulos, no los he empezado a manejar pero puedes darme algunos de tips referente a montajes y componentes para evitar ruidos y optimizar la comunicacion.
Gracias por tu ayuda
Aristides Alvarez:
Hola vane_ccs, en este PDF hay una aplicación que utiliza ese módulo, creo que podrás sacar alguna información:
http://courses.cs.tamu.edu/rgutier/cpsc483...rable-final.pdf
Navegación
Ir a la versión completa