TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Salty en 27 de Noviembre de 2014, 13:25:16
-
Buenas tardes.
Estoy haciendo un programa en C con un pic18f46k22 y MPLABX y necesito acceder a algunas variables compartidas entre el .c y los .h.
Para acceder tanto al byte entero como a bits concretos he hecho lo siguiente:
en el .h:
typedef union {
unsigned char byte;
struct{
unsigned b0:0, b1:0, b2:0, b3:0, b4:0, b5:0, b6:0, b7:0;
};
} t_byte;
extern t_byte ESTADO_TEMP;
y en el .c
t_byte ESTADO_TEMP
accedo al byte entero así
ESTADO_TEMP.byte = 0x00;
y a bits así
ESTADO_TEMP.b0 = 0;
De esta forma el programa compila pero el programa no funcionaba y depurando me di cuenta de que en realidad no me estaba cambiando el dato cuando hacia un ESTADO_TEMP.b0 = 1;
He probado a hacerlo de una segunda manera:
En el .h
typedef union
{
unsigned char byte;
struct{
unsigned b0:1, b1:1, b2:1, b3:1, b4:1, b5:1, b6:1, b7:1;
};
} t_byte;
extern char ESTADO_TEMP;
t_byte *p_tbyte_ESTADO_TEMP = (t_byte*)&ESTADO_TEMP;
en el .c
char ESTADO_TEMP
t_byte *p_tbyte_ESTADO_TEMP = (t_byte*)&ESTADO_TEMP;
Y para acceder:
Como byte:
ESTADO_TEMP = 0x00;
A un solo bit:
p_tbyte_ESTADO_TEMP->b0 = 0;
De esta segunda forma no me compila. El error que me da es: conflicting declarations for variable "p_tbyte_ESTADO_TEMP"
Alguien sabe cual es la forma correcta de hacerlo o que estoy haciendo mal en alguna de las dos maneras?
Un saludo
-
PROBLEMA RESUELTO!! :-/ :-/
Por si a alguien le sirve pongo la solucion;
Lo que fallaba eran los ceros en la definicion de t_byte, es decir, la forma correcta es:
typedef union
{
unsigned char byte;
struct{
unsigned b0:1, b1:1, b2:1, b3:1, b4:1, b5:1, b6:1, b7:1;
};
} t_byte;
De esta manera ya se puede escribir o leer del bit de la forma:
ESTADO_TEMP.b0 = 0;