Autor Tema: [AYUDA]Leer ADC XBee S2 con PIC  (Leído 2577 veces)

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

Desconectado alkonosst

  • PIC10
  • *
  • Mensajes: 3
[AYUDA]Leer ADC XBee S2 con PIC
« en: 07 de Septiembre de 2014, 03:23:07 »
Hola muy buenas, estoy haciendo un proyecto para mi universidad, tengo 2 XBee S2 y 1 PIC 18f4550 configurados en la siguiente manera:

1° XBee como ZIGBEE ROUTER API, a éste le tengo conectado un sensor de humedad a la entrada análoga AD3, que me tira de 0 a 3.3v, pero lo puse en un divisor resistivo y obtengo desde 0 a 1.2v (que es lo máximo que lee el ADC del XBee)

2° XBee como ZIGBEE COORDINATOR API, a éste le llega la señal análoga del otro XBee, y la manda por tramas 22 bytes en serie. Esta trama la conecté al PIC para leer la trama

y pues, estoy programando con el compilador CCS. Intenté hacer una interrupción para que cuando hayan datos en el puerto serie, se active ésta, y lo siguiente fue guardar solo 2 bytes que son los que me interesan (2 bytes del ADC del XBee), pero no funciona, creo que estoy haciendo algo mal o no se.

Por eso pido ayuda, no se como hacer esto :/

En resumen, los XBee:

Coordinador (nada en especial, solo configure la PAN ID, y modo API):


Router (configure el puerto D3 para ADC, y envía los datos cada 2000 milisegundos, en hexadecimal es 7D0):


Programa en CCS:
Código: CSS
  1. #include <18F4550.h>
  2. #device ADC=16
  3.  
  4. #FUSES NOWDT                    //No Watch Dog Timer
  5. #FUSES WDT128                   //Watch Dog Timer uses 1:128 Postscale
  6. #FUSES NOFCMEN                  //Fail-safe clock monitor disabled
  7. #FUSES NOIESO                   //Internal External Switch Over mode disabled
  8. #FUSES PUT                      //Power Up Timer
  9. #FUSES NOBROWNOUT               //No brownout reset
  10. #FUSES NOVREGEN                 //USB voltage regulator disabled
  11. #FUSES NOPBADEN                 //PORTB pins are configured as digital I/O on RESET
  12. #FUSES NOLPT1OSC                //Timer1 configured for higher power operation
  13. #FUSES NOSTVREN                 //Stack full/underflow will not cause reset
  14. #FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
  15. #FUSES NOXINST                  //Extended set extension and Indexed Addressing mode disabled (Legacy mode)
  16.  
  17. #use delay(crystal=4MHz)
  18. #use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8,stream=PORT1)
  19.  
  20. #include <flex_lcd.h>
  21.  
  22. int msb, lsb;
  23. char serie[22];
  24.  
  25. #INT_RDA
  26. void  RDA_isr(void)
  27. {
  28.    gets(serie);
  29.    msb=serie[20];
  30.    lsb=serie[21];
  31. }
  32.  
  33. void main()
  34. {
  35.    lcd_init();
  36.  
  37.    enable_interrupts(INT_RDA);
  38.    enable_interrupts(GLOBAL);
  39.  
  40.    while(TRUE)
  41.    {
  42.       lcd_gotoxy(1,1);
  43.       printf(lcd_putc, "Recibido: %X, %X", msb, lsb);
  44.    }
  45. }

Y bueno, en conexiones, conecté el pin DOUT del XBee, al pin RX del PIC, y las tierras las conecté entre si para tener tierra común. Por cierto, la BAUD RATE de los XBees es de 9600.

Agradecería cualquier ayuda, necesito entregar luego este proyecto, muchas gracias

Desconectado hector915

  • PIC12
  • **
  • Mensajes: 78
    • Blog Personal.
Re: [AYUDA]Leer ADC XBee S2 con PIC
« Respuesta #1 en: 07 de Septiembre de 2014, 13:50:45 »
Saludos,
podrias utilizar alguna operacion logica para solo obtener el MSB o LSB.


if you can imagine it, you can embed it

Desconectado alkonosst

  • PIC10
  • *
  • Mensajes: 3
Re: [AYUDA]Leer ADC XBee S2 con PIC
« Respuesta #2 en: 07 de Septiembre de 2014, 16:03:28 »
Saludos,
podrias utilizar alguna operacion logica para solo obtener el MSB o LSB.




