Autor Tema: Recibir una trama del XBEE  (Leído 2056 veces)

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

Desconectado lenders75

  • PIC10
  • *
  • Mensajes: 10
Recibir una trama del XBEE
« en: 31 de Enero de 2015, 14:11:12 »
Hol amigos

Me podrían orientar   como recibir esta trama que me envía el Xbee. En  dicha trama en los bit 20 y 21 me da la lectura de un sensor de temperatura. La entrada analogica del xbee trabaja de 0 a 1.2 v y va de 0000 a 03ff. En esta trama me da una lectura 0216 que corresponde a 0.626 v pero no se como hacer esa conversion Y tampoco logro visualizarlo,

7E 0012 92 0013A200 403D0192 15 7B 01 01 00 00 01 02 16 FD

Código: [Seleccionar]
#include "C:\CCS\pic876\pic876.h"


#define LCD_DB4   PIN_B4
#define LCD_DB5   PIN_B5
#define LCD_DB6   PIN_B6
#define LCD_DB7   PIN_B7
#define LCD_RS    PIN_B1
#define LCD_E     PIN_B0


#include "C:\CCS\pic876\lcd1.c"

char dato_recibido[22];                /// Guardo los datos recibidos por rs232
float Tension_1,Tension_2 ;  // Variable para guardar la tensión que lee el xbee


void lcd_saludo_inicial(void);

