TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: c4_esp_VR en 29 de Mayo de 2010, 07:58:00

Título: CCS pic nrf24l01
Publicado por: c4_esp_VR en 29 de Mayo de 2010, 07:58:00
Hola compañeros:

Hace poco que he adquirido un módulo nrf24l01 para conectarlo con algún PIC. Después de 2 días peleando ni siquiera soy capaz de leer y escribir en sus registros intenos a través de spi. Estoy desesperadito de verdad.

Por si alguno pudiese ayudarme, aquí les dejo el código.

Código: [Seleccionar]
#include <18F44K20.h>
#include <stdlibm.h>
#include <string.h>

#fuses HS, NOPROTECT, NOLVP

#rom int8 0x300001 = {0x06} //Es igual que poner 00000110 FOSC<3:0>=0110=HS PLL Enable
#use delay(clock=64M)
#use rs232(baud=115200, xmit=PIN_C6, rcv=PIN_C7)

#define nRF24L01_CE PIN_C0
#define nRF24L01_CSN PIN_C1
#define nRF24L01_IRQ PIN_C2

//Variables de USART
int const lenbuff=13; // Tamaño del buffer de recepción
int xbuff=0; // Índice: siguiente char en cbuff
int8 string_buffer[lenbuff]; // Buffer
int1 flagcommand=0; // Flag para indicar comando disponible
char dd;
//Fin variables de USART

//Declaración de funciones
void inicbuff(void); // Borra buffer
void addcbuff(char c); // añade caracter recibido al buffer
//Fin declaración de funciones

void SPI_Write_Reg_JVR(BYTE reg, BYTE value);
unsigned char SPI_Read_Reg_JVR(BYTE reg);

#int_rda
void serial_isr()
{ // Interrupción USART
   dd=0;
   dd=getchar();
   addcbuff(dd);
}

void inicbuff(void)
{ // Inicia a \0 cbuff -------------------
   int j;
   for(j=0;j<lenbuff;j++)
   { // Bucle que pone a 0 todos los
      string_buffer[j]=0; // caracteres en el buffer
   }
   xbuff=0; // Inicializo el indice de siguiente caracter
   }

void addcbuff(char c)
{
   switch(c)
   {
      case 13://CR
      flagcommand=1;
      //disable_interrupts(int_rda);
      break;
      default:
      string_buffer[xbuff++]=c;
      if(xbuff>lenbuff)
      xbuff=lenbuff;
   }
}


void main(void) {

unsigned char value=255;

SSPCON1 = 0x3E;//0b00111110;

   setup_spi(SPI_MASTER|SPI_L_TO_H|SPI_XMIT_L_TO_H|SPI_CLK_DIV_64);             // Setup hardware spi
enable_interrupts(int_rda); // Habilita Interrupción RDA
   enable_interrupts(global);// Habilita interrupciones
  
printf("Welcome nRF24L01 example");
delay_ms(1000);

   while (TRUE)
   {
if (flagcommand==1)
        {
flagcommand=0;
printf("%s",string_buffer);
if (string_buffer[0]=='s')
{
value = SPI_Read_Reg_JVR(0x00);
printf("A: %i\n",value);
SPI_Write_Reg_JVR(0x00, 0x01);
printf("B: %i\n",value);

value=255;
}
inicbuff();
}
}
}

void SPI_Write_Reg_JVR(BYTE reg, BYTE value)  
{
        
     output_low(nRF24L01_CSN); //CSN low                  
     spi_write(reg); //Seleccionamos el registro
     spi_write(value); //y escribimos el valor en el registro

     output_high(nRF24L01_CSN); //CSN arriba
}

unsigned char SPI_Read_Reg_JVR(BYTE reg)  
{
char status;
char value;
        
    output_low(nRF24L01_CSN); //CSN low                  

status = reg;
value = spi_read(status);

    output_high(nRF24L01_CSN); //CSN arriba

return value;
}

