Autor Tema: Agrupacion de bits en un registro  (Leído 3471 veces)

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

Desconectado Darukur

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 464
    • Informacion, recursos y ejemplos para desarrollos con microcontroladores
Agrupacion de bits en un registro
« en: 02 de Noviembre de 2006, 10:05:36 »
A ver si me hago entender bien mi inquietud... :-)
En assembler uno tiene el control completo y eficiente del uso de los registros tanto en un byte como en los bits dentro del mismo.
Ej: Cargo un byte y comparo con btfss cada bit.

Cuando uno pasa a C tiene el siguiente inconveniente:
-Si quiere optimizar para comparaciones booleanas usa bits (variable "bit" en Hitech y estructuras unarias en Hitech & Microchip).
Pero si desea por ejemplo transportar 8 bits por una USART los agrupa en un byte con lo que se tiene que procesar dicha informacion. EJ (pepe=(bit7*0x80)|(bit6*0x40)....)

-Caso contrario: si quiere optimizar usando en un registro tipo "char" debe procesar (enmascaramiento) para recuperar cada bit de interes.

Si de antemano utilizaramos el mismo byte donde se definio cada bit, estariamos evitando una tarea que desde el punto de vista del procesador es inutil.

Mi ejemplo:

struct {unsigned char B7:1,B6:1,B5:1,B4:1,B3:1,B2:1,B1:1;B0:1;} pepe;

unsigned char   *tongo,resultado;

{pepe.B7=1;pepe.B0=0;           //aca cargo lo que quiero en los bits
 tongo=(unsigned char *)&pepe; 
 resultado=*pepe;               //aca recupero en un byte todos los bits
}

De esta manera tengo en "resultado" un byte con todos los bits de pepe, pero....
No se si depende del compilador el ordenamiento de dichos bits en la estructura o si es una practica correcta.

Si tienen una mejor idea o comentario los espero...

Marcelo

El que no sabe lo que busca no entiende lo que encuentra.
Mi Pagina Web:  http://www.sistemasembebidos.com.ar
Mi foro:             http://www.sistemasembebidos.com.ar/foro/

Desconectado Darukur

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 464
    • Informacion, recursos y ejemplos para desarrollos con microcontroladores
Re: Agrupacion de bits en un registro
« Respuesta #1 en: 02 de Noviembre de 2006, 10:17:51 »
Probe generando solo 3 bits dentro de la estructura de bit y por lo visto ordena desde el bit mas bajo al mas alto.
Osea que la estructura debe ser:

struct {unsigned char B0:1,B1:1,B2:1,B3:1,B4:1,B5:1,B6:1;B7:1;} pepe;

Levante el resultado en el registro destino y toma OK.

Espero comentarios.

Marcelo
El que no sabe lo que busca no entiende lo que encuentra.
Mi Pagina Web:  http://www.sistemasembebidos.com.ar
Mi foro:             http://www.sistemasembebidos.com.ar/foro/

Desconectado Zaphyrus

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 323
    • Mi blog: Es cuestión de actitud
Re: Agrupacion de bits en un registro
« Respuesta #2 en: 02 de Noviembre de 2006, 10:44:09 »
Hola Marcelo, por lo que he podido ver el compilador de Hitech es "Little Endian" (en assembler no tengo idea, hace mucho que no programo en el) para almacenar los bytes y deduzco que lo debe ser para los bits también. Con respecto a las estructuras por lo que me acuerdo haber leido se almacena en forma consecutiva tal como fue declarada los elementos que la conforman. Hace unos días leí algo de eso en el foro de PICos18 -> http://www.picos18.com/forum/viewtopic.php?t=344&highlight=struct
Tengo una duda con respecto al cast explícito que usas en:

tongo=(unsigned char *)&pepe;