void main()
{
//----Inicializo el LCD y muestro el saludo inicial------



set_tris_b(0b00000000);
lcd_init();
lcd_saludo_inicial();

lcd_gotoxy(1,1);
lcd_putc("Comunicacion RS232");
   gets(dato_recibido); //Recibimos  dato
Tension_1= (float)dato_recibido[20]*1.2/1024;
Tension_2= (float)dato_recibido[21]*1.2/1024;
    delay_ms(20);



Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Recibir una trama del XBEE
« Respuesta #1 en: 31 de Enero de 2015, 20:09:41 »
Estas recibiendo bien el dato ? por que por ejemplo veo que tiene un Length ( que podria ser variable ) pero vos estas asumiendo SI o SI que es 18

Luego deberias juntar los 2 dato_recibido[20] y [21] en una nueva variable

int16 lectura = dato_recibido[20] < 8 & dato_recibido[21];
float Tension = (float)lectura * 1.2 /1024  // o tal ves probaria con : (float)(lectura * 6 /  5120) no se que es mejor

Al menos es lo que haria, pero fijate bien ese tema del largo de la trama, imagino que si te dan eso es por que puede variar

Desconectado lenders75

  • PIC10
  • *
  • Mensajes: 10
Re: Recibir una trama del XBEE
« Respuesta #2 en: 01 de Febrero de 2015, 19:51:00 »
El tamaño de la trama es siempre de 22 , ya que tengo configurado el xbee para que me mande una lectura del puerto D0 cada 1 segundo, la cual es recibida por el otro XBEE coordinador. Conectando el XBEE coordinador al pc por medio del software XCTU recibo bien la lectura del otro XBEE, el problema me aparece cuando lo conecto al pic y quiero visualizar la lectura en un LCD, que no me muestra nada.

Código: [Seleccionar]
#include "C:\CCS\pic876\pic876.h"


#define LCD_DB4   PIN_B4
#define LCD_DB5   PIN_B5
#define LCD_DB6   PIN_B6
#define LCD_DB7   PIN_B7
#define LCD_RS    PIN_B1
#define LCD_E     PIN_B0
#define LCD_RW    PIN_C1   //Posición del PIN RW

#include "C:\CCS\pic876\lcd1.c"

    float Tension;
    int msb,lsb;
    int i;
    int8 buffer[22];
    int  read;
    int16 lectura;
    #INT_RDA
    void  RDA_isr(void)
    {
       read = getc();
      if (read == 0x7E){
         for(i=2;i<22;i++)
         {
            buffer[i] = getc();                     
         }         
         msb=buffer[20];
         lsb=buffer[21];
         
      }   
    }

void lcd_saludo_inicial(void);

void main()
{
//----Inicializo el LCD y muestro el saludo inicial------



set_tris_b(0b00000000);
lcd_init();
lcd_saludo_inicial();

lcd_gotoxy(1,1);
lcd_putc("Comunicacion RS232");
  enable_interrupts(INT_RDA);
  enable_interrupts(GLOBAL);
 
 lectura = buffer[20] < 8 & buffer[21];
 Tension = (float)lectura * 1.2 /1024; 
  while(TRUE)
  {
     lcd_gotoxy(1,2);
     printf(lcd_putc, " %X, %X", msb, lsb);
  }
   

}
//-------------------------------------------------------
//FUNCIONES
//-------------------------------------------------------
//Imprime saludo inicial.

void lcd_saludo_inicial(void)
{
lcd_gotoxy(2,1);                //Posición 2, fila 1
Lcd_putc("***DPP 2014***");     // Escribo en la primera fila
delay_ms(1000);                 // Reatardo de 1 segundo
lcd_gotoxy(4,2);                //Posición 4, fila 2
Lcd_putc("LCD en CCS");         // escribo en la segunda fila
delay_ms(5000);                 // Retardo de 5 segundos
Lcd_putc("\f");                 // Limpio pantalla


}


No sé porque no me muestra nada. Me muestra los mensajes de presentación pero no la lectura analógica en hexadecimal. ¿qué puedo estar haciendo mal?

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Recibir una trama del XBEE
« Respuesta #3 en: 02 de Febrero de 2015, 05:36:40 »
Bueno parece que tenes un problema en la UART, esta bien configurada la UART ?

Pregunto por que no veo nada de esto (por ejemplo):

#use delay(clock=8000000)
#use rs232(baud=9600, parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)

Lo unico a notar es que te quedaria un dato en la UART por que estas haciendo de 2 a 21 y no de 1 a 21. (El bit de comienzo es el 0 que lo sacaste)
Probaste con un led si entra a la interrupcion ? al menos que si entro se prenda un led y si entra a la parte cuando le asigna msb/lsb tambien. De esa forma sabes que al menos esos valores llegaron.
Te lo digo por que getc() se queda esperando ahi hasta que reciba algo, si no recibe nada entonces se quedaria ahi el codigo para siempre.

Tambien podrias mostrar todos los valores que tenes en "buffer" en el LCD. O directamente no te muestra NADA de NADA en el LCD, sino te muestra absolutamente nada de seguro que se queda ahi en la interrupcion.
« Última modificación: 02 de Febrero de 2015, 05:40:13 por KILLERJC »

Desconectado lenders75

  • PIC10
  • *
  • Mensajes: 10
Re: Recibir una trama del XBEE
« Respuesta #4 en: 02 de Febrero de 2015, 20:54:57 »
Hola, sigo sin avanzar nada.

 En cuanto a la configuración de la UART la tengo en el fichero .h
#use delay(clock=4000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)

Hice lo que comentaste de encender un led y una vez que entra no sale de la interrupción, algo tengo mal en el codigo porque el XBEE lo tengo configurado para que mande una trama cada 5 segundos.

Código: [Seleccionar]
#include "C:\CCS\LED\led.h"
#use fast_io(B)

  // char msb,lsb;
  //  char i;
  //  char buffer[22];
   // char  read;
   // char lectura;
   
    #INT_RDA
    void  RDA_isr(void)
    {
     Output_low(PIN_B7) ;
     Output_high(PIN_B6) ;
      delay_ms(1000);     
       
       
      }   


void main()
{
Set_tris_B(0x00) ; // Configura en cero, osea
                    //se configura como salida
Output_low(PIN_B7) ;// Sea paga led
Output_low(PIN_B6) ;
  enable_interrupts(INT_RDA);
  enable_interrupts(GLOBAL);
 
 while(TRUE)
{
 Output_low(PIN_B6) ;
 Output_high(PIN_B7) ;
   delay_ms(1000); 
}
}

Este es codigo que use.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Recibir una trama del XBEE
« Respuesta #5 en: 02 de Febrero de 2015, 21:15:06 »
Con ese codigo seguro te va a fallar, ya que la limpieza del flag de recepcion se realiza cuando lees el registro RCREG del micro ( es decir lees lo que llego ), al no leerlo, no se borra el flag y esta continuamente entrando a la interrupcion.

proba con un codigo asi:

static int j=0;
if(kbhit())
{
  datos[j] = getc();
  j++;
  if(j==22)
  {
       j=0;
       disable_interrupt(INT_RDA);
  }
}

De esa forma solo va a tomar un dato cuando exista, y no se quede esperando en la interrupcion hasta que llegue el dato. Cuando complete los 22 bytes entonces desabilita las interrupciones y te fijas lo que llego.

Desconectado lenders75

  • PIC10
  • *
  • Mensajes: 10
Re: Recibir una trama del XBEE
« Respuesta #6 en: 04 de Febrero de 2015, 21:52:37 »
hola

Aquí sigo sin encontrar solucion a la recepción de la trama del XBEE.

Código: [Seleccionar]
#include "C:\CCS\LED3\LED3.h"

#use fast_io(B)
#define LCD_DB4   PIN_B4
#define LCD_DB5   PIN_B5
#define LCD_DB6   PIN_B6
#define LCD_DB7   PIN_B7
#define LCD_RS    PIN_B1
#define LCD_E     PIN_B0
#define LCD_RW    PIN_C1   //Posición del PIN RW

#include "C:\CCS\LED3\lcd1.c"
    int const lenbuff=22;                  // Longitud de buffer,
    int  xbuffrec=0x00;                       // Índice: siguiente char en cbuff
    char buffrec[lenbuff];                   // Buffer
    char rcvchar=0x00;                     // último caracter recibido
   
    char msb=0x00;
    char delimitador=0x00;
    char lsb=0x00;
   
   
   
    #INT_RDA
    void  RDA_isr(void)
     {
     
    if(kbhit())
    {                        // Si hay algo pendiente de recibir ...
      rcvchar=getc();  // lo descargo y ...
      if (rcvchar==0x7E)
      {
     buffrec[xbuffrec++]=rcvchar; // Añade caracter recibido al Buffer
      if (xbuffrec==23)
        {
        xbuffrec=0;
        }
       
        delimitador= buffrec[0];
        msb= buffrec[20];
        lsb= buffrec[21];
       lcd_gotoxy(1,2);
       printf(lcd_putc, " %X, %X,%X" ,delimitador, msb,lsb);
      } 
   }
 
  ELSE
  RETURN;
     
     }   
 
 
void main()
{
set_tris_b(0b00000000);
lcd_init();
lcd_gotoxy(1,1);
lcd_putc("Comunicacion");
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);
 
   while(TRUE)
  {
   
  }
 
   
}


