Autor Tema: Acceso a variables tipo char: acceso al byte entero y a bits concretos.  (Leído 1617 veces)

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

Desconectado Salty

  • PIC10
  • *
  • Mensajes: 15
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:

Código: [Seleccionar]
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

Código: [Seleccionar]
t_byte ESTADO_TEMP
accedo al byte entero así

Código: [Seleccionar]
ESTADO_TEMP.byte = 0x00;
y a bits así

Código: [Seleccionar]
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

Código: [Seleccionar]

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

Código: [Seleccionar]

char ESTADO_TEMP

t_byte *p_tbyte_ESTADO_TEMP = (t_byte*)&ESTADO_TEMP;


Y para acceder:

Como byte:

Código: [Seleccionar]

ESTADO_TEMP = 0x00;


A un solo bit:

Código: [Seleccionar]

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
« Última modificación: 27 de Noviembre de 2014, 13:30:02 por Salty »

Desconectado Salty

  • PIC10
  • *
  • Mensajes: 15
Re: Acceso a variables tipo char: acceso al byte entero y a bits concretos.
« Respuesta #1 en: 27 de Noviembre de 2014, 15:06:56 »
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;


 

anything