Autor Tema: STRUCT PARA ALMACENAR UN BYTE DE CONFIGURACION  (Leído 1857 veces)

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

Desconectado raquena

  • PIC12
  • **
  • Mensajes: 56
STRUCT PARA ALMACENAR UN BYTE DE CONFIGURACION
« en: 01 de Diciembre de 2013, 19:10:58 »
Hola a todos!

Quiero realizar un Struct de tal forma que pueda acceder y modificar los bits de forma independiente, y a su vez, tenerlos todos agrupados para
poder manejarlos como un byte completo, he estado echando un vistazo a cómo lo hacen en las librerías de los dispositivos, pero no le acabo de pillar
el rollo, hay algo que no acabo de entender y es cómo indica que la estructura y el byte en cuestión son la misma cosa, explico con ejemplo a continuación:



// ESTO ES LO QUE SALE EN LA LIBRERÍA DE C18

extern volatile near unsigned char       SPPDATA;
extern volatile near unsigned char       SPPCFG;
extern volatile near struct {
  unsigned WS0:1;
  unsigned WS1:1;
  unsigned WS2:1;
  unsigned WS3:1;
  unsigned CLK1EN:1;
  unsigned CSEN:1;
  unsigned CLKCFG0:1;
  unsigned CLKCFG1:1;
} SPPCFGbits;


// ESTO ES LO QUE YO TENGO


unsigned char NRF24L01_CONFIG;
struct {
    unsigned PRIM_RX:1;
    unsigned PWRUP:1;
    unsigned CRCO:1;
    unsigned EN_CRC:1;
    unsigned MASK_MAX_RT:1;
    unsigned MASK_TX_DS:1;
    unsigned MASK_RX_DR:1;
    unsigned RESERVED:1;

} NRF24L01_CONFIGbits;

Si quiero acceder a los datos del Struct de forma independiente, no hay ningún problema, pero la cuestión es que no estoy indicando en ninguna parte que los valores del Struct vayan a parar al char que hay declarado encima, en la librería de C18 tampoco está indicado en ninguna parte, pero sin embargo funciona...
Tiene que ver con los modificadores de la variable que llevan escritos delante los registros???
Creo que tal vez con punteros se pueda solucionar la papeleta, pero aún así, no lo tengo muy claro...
Es posible?

Muchas gracias por las respuestas de antemano !!!


Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: STRUCT PARA ALMACENAR UN BYTE DE CONFIGURACION
« Respuesta #1 en: 01 de Diciembre de 2013, 19:16:47 »
Si quieres acceder también por medio de un char crea una union.


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado raquena

  • PIC12
  • **
  • Mensajes: 56
Re: STRUCT PARA ALMACENAR UN BYTE DE CONFIGURACION
« Respuesta #2 en: 01 de Diciembre de 2013, 21:31:54 »
AAAAhmmm!!!

Y cómo se me quedaría haciéndolo con UNION?

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: STRUCT PARA ALMACENAR UN BYTE DE CONFIGURACION
« Respuesta #3 en: 01 de Diciembre de 2013, 21:50:54 »
Código: [Seleccionar]
union{
unsigned char Val;
struct {
    unsigned PRIM_RX:1;
    unsigned PWRUP:1;
    unsigned CRCO:1;
    unsigned EN_CRC:1;
    unsigned MASK_MAX_RT:1;
    unsigned MASK_TX_DS:1;
    unsigned MASK_RX_DR:1;
    unsigned RESERVED:1;

}}NRF24L01_CONFIG;

Por ejemplo
No contesto mensajes privados, las consultas en el foro

Desconectado raquena

  • PIC12
  • **
  • Mensajes: 56
Re: STRUCT PARA ALMACENAR UN BYTE DE CONFIGURACION
« Respuesta #4 en: 02 de Diciembre de 2013, 14:31:05 »
He hecho un copypaste del código que me dejaste escrito y el caso es que el compilador me insulta y dice que no...
Por otra parte, quién sería val en este caso?

La forma para acceder a los datos sería algo como esto?:

NRF24L01_CONFIG.Val (el byte entero)

NRF24LO1_CONFIG.PWRUP (bits individuales)

Desconectado juanelete

  • PIC12
  • **
  • Mensajes: 74
Re: STRUCT PARA ALMACENAR UN BYTE DE CONFIGURACION
« Respuesta #5 en: 11 de Diciembre de 2013, 10:54:32 »
Hola

La forma utilizando una unión seria asi:

Código: [Seleccionar]
typedef struct {
    unsigned b0:1;
    unsigned b1:1;
    unsigned b2:1;
    unsigned b3:1;
    unsigned b4:1;
    unsigned b5:1;
    unsigned b6:1;
    unsigned b7:1;

}TIPO_ESTRUCT; //Creamos un nuevo tipo
   
union{
unsigned int8 Val;
TIPO_ESTRUCT bits; //Usamos el nuevo tipo para declarar bits
}var;

var.Val=0b01010101;        //Le asignamos un byte completo

//Ahora podemos usar var.bits.bx para refereirnos a cada bit individual

printf("\n\r%u%u%u%u%u%u%u%u",var.bits.b7,var.bits.b6,var.bits.b5,var.bits.b4,var.bits.b3,var.bits.b2,var.bits.b1,var.bits.b0);


Aunque seria mas fácil hacer esto:

Código: [Seleccionar]
struct {
    unsigned b0:1;
    unsigned b1:1;
    unsigned b2:1;
    unsigned b3:1;
    unsigned b4:1;
    unsigned b5:1;
    unsigned b6:1;
    unsigned b7:1;

}pru; //Declaramos pru como una estructura
 

bits=0b10101010;      //Le pasamos un byte completo a la estructura

//Ahora podemos usar pru.bx para refereirnos a cada bit individual

printf("\n\r%u%u%u%u%u%u%u%u",pru.b7,pru.b6,pru.b5,pru.b4,pru.b3,pru.b2,pru.b1,pru.b0);


Saludos


 

anything