Me visualiza 7E y otros dos datos, que yo pienso que son restos del registro. Porque me los muestra nada más conectar la alimentación, sin haber activado el otro XBEE, y no cambian. Si a alguien se le ocurre una idea.

Desconectado lenders75

  • PIC10
  • *
  • Mensajes: 10
Re: Recibir una trama del XBEE
« Respuesta #7 en: 05 de Febrero de 2015, 16:47:31 »
Por fin consegui visualizar los datos de la trama que me manda el XBEE.Dejo el codigo por si alguien le sirve.
Código: [Seleccionar]
#include "C:\CCS\JUEVES\JUEVES.h"


#use fast_io(B)
#define LCD_DB4   PIN_B4
#define LCD_DB5   PIN_B5
#define LCD_DB6   PIN_B6
#define LCD_DB7   PIN_B7
#define LCD_RS    PIN_B1
#define LCD_E     PIN_B0
#define LCD_RW    PIN_C1   //Posición del PIN RW

#include "C:\CCS\JUEVES\lcd1.c"
   
 
    int  i;                       // Índice: siguiente char en cbuff
    char buffer[22];                       // Buffer
    char rcvchar=0x00;                     // último caracter recibido
   
    char msb=0x00;
    char lsb=0x00;
    char Trama=0x00;
 
   
   
    #INT_RDA
    void  RDA_isr(void)
     {
     
    if(kbhit())
    {                        // Si hay algo pendiente de recibir ...
      rcvchar=getc();  // lo descargo y ...
      if (rcvchar==0x7E)
      {
        for(i=1;i<22;i++){ 
        buffer[i] = getc();
       
        }
       
       
        Trama=buffer[3];
        msb= buffer[20];
        lsb= buffer[19];
       
       lcd_gotoxy(1,2);
       printf(lcd_putc, " %X,%X, %X," ,trama,lsb,msb);
      }
 
     
   }
 
  ELSE
  RETURN;
     
     }   
 
     

 
 
void main()
{
set_tris_b(0b00000000);
lcd_init();
lcd_gotoxy(1,1);
lcd_putc("Comunicacion");
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);
 
   while(TRUE)
  {
 
 
  }
 
   
}

Logro visualizar el valor de la trama (92) y la lectura analogica que entra por DO.


 

anything