TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: raquena 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 !!!
-
Si quieres acceder también por medio de un char crea una union.
Saludos!
-
AAAAhmmm!!!
Y cómo se me quedaría haciéndolo con UNION?
-
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
-
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)
-
Hola
La forma utilizando una unión seria asi:
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:
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