Autor Tema: ENVIO DE TRAMA CON ESTRUCTURAS  (Leído 2143 veces)

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

Desconectado ALFREDOSKY

  • PIC16
  • ***
  • Mensajes: 118
ENVIO DE TRAMA CON ESTRUCTURAS
« en: 16 de Septiembre de 2014, 20:01:19 »
Hola a todos, estoy tratando de enviar una trama de datos via serial(uart), tengo campos de un byte, 2 bytes y 4 bytes; estaba pensando que la mejor manera de enviar(y ordenar) la trama es usando estructuras, leyendo en el foro encontré muy valiosa información de los experiementados y conocedores, vi un post de Suky donde explicaba e implementa una estructura de datos y el codigo de envio.

el codigo es este:
Código: [Seleccionar]
union{
    UINT8 Buffer[20];
    struct{
        UINT8 Temperatura;
        UINT16 Presion;
        UINT32 Contador;
        .....
    };
}Data;

for(k=0;k<20;k++){WriteUart(Data.Buffer[k]);

pero tengo problemas para almacenar datos en una variable con 4 bytes de tamaño(usando UINT32), sucede que solo almacena 2 bytes y los otros 2 son vistos como nulos (NULL). Solo se me permite almacenar datos en variables de 2 bytes de tamaño que es el caso cuando utilizo UINT16, no entiendo la razon, he realizado varias modificaciones pero todas de ellas sin éxito.

Por si no se me ha entendido aun, pongo este ejemplo(usando como referencia el código compartido por Suky)

si hago

Data.Contador = 'ABCD';            (4 bytes)

solo aparecen DC(en ese orden) , A y B son NULL cada uno.

si declaro en la estructura a Contador como de 2 bytes (UINT16 Contador; ) y escribo

Data.Contador = 'AB';                (2 bytes)

esta vez sí aparecen ambos caracteres. Uso el compilador c30 v3.31 de microchip y capturo en un arreglo de tamaño suficiente el contenido de Buffer, esto lo veo debuggeando y aprecio la cadena completa y cada posicion del arreglo para verificar si se llena correctamente.

Lo que he tenido que hacer es dividir a las variables de 4 bytes en dos de 2bytes, una de ellas como Mas significante y la otra como Menos significante, algo asi como Contador_high y Contador_low, pero es una solucion temporal, estoy buscando la manera de lograr guardar los 4 bytes correctamente. Espero que alguien me pueda ayudar con sugerencias, ideas o en todo caso si estoy haciendo todo mal que me señalen mi error  :lol:

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1937
    • Sicoy
Re: ENVIO DE TRAMA CON ESTRUCTURAS
« Respuesta #1 en: 17 de Septiembre de 2014, 10:53:27 »
for(k=0;k<20;k++)
{

     WriteUart(Data.Buffer[k].Temperatura);
     WriteUart((unsigned char)(Data.Buffer[k].Presion & 0x0F));
     WriteUart((unsigned char)((Data.Buffer[k].Presion & 0xF0)>> 8 ));

     WriteUart((unsigned char)(Data.Buffer[k].Contador & 0x0F));
     WriteUart((unsigned char)((Data.Buffer[k].Contador & 0xF0)>> 8 ));

     WriteUart((unsigned char)((Data.Buffer[k].Contador & 0xF00)>>16));
     WriteUart((unsigned char)((Data.Buffer[k].Contador & 0xF000)>>32));
}
« Última modificación: 17 de Septiembre de 2014, 11:02:28 por DominusDRR »
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado ALFREDOSKY

  • PIC16
  • ***
  • Mensajes: 118
Re: ENVIO DE TRAMA CON ESTRUCTURAS
« Respuesta #2 en: 17 de Septiembre de 2014, 12:37:09 »
Gracias por tu respuesta DominusDRR, voy a intentar tu sugerencia  ((:-)) , primero lo pasare a un arreglo para tenerlo ordenado, luego lo enviare de modo serial

Desconectado ALFREDOSKY

  • PIC16
  • ***
  • Mensajes: 118
Re: ENVIO DE TRAMA CON ESTRUCTURAS
« Respuesta #3 en: 17 de Septiembre de 2014, 13:35:08 »
Bueno, pensé que entendía pero, no se por que desplazas 8 bits a la derecha, veo que estas dejando pasar solo 4 bits, no 8 cuando hace & 0x0F, presion es una variable declarada con tamaño de 16 bits, 2 bytes, 4 nibbles. Igual mi duda es con el desplazamiento de 16 y de 32 y las otras variables, porfavor aclara tu codigo  :shock:

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1937
    • Sicoy
Re: ENVIO DE TRAMA CON ESTRUCTURAS
« Respuesta #4 en: 17 de Septiembre de 2014, 13:39:05 »
Tienes razón.

Rectifico:


for(k=0;k<20;k++)
{

     WriteUart(Data.Buffer[k].Temperatura);
     WriteUart((unsigned char)(Data.Buffer[k].Presion & 0xFF));
     WriteUart((unsigned char)((Data.Buffer[k].Presion & 0xFF00)>> 8 ));

     WriteUart((unsigned char)(Data.Buffer[k].Contador & 0xFF));
     WriteUart((unsigned char)((Data.Buffer[k].Contador & 0xFF00)>> 8 ));

     WriteUart((unsigned char)((Data.Buffer[k].Contador & 0xFF0000)>>16));
     WriteUart((unsigned char)((Data.Buffer[k].Contador & 0xFF000000)>>32));
}
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado ALFREDOSKY

  • PIC16
  • ***
  • Mensajes: 118
Re: ENVIO DE TRAMA CON ESTRUCTURAS
« Respuesta #5 en: 17 de Septiembre de 2014, 15:01:39 »
ok gracias nuevamente! voy a hacer las pruebas y adaptarlo a mi codigo

Desconectado ALFREDOSKY

  • PIC16
  • ***
  • Mensajes: 118
Re: ENVIO DE TRAMA CON ESTRUCTURAS
« Respuesta #6 en: 18 de Septiembre de 2014, 17:22:00 »
no me funciona correctamente, primero quiero establecer un orden y alojar en memoria las variables que utilizo, para esto uso estructuras, luego pienso almacenarlo en un arreglo y finalmente enviarlo via serial  :?

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1937
    • Sicoy
Re: ENVIO DE TRAMA CON ESTRUCTURAS
« Respuesta #7 en: 18 de Septiembre de 2014, 17:48:20 »
¿Qué es lo exáctamente no funciona?
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado ALFREDOSKY

  • PIC16
  • ***
  • Mensajes: 118
Re: ENVIO DE TRAMA CON ESTRUCTURAS
« Respuesta #8 en: 18 de Septiembre de 2014, 18:29:42 »
Las referencias a las variables no son correctas, por ejemplo

Data.Buffer[k].Presion

da error de compilación.

Pero mas allá de eso, lo que intento realizar es enviar una trama, actualizarse para enviarla (cuando recibe datos de alguna tarea). Por ejemplo 2 pic conectados vía serial, uno de ellos le solicita su estado al otro enviándole una trama de datos, este otro le envía otra trama(o la misma) de sus datos y así sucesivamente, estableciéndose un protocolo de comunicación. El código que me sugieres esta perfecto, salvo por el error de compilación, pero entiendo mas o menos como se debe proceder para arreglarlo, este código es fijo, ya no se cambia, lo que debe cambiar o actualizarse es el contenido de los datos en la estructura, por eso me interesaba guardar 4 bytes de porrazo en una variable de 32its o algo como una función que pase estructuras como argumento o parecido, pero soy novato en el uso de estructuras y aun estoy aprendiendo

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1937
    • Sicoy
Re: ENVIO DE TRAMA CON ESTRUCTURAS
« Respuesta #9 en: 18 de Septiembre de 2014, 18:38:00 »
No conozco mucho de PICC, pero si la haces asi:


typedef struct
{
    unsigned char Temperatura;
    unsigned short Presion;
    unsigned int Contador;
}Data;

Y luego la declaras:

Data MisDatos[20];

La ocupas así por ejemplo:

MisDatos[k].Presion

Yo ocupo XC32 donde

unsigned char es una variable de 8 bits sin signo.
unsigned short es una variable de 16 bits sin signo.
unsigned in es una variable de 32bits sin signo.

Deberías que buscar el equivalente para PICC.


« Última modificación: 18 de Septiembre de 2014, 18:44:30 por DominusDRR »
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado ALFREDOSKY

  • PIC16
  • ***
  • Mensajes: 118
Re: ENVIO DE TRAMA CON ESTRUCTURAS
« Respuesta #10 en: 19 de Septiembre de 2014, 14:17:49 »
Uso el compilador c30 v3.31 de microchip

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1937
    • Sicoy
Re: ENVIO DE TRAMA CON ESTRUCTURAS
« Respuesta #11 en: 19 de Septiembre de 2014, 14:22:35 »
pensé que era PICC, si he visto esos macros para declar verdaderamente a las variables en ejemplos de MCHP, por ejemplo

#define UINT8 unsigned char

o algo así.
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado ALFREDOSKY

  • PIC16
  • ***
  • Mensajes: 118
Re: ENVIO DE TRAMA CON ESTRUCTURAS
« Respuesta #12 en: 19 de Septiembre de 2014, 17:57:25 »
Asi es, c30 tiene una libreria llamada Generic.h donde se define los tipos de 32, 16 y 8 bits, ya sea:

typedef unsigned char       BYTE;               // 8-bit
typedef unsigned short int  WORD;               // 16-bit
typedef unsigned long       DWORD;              // 32-bit

ó

typedef unsigned int        UINT;
typedef unsigned char       UINT8;              // other name for 8-bit integer
typedef unsigned short      UINT16;             // other name for 16-bit integer
typedef unsigned long       UINT32;             // other name for 32-bit integer