¿Es realmente necesario ya que *tongo es un apuntador a unsigned char y pepe es unsigned char? ¡¡¡Yo y mis benditos lios con los apuntadores!!!  :(

Salutes.

Martín
"¿Lo quiere rápido, barato, o bien hecho? Puede elegir dos de las tres cosas." Arthur C. Clarke.
Mi Proyecto Final de Carrera-Microprocesador RISC de 16 bits en HDL: http://martin.calveira.googlepages.com/home
Mi página web o blog: http://es-cuestion-de-actitud.blogspot.com/
Martín Calveira - Zárate - Argentina

Desconectado Darukur

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 464
    • Informacion, recursos y ejemplos para desarrollos con microcontroladores
Re: Agrupacion de bits en un registro
« Respuesta #3 en: 02 de Noviembre de 2006, 11:18:01 »
Son tipos de variables completamente diferentes, fijate de compilarlo vas a ver el insulto que te hecha el Hitech.
Una es una estructura que contiene una variable del tipo char y la otra es un tipo char.
Por ejemplo:


struct {unsigned char B0:1,B1:1,B2:1,B3:1,B4:1,B5:1,B6:1;B7:1;
           unsigned char poroto;
         } pepe;

unsigned char   *tongo,resultado;

Ahora es mas notoria la diferencia entre los tipos.

Si apuntaras pepe a tongo seria al primer byte de la estructura pepe, tal cual dijiste por el ordenamiento "Little Endian"

Saludos
El que no sabe lo que busca no entiende lo que encuentra.
Mi Pagina Web:  http://www.sistemasembebidos.com.ar
Mi foro:             http://www.sistemasembebidos.com.ar/foro/

Desconectado Zaphyrus

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 323
    • Mi blog: Es cuestión de actitud
Re: Agrupacion de bits en un registro
« Respuesta #4 en: 02 de Noviembre de 2006, 11:38:14 »
Ahora entiendo. Gracias!!!  :-/

Los apuntadores otros de los causantes de mi escases cabellera!!!

Saludos.

Martín
"¿Lo quiere rápido, barato, o bien hecho? Puede elegir dos de las tres cosas." Arthur C. Clarke.
Mi Proyecto Final de Carrera-Microprocesador RISC de 16 bits en HDL: http://martin.calveira.googlepages.com/home
Mi página web o blog: http://es-cuestion-de-actitud.blogspot.com/
Martín Calveira - Zárate - Argentina

Desconectado Zaphyrus

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 323
    • Mi blog: Es cuestión de actitud
Re: Agrupacion de bits en un registro
« Respuesta #5 en: 02 de Noviembre de 2006, 12:43:34 »
Investigando un poco llegué a esta página que habla de los punteros o apuntadores:

http://es.geocities.com/jorge_hefty/index.html

El error mío fue pensar que "*tongo" era un apuntador a "pepe" pero como "*tongo" es un "unsigned char" y pepe es una "struct" se debe hacer el cast. Para verificarlo hice un ejemplo que funciona bien:

Código: [Seleccionar]

struct caracter
    {
       unsigned char 
                            B0:1,
                            B1:1,
                            B2:1,
                            B3:1,
                            B4:1,
                            B5:1,
                            B6:1,
                            B7:1;
    } pepe;

struct caracter *ppepe;

unsigned char   *tongo;
unsigned char   resultado;


void main (void)
{

// Aca cargo lo que quiero en los bits
    pepe.B7=1;
    pepe.B0=0;

// La dirección de la estructura "pepe" es guardada en el apuntador "ppepe"
    ppepe = &pepe;

// La dirección del primer byte de la estructura "pepe" es guardada en el apuntador "tongo"
// Acá se debe hacer un cast porque estoy guardando la dirección de una "struct" en un apuntador a "unsigned char"
    tongo=(unsigned char *)&pepe;

// Se hace un indirección o desreferencia donde se da acceso al objeto que señala el apuntador
    resultado=*tongo;

}


Salutes.

Martín
« Última modificación: 02 de Noviembre de 2006, 12:45:36 por Zaphyrus »
"¿Lo quiere rápido, barato, o bien hecho? Puede elegir dos de las tres cosas." Arthur C. Clarke.
Mi Proyecto Final de Carrera-Microprocesador RISC de 16 bits en HDL: http://martin.calveira.googlepages.com/home
Mi página web o blog: http://es-cuestion-de-actitud.blogspot.com/
Martín Calveira - Zárate - Argentina


 

anything