algun ejemplo?

bueno, he estado averiguando, y la funcion gets() necesita un CR (retorno de carro), cosa que la trama del xbee no manda, asi que se queda pegado en esa funcion esperando al CR...
estoy intentando usar solo getchar(), y un for(), cosa de que me lea byte por byte hasta llegar al que quiero, algo asi:

Código: CSS
  1. #INT_RDA
  2. void  RDA_isr(void){
  3.    read = getc();
  4.    if (read == 0x7E){
  5.       for(i=0;i<21;i++){  
  6.        read = getc();  
  7.       }                                                              
  8.    }    
  9.    else
  10.    read = getc();
  11. }

el read==0x7E es para saber si la trama empieza con 7E,  ya que este byte es el que da comienzo a la trama del Xbee.

bueno, estoy algo perdido con esto, alguien puede ayudarme?

Desconectado jhozate

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1698
Re: [AYUDA]Leer ADC XBee S2 con PIC
« Respuesta #3 en: 07 de Septiembre de 2014, 18:21:41 »
ten en cuenta que el for es una rutina bloqueante, por lo tanto no saldra de ahi hasta que no termine de ejecutarlo, se me ocurre algo asi:

Código: [Seleccionar]
#INT_RDA
void RDA_ISR(void)
{
c=getc();
flag_add2buff=1;
}

en el main revisas el flag, y llamas unas funcion que almacene los datos
Código: [Seleccionar]
if(flag_add2buff==1)
{
almacenar(c);
flag_add2buff=0;
c=0;
}

en la funcion almacenar
 
Código: [Seleccionar]
VOID almacenar(char c)
{
switch(estado)
{
 case 0:  if(c==0x7E)
              {
               estado++;
               }
             break;
case 1:  buffer[index++]=c;
             if(index>=21){index=0;}
             break;
}
}

entonces esta funcion recibe el caracter de la uart, revisa si es 0x7E, en caso de serlo aumenta el estado, lo que quiere decir que la proxima vez empieza almacenar los 22bytes.
Pude haber olvidado algun detalle, pero esa es la idea
Ser Colombiano es un Premio, Saludos desde CALI-COLOMBIA

Desconectado alkonosst

  • PIC10
  • *
  • Mensajes: 3
Re: [AYUDA]Leer ADC XBee S2 con PIC
« Respuesta #4 en: 07 de Septiembre de 2014, 21:23:17 »
ten en cuenta que el for es una rutina bloqueante, por lo tanto no saldra de ahi hasta que no termine de ejecutarlo, se me ocurre algo asi:

Código: [Seleccionar]
#INT_RDA
void RDA_ISR(void)
{
c=getc();
flag_add2buff=1;
}

en el main revisas el flag, y llamas unas funcion que almacene los datos
Código: [Seleccionar]
if(flag_add2buff==1)
{
almacenar(c);
flag_add2buff=0;
c=0;
}

en la funcion almacenar
 
Código: [Seleccionar]
VOID almacenar(char c)
{
switch(estado)
{
 case 0:  if(c==0x7E)
              {
               estado++;
               }
             break;
case 1:  buffer[index++]=c;
             if(index>=21){index=0;}
             break;
}
}

entonces esta funcion recibe el caracter de la uart, revisa si es 0x7E, en caso de serlo aumenta el estado, lo que quiere decir que la proxima vez empieza almacenar los 22bytes.
Pude haber olvidado algun detalle, pero esa es la idea

lo arregle por mi mismo! gracias de todos modos :D
dejare el codigo aca abajo, por si a alguien le sirva o tenga la misma duda :)

interrupcion por rs232:
Código: CSS
  1. int msb,lsb;
  2. int i;
  3. int8 buffer[22];
  4. int read;
  5.  
  6. #INT_RDA
  7. void  RDA_isr(void)
  8. {
  9.    read = getc();
  10.    if (read == 0x7E){
  11.       for(i=2;i<22;i++){  
  12.          buffer[i] = getc();                      
  13.       }          
  14.       msb=buffer[20];
  15.       lsb=buffer[21];                                  
  16.    }    
  17. }

despues de eso, puedo hacer lo que quiera con los datos que me manda el xbee (adc), como ejemplo transformarlos a una lectura del sensor.

saludos a todos!


 

anything