TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: ALFREDOSKY 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:
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:
-
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));
}
-
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
-
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:
-
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));
}
-
ok gracias nuevamente! voy a hacer las pruebas y adaptarlo a mi codigo
-
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 :?
-
¿Qué es lo exáctamente no funciona?
-
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
-
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.
-
Uso el compilador c30 v3.31 de microchip
-
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í.
-
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