Fijense sólo en la parte final de código, el principio es la función de interrupción para la UART. En este caso cada vez que escribo una s en el hyperterminal, recibo un sA:14B:14 , es como si no hiciese nada...please help me!!!  :( :( :(

Un saludete compañeros.

Lo olvidaba, la configuración HW es como sigue:

RC0 -> CE
RC1 -> CSN
RC2 -> IRQ
RC3 -> SCK //Propio del SPI HW
RC4 -> MISO//Propio del SPI HW
RC5 -> MOSI//Propio del SPI HW
RC6 -> TX
RC7 -> RX

El módulo está correctamente alimentado a 3v3 y es este nRF24l01 (http://cgi.ebay.ph/ws/eBayISAPI.dll?ViewItem&item=380207829171)
Título: Re: CCS pic nrf24l01
Publicado por: c4_esp_VR en 29 de Mayo de 2010, 11:49:55
Hola compañeros:

Sigo intentándolo, la salida por el osciloscopio al realizar,

Código: [Seleccionar]
   output_low(nRF24L01_CE);      
    output_low(nRF24L01_CSN); //CSN low
    delay_us(10);
    spi_write(0x20);
    spi_write(0x1);
    output_high(nRF24L01_CSN); //CSN arriba

es la siguiente,

(http://www.todopic.com.ar/foros/index.php?action=dlattach;topic=30824.0;attach=12205)

¿Lo que hace está bien...?, más que nada me parece raro que el esclavo esté enviando datos al maestro sin saber que hacer aún, como se ve, la línea azul es lo que envia el maestro que es el 0x20=00100000 y 0x01 = 00000001, la línea roja es el reloj, la amarilla es lo que envia el esclavo al maestro que es 0x0E = 00001110 y la verde es el CSN del nRF24l01 para habilitar la lectura de registros...La verdad no sé que puede estar pasando...¿puede que el módulo de radioesté roto...?

Luego si queremos leer el registro, hacemos lo siguiente,

Código: [Seleccionar]
char value;
output_low(nRF24L01_CE);       
        output_low(nRF24L01_CSN); //CSN low
delay_us(10);
value = spi_read(0x20);
        output_high(nRF24L01_CSN); //CSN arriba

Saliendo por el osciloscopio la siguiente secuencia,

(http://www.todopic.com.ar/foros/index.php?action=dlattach;topic=30824.0;attach=12207)

¿Alguno entiende que es lo que está pasado aquí?, cada vez entiendo menos el protocolo spi...

Help me please!!!
Título: Re: CCS pic nrf24l01
Publicado por: Nocturno en 29 de Mayo de 2010, 12:57:19
Yo estuve intentándolo durante bastante tiempo y al final abandoné sin éxito con estos módulos.
Sin embargo, sí que conseguí hablar por SPI con ellos; lo que no logré es que hubiera comunicación por radio.

Este es mi nRF24L02.C:

Código: C
  1. /**************** Preprocessor Constants ***************************************/
  2. #define CONFIG             0x20
  3. #define EN_AA              0x21
  4. #define EN_RXADDR          0x22
  5. #define SETUP_AW           0x23
  6. #define SETUP_RETR         0x24
  7. #define RF_CH              0x25
  8. #define RF_SETUP           0x26
  9. #define STATUS             0x27
  10. #define RX_ADDR_P0         0x2A
  11. #define TX_ADDR            0x30
  12. #define RX_PW_P0           0x31
  13. #define FLUSH_TX           0xE1
  14. #define FLUSH_RX           0xE2
  15. #define TX_PAYLOAD         0xA0
  16. #define RX_PAYLOAD         0x61
  17. #define NO_OP              0xFF
  18. #define ZERO               0x00
  19. #define EOT                0x04
  20. #define PAYLOAD_SIZE       0x20
  21. #define start_transmit    {output_high(rf_CE);delay_ms(10);output_low(rf_CE);}  //Pulse NRF24L01 CE pin for 20us
  22.  
  23. int1 rf_interrupt=false;                                                        // Declare interrupt flag default is false
  24. static int16 rf_CE,rf_CSN;                                                      // Declare NRF24L01 SPI CE & CSN pins
  25.  
  26. /**************** Gets The Length Of A Data Packet *****************************/
  27. unsigned int* length(unsigned char *data)
  28. {
  29.    int *cnt;                                                                    // Declare a pointer
  30.    for (cnt = data; *cnt != 0; cnt++);                                          // Loop
  31.    return(cnt - data);                                                          // Return the length of the data                              
  32. }
  33.  
  34. /**************** Write To NRF24L01 Configuration Register *********************/
  35. void set_register(unsigned int command,unsigned char data)
  36. {
  37.    output_low(rf_CSN);                                                          // Engage SPI chip select
  38.       delay_us(5);
  39.    spi_write(command);                                                          // Write to register
  40.    if(data!=NO_OP){spi_write(data);}                                            // Write data to register
  41.    output_high(rf_CSN);                                                         // Dis-engage SPI chip select
  42.    delay_us(10);
  43. }
  44.  
  45. /**************** Write To NRF24L01 Configuration Register *********************/
  46. void set_register(unsigned int command,unsigned char* data)
  47. {
  48.    int i,len;
  49.    len=length(data);                                                            // Get the length of the data
  50.    output_low(rf_CSN);                                                          // Engage SPI chip select
  51.    delay_us(5);
  52.    spi_write(command);                                                          // Write to register
  53.    for(i=0;i<len;i++){spi_write(data[i]);}                                      // Write data to register
  54.    output_high(rf_CSN);                                                         // Dis-engage SPI chip select
  55.    delay_us(10);
  56. }
  57.  
  58. /**************** Enables NRF24L01 Transmit/Receive Mode ***********************/
  59. void transmit_mode(unsigned int1 enable)
  60. {
  61.    output_low(rf_CE);                                                           // Disable receiver
  62.    set_register(STATUS,0x7E);                                                   // Clear all interrupts
  63.    if(enable)
  64.    {
  65.       set_register(FLUSH_TX,NO_OP);                                             // Flush TX FIFO buffer
  66.       set_register(CONFIG,0x52);                                                // Power up in transmit mode
  67.    }
  68.    else
  69.    {
  70.       set_register(FLUSH_RX,NO_OP);                                             // Flush RX FIFO buffer
  71.       set_register(CONFIG,0x33);                                                // Power up in receive mode
  72.       output_high(rf_CE);                                                       // Enable receiver
  73.       delay_us(130);                                                            // Delay 130us
  74.    }
  75. }
  76.  
  77. /**************** Transmits A Single Byte **************************************/
  78. void rf_transmit(unsigned char data)
  79. {
  80.    transmit_mode(true);                                                         // Enable transmit mode
  81.    output_low(rf_CSN);                                                          // Engage SPI chip select
  82.    spi_write(TX_PAYLOAD);                                                       // Select tx payload register
  83.    spi_write(data);                                                             // Write data to tx payload register
  84.    spi_write(EOT);                                                              // End of transmission
  85.    output_high(rf_CSN);                                                         // Dis-engage SPI chip select
  86.    start_transmit;                                                              // Start transmission
  87.    transmit_mode(false);                                                        // Enable receive mode
  88.    delay_ms(50);                                                                // Delay 50ms
  89. }
  90.  
  91. /**************** Transmits A String Of Data ***********************************/
  92. void rf_transmit(unsigned char *string)
  93. {
  94.    int i,len=0;
  95.    char c;
  96.    len=length(string);                                                          // Get the length of the data to transmit
  97.    transmit_mode(true);                                                         // Enable transmit mode
  98.    output_low(rf_CSN);                                                          // Engage SPI chip select
  99.    spi_write(TX_PAYLOAD);                                                       // Select tx payload register
  100.    for(i=0;i<len;i++){
  101.          c=string[i];
  102.          spi_write(c);}                                    // Write data to tx payload register
  103.    spi_write(EOT);                                                              // End of transmission
  104.    output_high(rf_CSN);                                                         // Dis-engage SPI chip select
  105.    start_transmit;                                                              // Start transmission
  106.    transmit_mode(false);                                                        // Enable receive mode
  107.    delay_ms(50);                                                                // Delay 50ms
  108. }
  109.  
  110. /**************** Receive RF Data **********************************************/
  111. unsigned char* rf_receive()
  112. {
  113.       int i;
  114.       static int rf_rx_buffer[PAYLOAD_SIZE]={0};                                // Declare a receive buffer
  115.       rf_interrupt = false;                                                     // Clear interrupt flag
  116.       output_low(rf_CE);                                                        // Disable receiver
  117.       output_low(rf_CSN);                                                       // Engage SPI chip select
  118.       spi_write(RX_PAYLOAD);                                                    // Initialize RX payload register
  119.       for(i=0;i<=PAYLOAD_SIZE;i++)                                        
  120.       {
  121.          rf_rx_buffer[i]=spi_read(RX_PAYLOAD);                                  // Copy data from NRF24L01 to buffer
  122.          if(rf_rx_buffer[i]==EOT){rf_rx_buffer[i]=ZERO;break;}                  // Stop when EOT found
  123.       }
  124.       output_high(rf_CSN);                                                      // Dis-engage SPI chip select
  125.       transmit_mode(false);                                                     // Enable receive mode
  126.       return rf_rx_buffer;                                                      // Return received payload
  127. }
  128.  
  129. /**************** Checks The Status Register ***********************************/
  130. void check_interrupt()
  131. {
  132.    int i,reg;
  133.    output_low(rf_CSN);                                                          // Engage SPI chip select
  134.    for(i=0;i<5;i++){reg=spi_read(0x07)&0xFF;}                                   // Read 5 chars of data from NRF24L01 RX register
  135.    output_high(rf_CSN);                                                         // Dis-engage SPI chip select
  136.    if(reg>>6){rf_interrupt = true;}                                             // If RX_DR set,set data ready flag
  137.    else{set_register(STATUS,0x7E);}                                             // Clear all interrupts
  138. }
  139.  
  140.  
  141. char read_register(unsigned int command)
  142. {
  143.    char dato;
  144.    
  145.    output_low(rf_CSN);                                                          // Engage SPI chip select
  146.    //spi_write(command&0x3F);                                                          // Write to register
  147.    dato=spi_read(command&0x1F);                                            // Write data to register
  148.    dato=spi_read(0xFF);                                            // Write data to register
  149.    output_high(rf_CSN);                                                         // Dis-engage SPI chip select
  150.    delay_us(10);
  151.    return(dato);
  152. }
  153.  
  154. /**************** Initialize NRF24L01 Chip *************************************/
  155. void setup_rf(unsigned int16 CE,unsigned int16 CSN,unsigned int* address,unsigned int CH,unsigned boolean Mbps,unsigned int dBm)
  156. {
  157.    rf_CE=CE;                                                                    // Define CE pin
  158.    rf_CSN=CSN;                                                                  // Define CSN pin
  159.    //setup_spi(SPI_MASTER|SPI_L_TO_H|SPI_XMIT_L_TO_H|SPI_CLK_DIV_64);             // Setup hardware spi
  160.    setup_spi(SPI_MASTER|SPI_L_TO_H|SPI_CLK_DIV_64| SPI_XMIT_L_TO_H | SPI_SAMPLE_AT_END);  // Configura la comunicación SPI
  161.    output_low(rf_CE);                                                           // Disable receiver
  162.    set_register(CONFIG,0x31);                                                   // Power down chip  
  163.    set_register(RF_CH,CH);                                                      // Set RF channel
  164.    set_register(RF_SETUP,(Mbps<<3)|(dBm<<1)|0x01);                              // Set data rate and power level
  165.    //set_register(RF_SETUP,0b00010001);//(Mbps<<3)|(dBm<<1)|0x01);                              // Set data rate and power level
  166.    set_register(SETUP_AW,0x03);                                                 // Set address width to 5 bytes
  167.    set_register(EN_AA,0x0);    //0                                                   // Disable auto acknowledgement
  168.    set_register(SETUP_RETR,0x05);                                             // Set auto retransmission for 5 tries
  169.    set_register(TX_ADDR,address);                                               // Set transmit address
  170.    set_register(RX_ADDR_P0,address);                                            // Set receive address
  171.    set_register(EN_RXADDR,0x00);                                                // Enable RX address 0
  172.    set_register(RX_PW_P0,PAYLOAD_SIZE);                                         // Set RX payload to receive up to 32 characters
  173.    
  174.    
  175.    transmit_mode(false);                                                        // Enable receive mode
  176. }
  177.  
  178. void Lee_registros() {
  179.  
  180.       printf (usb_cdc_putc,"Config %X\n\r",read_register(CONFIG));
  181.       printf (usb_cdc_putc,"RF_CH %X\n\r",read_register(RF_CH));
  182.       printf (usb_cdc_putc,"RF_SETUP %X\n\r",read_register(RF_SETUP));
  183.       printf (usb_cdc_putc,"SETUP_AW %X\n\r",read_register(SETUP_AW));
  184.       printf (usb_cdc_putc,"EN_AA %X\n\r",read_register(EN_AA));
  185.       printf (usb_cdc_putc,"SETUP_RETR %X\n\r",read_register(SETUP_RETR));
  186.       printf (usb_cdc_putc,"TX_ADDR %X\n\r",read_register(TX_ADDR));
  187.       printf (usb_cdc_putc,"RX_ADDR_P0 %X\n\r",read_register(RX_ADDR_P0));
  188.       printf (usb_cdc_putc,"EN_RXADDR %X\n\r",read_register(EN_RXADDR));
  189.       printf (usb_cdc_putc,"RX_PW_P0 %X\n\r",read_register(RX_PW_P0));
  190.  
  191. }

Así es como inicializo el módulo desde el programa principal:
setup_rf(PIN_C1,PIN_C2,address,2,0,3);


Así transmito:
packet[0]='M';
packet[1]='a';
packet[2]='n';
packet[3]='o';
packet[4]='l';
packet[5]='o';
packet[6]=0;
rf_transmit(packet);   

Y así recibo:
check_interrupt();
if(rf_interrupt){
      process_packet(rf_receive());}

Aunque como te digo, la transmisión nunca funcionó.
Título: Re: CCS pic nrf24l01
Publicado por: c4_esp_VR en 29 de Mayo de 2010, 13:45:56
Hola Nocturno,

Primero gracias por el driver, voy a probarlo a ver si a mi me funciona, ya que yo ni siquiera soy capaz de leer y escribir los registros del chip.

Lo digo voy a probarlo y te comento, a ver si dos cabezas pueden mejor que una  ;-)

Un saludete.
Título: Re: CCS pic nrf24l01
Publicado por: c4_esp_VR en 29 de Mayo de 2010, 14:27:22
Sigo sin hacerlo funcionar...me cago en t...¿las patillas de MOSIpic y MOSIRF se ponen juntas al igual que los MISO y el SCK entre ellos, no?. Si esto es así estoy convencido de que es el módulo que no funciona. Lea el registro que lea, siempre me devuelve 0x02...algo estoy haciendo mal, ¿qué podría ser?.

Por otro lado, en algunos códigos he visto que ponen máscaras a la hora de pasarle la dirección del registro, te lo muesto a modo de ejemplo, más que nada a lo mejor era eso lo que no te funcionaba.

Código: [Seleccionar]
void configRegister(unsigned int reg, unsigned int value)
{
    output_low(nRF24L01_CSN);
    spi_write(W_REGISTER | (REGISTER_MASK & reg)); //METEN UNA MÁSCARA
    spi_write(value);
    output_high(nRF24L01_CSN);
}

unsigned int readRegister(unsigned int reg)
{
    int val;
    output_low(nRF24L01_CSN);
    val = spi_read(R_REGISTER | (REGISTER_MASK & reg)); //METEN UNA MÁSCARA
    output_high(nRF24L01_CSN);

    return val;
}

Por otro lado, ¿cuando escribias un dato en el registro luego lo leias y se te había modificado con dicho dato?.

Un saludete y gracias.
Título: Re: CCS pic nrf24l01
Publicado por: Nocturno en 29 de Mayo de 2010, 15:17:06
¿Juntas?, yo no uní ningún par de señales. Cada una de las señales de control del RF iba a un pin del micro.

Y sí, escribía y leía los cambios sin problemas.
Título: Re: CCS pic nrf24l01
Publicado por: c4_esp_VR en 29 de Mayo de 2010, 15:39:04
¿Me refiero si el pin del micro SDO va al MOSI del chip, el pin SDI va al MISO del chip?.

Pues si a ti te leia bien los registros imagino que o bien el módulo está mal o hay algo mál en la velocidad de transmisión. ¿Puedes pasarme el proyecto completo Nocturno?, es decir que tenga los defines del micro el clock, etc...Así al menos podré saber si tengo que matar a algún chino por hacerme perder 3 dias con esto  :5] :5] :5] o tengo que seguir matándome a mi mismo por cansino y no pegarme un tiro  :D

Un saludete y mil gracias compañero.
Título: Re: CCS pic nrf24l01
Publicado por: c4_esp_VR en 29 de Mayo de 2010, 17:04:36
Me cago en to lo que se mene...ayudenmeeee...necesito ayuda...esto es increible...ahora mismo me voy a emborrachar para ver si se me renuevan las neuronas...aaaaaaarrrrrrggggghhhhhhhh...ya sé que estaba mal...

Creia que al ser SPI por HW no hacía falta definir el #use_spi..., ya que al definirse en setup_spi(...) no hacia falta y....!!!HAY QUE DEFINIRLO!!! me cago en to...Si se ven perfectamente las señales en el osciloscopio sin definir el use_spi a que viene este error...esto es más raro que un perro verde...¿qué podría haber pasado si las señales estaban ahí?.

Estas cosas me llevan a la desesperación, tardas más en ver estas tonterias que en hacer un programa...!!!que rabia!!!.

Bueno ahora toca otra parte aún más difícil, que es la comunicación, ya que si Nocturno no ha podido con ello, seguramente no pueda...pero lo intentaré, !!!allá vaaaaaaaaaaaaaaaammmmmooooooooooooooooooooossssssssssssss!!!.

Iré posteando los avances que vaya consiguiendo.

Un saludete.
Título: Re: CCS pic nrf24l01
Publicado por: Nocturno en 29 de Mayo de 2010, 17:09:07
Lo siento, no te puedo pasar el proyecto completo.

Estos son los defines iniciales:
#include <18F2550.h>
#device PASS_STRINGS=IN_RAM
#FUSES HS
#use delay(clock=4M)

El MISO del RF va al SDI del PIC, y el MOSI del RF al SDO del PIC.

Edito tras leer tu último post: ¿ya escribes y lees los registros del RF?
Título: Re: CCS pic nrf24l01
Publicado por: c4_esp_VR en 29 de Mayo de 2010, 17:12:29
Citar
Edito tras leer tu último post: ¿ya escribes y lees los registros del RF?

Si amigo Nocturno, ya leo y edito los registros, pero no sé a que se debe esto de poner el use_spi, ya que podía ver las señales perfectamente en un osciloscopio físico sin la definición del use_spi...

Muchas gracias por la ayuda Nocturno.
Título: Re: CCS pic nrf24l01
Publicado por: c4_esp_VR en 30 de Mayo de 2010, 09:38:09
Hola Nocturno.

Estoy con esto y no veo más que registros por todos lados  :D :D :D, una pregunta rápida, ¿cómo hicestes para comprobar que no te funcionaba?, ¿pusistes 2 transceivers?.

Un saludete y gracias.
Título: Re: CCS pic nrf24l01
Publicado por: Nocturno en 30 de Mayo de 2010, 12:57:01
Yes, my friend.
Título: Re: CCS pic nrf24l01
Publicado por: c4_esp_VR en 30 de Mayo de 2010, 14:10:12
Yo sólo tengo un transceiver y un transmisor nRF2402G y este último tiene un protocolo distinto del transceiver...ya bastante tengo con uno como para liarme con los dos...

Por cierto Nocturno, que error tenias para que no te funcionase, es decir, ¿hicistes algunas pruebas como chequear el registro STATUS?, ahora mismo parece ser que el transceiver está enviando, ya que al enviar un dato el bit TX_DS del registro STATUS está a cero y cuando termina de enviar los datos, TX_DS se pone a uno, parace que al menos anvia...ahora el qué no lo puedo saber ya que no tengo un analizar de espectros...

¿Podrías decirme si acotaste algo el error que tenias?, es decir sabias que transmitia pero no recibia, chequebas algunos registros, etc...de esta forma sabria donde tengo que centrarme más.

Un saludete y gracias compañero.
Título: Re: CCS pic nrf24l01
Publicado por: Nocturno en 30 de Mayo de 2010, 14:16:46
Mi prueba se limitó a poner uno a enviar continuamente y a intentar recibir la información en el otro.
Efectivamente chequeaba el registro Status y veía lo mismo que tú.
En el receptor, me quedaba a la espera que el pin de Interrupción cambiase de estado, avisando de que había recibido algo, y aquello no se movía nunca.
Recuerdo que jugando con el pin de interrupción, forzándolo a un valor, o ignorando su valor, en alguna ocasión conseguí recibir lo que enviaba el emisor, pero nunca más fui capaz de reproducir aquel éxito.
En fin, los plazos de entrega me comían, y tuve que optar por montar Xbee.
Título: Re: CCS pic nrf24l01
Publicado por: c4_esp_VR en 30 de Mayo de 2010, 14:22:47
Citar
Mi prueba se limitó a poner uno a enviar continuamente y a intentar recibir la información en el otro.
Efectivamente chequeaba el registro Status y veía lo mismo que tú.
En el receptor, me quedaba a la espera que el pin de Interrupción cambiase de estado, avisando de que había recibido algo, y aquello no se movía nunca.
Recuerdo que jugando con el pin de interrupción, forzándolo a un valor, o ignorando su valor, en alguna ocasión conseguí recibir lo que enviaba el emisor, pero nunca más fui capaz de reproducir aquel éxito.
En fin, los plazos de entrega me comían, y tuve que optar por montar Xbee.

Gracias por la info. la verdad es que viendo lo que me comentas cada vez tengo menos esperanzas de hacerlo funcionar, voy a luchar todo lo que pueda...!!!Sin dolor no hay éxito!!!...voy a ver si me flajelo un ratico  :D :D :D
Título: Re: CCS pic nrf24l01
Publicado por: Nocturno en 30 de Mayo de 2010, 14:40:37
Seguro que lo consigues. La clave del éxito es "despacito y buena letra" y yo tenía prisa, además de una caligrafía de pena.
Título: Re: CCS pic nrf24l01
Publicado por: Lobo_Azul en 30 de Octubre de 2010, 18:46:15
Saludos, quisiera saber si al final pudiste hechar a andar este dispositivo compañero c4_esp_VR, ya que de igual forma utilizaré un módulo como éstos, pero ya no veo que publiques nada al final, de todas formas gracias, y si pudieras subir lo que hiciste o dar algunos tips lo agradecería bastante, gracias.  :P
Título: Re: CCS pic nrf24l01
Publicado por: droky en 30 de Octubre de 2010, 21:05:58
Hola,
Mikroelectronika ha sacado una placa para 24F y 33 que incorpora opcionalmente un módulo RF de estos. Miradla en el lateral izquierdo:
(http://www.mikroe.com/img/development-tools/pic24-dspic33/easy24-33-v6/gallery/easy24_33_v6_01.jpg)

Quizás se pueda sacar algo para portar a CCS de los examples que aún no tienen disponibles  (coming soon) en la página aqui (http://www.mikroe.com/eng/products/view/494/easy24-33-v6-development-system/#/)
Yo tambien tengo unos módulos de estos muertos de risa y desanimado sin haberlos ni siquiera probado, por haber leído vuestras experiencias.
De momento me apaño con unos módulos bluetooth.
Habrá que estar ojo avizor.
Salu2
Título: Re: CCS pic nrf24l01
Publicado por: Lobo_Azul en 30 de Octubre de 2010, 21:25:14
:O orale pues se ve chido ese ,odulazo, pero para estarlo comprando :P, jejeje, prefiero probarlos a como los tengo, gracias....
Título: Re: CCS pic nrf24l01
Publicado por: c4_esp_VR en 31 de Octubre de 2010, 06:01:42
Hola Lobo_Azul,

Desgraciadamente, al final no tuve tiempo para seguir con el proyecto y lo abandoné…Lo siento, de todas formas, si te adentras en este mundo y necesitas ayuda, intentaré dártela por este hilo.

Un saludete.
Título: Re: CCS pic nrf24l01
Publicado por: Lobo_Azul en 31 de Octubre de 2010, 15:05:04
Ok, gracias, entiendo tus razones, no hay problema, en cambio yo si lo necesito armar, y pues si, ahi molestare con algunas preguntas :P a ver si me hechan la mano, gracias.
Título: Re: CCS pic nrf24l01
Publicado por: xootraoox en 06 de Abril de 2011, 00:28:27
Hola Nocturno, sabes tengo una duda... he pillado esta libreria que usaste en algun momento en los foros de CCS, pero he notado que la Funcion set_register esta declarada 2 veces, es correco esto?, es valido?

Código: [Seleccionar]
/**************** Write To NRF24L01 Configuration Register *********************/
void set_register(unsigned int command,unsigned int data){
output_low(rf_CSN); // Engage SPI chip select
spi_write(command); // Write to register
// Write data to register
if(data!=NO_OP){
spi_write(data);
}                                           
output_high(rf_CSN); // Dis-engage SPI chip select
delay_us(10);
}

/**************** Write To NRF24L01 Configuration Register *********************/
void set_register(unsigned int command,unsigned int* data){
int i,len;
len=length(data); // Get the length of the data
output_low(rf_CSN); // Engage SPI chip select
spi_write(command); // Write to register
for(i=0;i<len;i++){spi_write(data[i]);} // Write data to register
output_high(rf_CSN); // Dis-engage SPI chip select
delay_us(10);
}
Título: Re: CCS pic nrf24l01
Publicado por: Nocturno en 06 de Abril de 2011, 01:41:39
Sí que se puede hacer, eso es Sobrecarga de funciones (http://www.mailxmail.com/curso-programacion-c/sobrecarga-funciones-operadores)
Título: Re: CCS pic nrf24l01
Publicado por: xootraoox en 06 de Abril de 2011, 09:04:57
Muy agradecido... es la primera vez en tanto tiempo que me topo con esto.
Título: Re: CCS pic nrf24l01
Publicado por: Alcaparrones en 01 de Mayo de 2011, 06:48:13
Muy buenas

Casualmente estaba buscando información sobre este transceptor tan barato y potente, y he llegado hasta aquí. Aún no lo tengo en mi poder pero si he descubierto bastante documentación. El caso es que a primera vista no es que me parezca presisamente fácil de manejar (para mí todo lo que no sea usar el rs232 en CCS es ingeniería aeroespacial). De todas formar hay un colega en los foros de CCS con un código que funciona: http://www.ccsinfo.com/forum/viewtopic.php?p=104811
La cuestión es que el muchacho pregunta sobre la implementación del shockburst (creo que permite usar microcontroladores poco potentes sin problemas) y el auto ack. Y de paso le recomiendan este enlace, super completo: http://blog.diyembedded.com/

En fin, realmente creo que merece la pena hacer el esfuerzo de echar a andar estos módulos, tan baratos y potentes. A ver que tal  :-/
Título: Re: CCS pic nrf24l01
Publicado por: redep en 05 de Noviembre de 2011, 09:09:26
Estoy trabajando en el proyecto de comunicar dos PIC 18f2550 de forma inalambrica a traves de la UART, por calidad precio he elegido (http://www.ebay.com/itm/4PCS-Arduino-NRF24L01-Wireless-Transceiver-Module-/250886352163?pt=LH_DefaultDomain_0&hash=item3a69fded23#ht_2740wt_954) que es simplemente el chip NRF24L01 del cual estabais hablando en este hilo, sino estoy equivocado el pin out es el siguiente:

1:GND
2:VCC(3.3v)
3:CE(AUX)
4:CSN(CS)
5:CLK
6:MOSI
7:MISO
8:IRQ

Segun he leido el primer paso es hacer una configuracion previa a traves de comunicacion SPI para despues hacer la comunicacion a traves de uart.

Me gustaria saber si finalmente existe alguna libreria para CCS.

Y otra de mis preguntas es que el pin de SPI y el de la UART(RX) coinciden en mi PIC(tambien me he dado cuenta de que en otros pic tambien coincide) es posible utilizarlo con este integrado.


Por ultimo decir, si me recomendais otro integrado que sea igual de efectivo y con menos problemas que este(lo de problemas lo digo por lo que he leido).
Espero vuestra ayuda
Título: Re: CCS pic nrf24l01
Publicado por: avilchez en 16 de Febrero de 2012, 07:40:45
Hola, ¿al final consiguió alguien algo con el famoso módulo nrf24l01?
Por favor estoy interesado, yo también vi los módulos que venden por ebay pero no se cómo utilizarlo junto al pic 18f452

Cualquier tipo de ayuda me será válida.
Gracias.
Título: Re: CCS pic nrf24l01
Publicado por: sanpic en 08 de Marzo de 2012, 07:14:22
Creo que en el enlace antes mencionado , ya el autor lo tenia funcionando.

http://www.ccsinfo.com/forum/viewtopic.php?t=47351&highlight=nrf24l01


Saludos a todos.
Título: Re: CCS pic nrf24l01
Publicado por: cuico en 27 de Julio de 2012, 18:53:40
Hola chicos como estan???

Espero que la mayoria no haya abandonado el proyecto con estos módulos. Yo he estado trabajando con ellos y hasta el momento la mitad de mi experiencia es buena... la otra mitad son tinieblas. Y bien antes de comenzar contando mi experiencia les digo lo que he ocupado:

PIC 16F877
Modulos NRF24L01+

He descargado varias librerias pero ninguna ha sido tan clara como la de un colega de nombre Biblioman, de hecho el hizo un video acerca del funcionamiento de estos modulos muy sencillo. Aqui se los pongo


Como pueden ver es muy sencillo en el video, solo conecta el modulo al pic de la siguiente forma:

MOSI --> SDO o MOSI
MISO --> SDI, SDA, o MISO
SCK --> SCK,
IRQ --> RB0 (usa INT_EXT)
CSN -- RB5 (Este pin esta normalmente en high es el Chip Select Nop, en low para avisar al modulo que hay SPI entrante)
CE --> RC2 (Este pin se manda a high cuando se quiere hacer RX o TX, en low para ponerlo en standby)

Ahora bien aclarando una de las dudas del principio en este tema es:

el compañero c4_esp_VR, dijo que no sabia por que el modulo respondia si apenas se estaba comunicando con el.

(http://www.todopic.com.ar/foros/index.php?action=dlattach;topic=30824.0;attach=12205)

La respuesta es que el modulo al recibir el primer byte (command byte) regresa por el otro canal el registro STATUS y esto es SIEMPRE. Incluso si envian un FLUSH, un W_TX_PAYLOAD etc...

ahora bien, lo que personalmente he logrado es leer todos los registros, escribir en los que se puede escribir ya que hay algunos que son solo lectura, he podido subir información al TX FIFO para enviarlo, pero he llegado solo hasta ahi no he podido enviar satisfactoriamente datos a otro modulo. Supongo que es cuestión de poner cuidado en la programación de las direcciones de transición y recepción, la configuración de los pipes de recepción asi como habilitar los auto-ack.

Si alguien quiere trabajar en conjunto con estos módulos avísenme. Mi correo personal para cualquier cosa es amigocui@hotmail.com.

Saludos
Título: Re: CCS pic nrf24l01
Publicado por: Oceano en 05 de Octubre de 2012, 21:37:25
Hola cuico,

Te conozco de leer tus estupendas aportaciones en otro foro.

He conseguido hacerlo funcionar, pero en vez de usar dos 16F877, he usado dos 16F876. No importa el PIC mientras tenga patillas para el SPI, especialmente MISO, MOSI, IRQ y SCK, las demás son configurables.

Para no volver a copiar lo mismo en dos lugares distintos te pongo el enlace directo para que veas cómo lo realicé:

Uso todo lo que expuso Biblioman, sólo he eliminado y añadido algunas cosas a sus programas originales.

http://www.aquihayapuntes.com/foro/viewtopic.php?f=23&t=215&hilit=nrf24l01&start=106

Saludos y suerte.
Título: Re: CCS pic nrf24l01
Publicado por: cuico en 05 de Octubre de 2012, 21:42:46
Hey Hola :)

No he podido trabajar en los modulos por cuestiones de trabajo desde mi ultimo post, prometi una libreria facil de usar, y prometo hacerla en cuanto este un poquito libre. He seguido con detalle los avances de todos. ;) Saludos
Título: Re: CCS pic nrf24l01
Publicado por: miquel en 08 de Octubre de 2012, 21:21:56
No he trabajado nunca con el nrf24l01, pero si lo he hecho con el nrf905 y recuerdo que no logré que funcionara con las funciones nativas de spi del CCS. Conseguí que funcionara utilizando las funciones spi por software, lamentablemente no dispongo del código que he utilizado pues me encuentro de viaje y no regreso a mi domicilio en Barcelona hasta diciembre.
He encontrado un código parecido al código en que me basé. Las funciones spi están al final:

void spiWrite(INT8U dat)
INT8U spiRead(void)




Código: [Seleccionar]
#include <htc.h>
#include "delay.h"
#include "nRF905.h"

/*
****************************************************************************************
* Instruction set for the nRF905 SPI interface; refer to page 16 of nRF905 datasheet
* The available commands to be used on the SPI interface is shown below. Whenever
* CSN is set low the interface expects an instruction. Every new instruction must be
* started by a high to low transition on CSN.
* A read or a write operation may operate on a single byte or on a set of succeeding
* bytes from a given start address defined by the instruction.
****************************************************************************************
*/
#define WRC 0x00 //Write configuration register command
#define RRC 0x10 //Read configuration register command
#define WTP 0x20 //Wrte TX Payload command
#define RTP 0x21 //Read TX Payload command
#define WTA 0x22 //Write TX Address command
#define RTA 0x23 //Read TX address command
#define RRP 0x24 //Read RX Payload command
#define CC 0x80 //Channel configuration

#define OUTPUT 0
#define INPUT 1
#define HIGH 1
#define LOW 0

typedef struct _RFconfig
{
INT8U n;
INT8U buf[10]; //RF-CONFIG REGISTER (refer to page 20 of nRF905 datasheet)
}RFconfig;

/*
* Initialization of the Register Contents at byte# 0 - 9 as stated on page 20 of nRF905 datasheet
*/
const RFconfig RxTxconfig =
{
10,
0x01, //byte# 0 : set the channel # to 1
0x0e, //byte# 1 : 0bxx[AUTO_RETRAN<5>][RX_RED_PWR<4>][PA_PWR<3:2>][HFREQ_PLL<1>][CH_NO[8]<0>]
// 0b00001100 => AUTO_RETRAN=0; No retransmission of data packet
// RX_RED_PWR=0; Normal operation
// PA_PWR=11; +10dBm output power
// HFREQ_PLL=1; chip operating in 868 MHz band
// CH_NO[8]=0; 9th bit of CH_NO is zero
0x44, //byte# 2 : TX_AFW[2:0]=100 => 4 byte TX address field width
  // RX_AFW[2:0]=100 => 4 byte RX address field width
0x20, //byte# 3 : RX_payload width of 32 bytes
0x20, //byte# 4 : TX_payload width of 32 bytes
0xcc, //byte# 5 : RX_ADDRESS byte 0
0xcc, //byte# 6 : RX_ADDRESS byte 1
0xcc, //byte# 7 : RX_ADDRESS byte 2
0xcc, //byte# 8 : RX_ADDRESS byte 3; thus the RX ADDRESS is configured to 0xcccccccc in this example
//remarks : The default value is 0xE7E7E7E7
0x58 //byte# 9 : Set the CRC_MODE, CRC_EN, XOF[2:0], UP_CLK_EN, UP_CLK_FREQ[1:0] bit values
// In this configuration, we are doing CRC enable for 8 CRC check bit, 16MHz crystal freq,
// and output clock disable
};

/*
**********************************************************************************************************
void rfSetChannel(void)
{
static INT8U tmp;

RACSN = LOW;
spiWrite(RRC|0x01); //read the configuration address starting address 1
tmp = spiRead()&0xfc; //clear the relevant HFREQ_PLL and CH_NO[8] bits
RACSN = HIGH;

RACSN = LOW;
spiWrite(WRC); //write the configuration register starting from address 0
spiWrite((INT8U)CHANNEL); //write bit[7:0] of the channel, leaving CH_NO[8] in the second register
spiWrite(tmp|(HFREQ<<1)|((CHANNEL>>8)&0x01));
RACSN = HIGH;
}
**********************************************************************************************************
*/


/* declaration of Tx and Rx buffers */
INT8U TxBuf[32];
INT8U RxBuf[32];

/*
ShockBurst TX routine, send the whole paylod buffer in 32 bytes to a designated receiving node (TX-address)
*/
void rfTxPacket(void)
{
INT8U i;

PWR = HIGH;
TXEN = HIGH;
TRX_CE = LOW;

RACSN = LOW; //chip select
spiWrite(WTA); //write 4 bytes TX-ADDRESS
for(i=0; i<4; i++)
{
spiWrite(RxTxconfig.buf[i+5]);
}
RACSN = HIGH;

for(i=0;i<200;i++);

RACSN = LOW; //chip select
spiWrite(WTP);
for (i=0;i<32;i++)
{
spiWrite(TxBuf[i]); //write payload data here
}
RACSN = HIGH; //chip de-select

TRX_CE = HIGH; //radio enabled
DelayUs(20);
TRX_CE = LOW; //Since no auto-transmit in this example
//TRX_CE set low for standby mode
}


void rfRxPacket(void)
{
INT8U i;

TRX_CE = LOW; //switch to standby mode
RACSN = LOW; //chip select
spiWrite(RRP); //read payload command
for(i=0;i<32;i++)
RxBuf[i] = spiRead();
RACSN = LOW;
while(DR||AM);
TRX_CE=HIGH;
}


void rfConfig905(void)
{
INT8U i;

PWR = HIGH;
TRX_CE = LOW;

RACSN = LOW; //chip enable
spiWrite(WRC); //repeat SPI write
for(i=0;i<RxTxconfig.n;i++)
{
spiWrite(RxTxconfig.buf[i]);
}
RACSN = HIGH; //chip disable
}

void rfSetRxMode(void)
{
/* Set Receive mode */
PWR = HIGH;
TXEN = LOW;
TRX_CE = HIGH;
/* After 650us nRF905 is monitoring the air for incoming communication */
DelayUs(200);
DelayUs(200);
DelayUs(200);
DelayUs(50);
}

void rfInitIO(void)
{
RACSN = HIGH; //de-select the RF module to start with
TRIS_RACSN  = OUTPUT;
SPI_SCK = LOW; //clock line low to start with
TRIS_SPI_SCK  = OUTPUT;
TRIS_SPI_MOSI = OUTPUT;
TRIS_SPI_MISO = INPUT;

TRIS_PWR = OUTPUT;
TRIS_TRX_CE = OUTPUT;
TRIS_TXEN = OUTPUT;

TRIS_CD = INPUT;
TRIS_AM = INPUT;
TRIS_DR = INPUT;
}

void spiWrite(INT8U dat)
{
/* software SPI, send MSB first */
static INT8U i, c;

c = dat;
for(i=0;i<8;i++)
{
if((c&0x80)==0x80)
SPI_MOSI = HIGH;
else
SPI_MOSI = LOW;

SPI_SCK = HIGH;
c=c<<1;
SPI_SCK = LOW;
}
}

INT8U spiRead(void)
{
/* software SPI read, MSB read first */
static INT8U i, dat;

for(i=0;i<8;i++)
{
dat = dat<<1;
SPI_SCK = HIGH;
if(SPI_MISO)
dat = dat+1;
SPI_SCK = LOW;
}

return dat;
}

void rfSetPwrOff(void)
{
PWR = LOW;
}


Saludos,

Miquel
Título: Re:CCS pic nrf24l01
Publicado por: ARmando1955 en 09 de Abril de 2016, 00:24:50
Buenas noches a todos, soy algo nuevo en este foro. He estado intentando enviar datos recibidos desde el ADC por medio de estos modulos, pero no he tenido exito. Estoy haciendo uso de la libreria editada para el PIC18F4550(asi como estoy usando este mismo micro para el emisor asi como el receptor). Quien pudiera ayudarme le agradeceria de antemano. he aqui los codigos:

Se que es posible enviar datos de este tipo, puesto que he visto codigos en arduino y se puede hacer.

Saludos desde Venezuela