Autor Tema: utilizar los bits de un byte.  (Leído 6134 veces)

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

Desconectado ochi

  • PIC10
  • *
  • Mensajes: 48
utilizar los bits de un byte.
« en: 11 de Abril de 2008, 05:03:51 »
hola, estoy intentando conseguir mirar cada bit independiente de un char, según veo en otros foros, y en la  definición de la librería p30f4013.h (fijandome por ejemplo en PORTB) se debe hacer de este modo:

Me he creado una librería bits.h donde pongo:

/* Registro de ocho bits */
extern volatile unsigned int REGISTRO8 __attribute__((__sfr__));
typedef struct tagREGISTRO8BITS {
        unsigned BIT0    :1;
        unsigned BIT1    :1;
        unsigned BIT2    :1;
        unsigned BIT3    :1;
        unsigned BIT4    :1;
        unsigned BIT5    :1;
        unsigned BIT6    :1;
        unsigned BIT7    :1;
} REGISTRO8BITS;
extern volatile REGISTRO8BITS REGISTRO8bits __attribute__((__sfr__));


#define _BIT80 REGISTRO8bits.BIT80
#define _BIT81 REGISTRO8bits.BIT81
#define _BIT82 REGISTRO8bits.BIT82
#define _BIT83 REGISTRO8bits.BIT83
#define _BIT84 REGISTRO8bits.BIT84
#define _BIT85 REGISTRO8bits.BIT85
#define _BIT86 REGISTRO8bits.BIT86
#define _BIT87 REGISTRO8bits.BIT87

en mi programa incluyo la librería y llamo a REGISTRO8 me dice que no está declarada la variable. ¿alguien sabe que hago mal?


Muchass gracias

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: utilizar los bits de un byte.
« Respuesta #1 en: 11 de Abril de 2008, 23:28:56 »
Hola

No conozco la forma de declaración de tu librería, no puedo revisarla  :mrgreen:

Pero te puedo recomendar que hagas máscaras para hacer test de bits...

Código: [Seleccionar]
bool test_bit(char variable, int bit) //bit puede ser de 0 a 7
{
if((variable>>bit)&0b00000001) //multiplica por 1 el bit a checar, si es 1 regresa un 1
   return 1;
else //si fue cero regresa un cero
   return 0;
}

Y ya usándola...

Código: [Seleccionar]
char variable;
bool valor;

...

variable=0b01011010;

//checando bit 1
valor=test_bit(variable,1); //esto va a entregar un 1

Ojo... la acabo de escribir, no sé si funciona en tu compilador en específico  :mrgreen: Puede lograrse de una mejor forma con otras funciones, pero esa es la que se me ocurre  :P
« Última modificación: 11 de Abril de 2008, 23:31:18 por migsantiago »

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: utilizar los bits de un byte.
« Respuesta #2 en: 12 de Abril de 2008, 02:54:46 »
Yo particularmente me vuelvo un poco tarumba con tantos atributos alrededor de las estructuras y variables.
Mi consejo es que pruebes a declarar la estrutura y la variable en tu propio programa, y cuando consigas que funcione bien así, hagas la prueba de sacarlo a una librería externa y ponerle el resto de atributos.
O sea, yo haría esto dentro de tu programa principal:


/* Registro de ocho bits */

typedef struct tagREGISTRO8BITS {
        unsigned BIT0    :1;
        unsigned BIT1    :1;
        unsigned BIT2    :1;
        unsigned BIT3    :1;
        unsigned BIT4    :1;
        unsigned BIT5    :1;
        unsigned BIT6    :1;
        unsigned BIT7    :1;
} REGISTRO8BITS;

REGISTRO8BITS REGISTRO8bits;

Luego, para acceder a cada uno de los bits de la variable, en tu programa tendrás que hacer referencia a:
REGISTRO8bits.BITn

Una vez que consigas que eso funcione, si quieres puedes sacarlo a librería fuera y añadirle lo que quieras mientras siga funcionando.

Desconectado ochi

  • PIC10
  • *
  • Mensajes: 48
Re: utilizar los bits de un byte.
« Respuesta #3 en: 15 de Abril de 2008, 08:47:48 »
Hola, acabo de ver las formas que me decis, y me gustaría hacerla con una librería. Empiezo a hacerlo como me dice nocturno, y puedo coger bit a bit, pero no puedo definir el registro completo.

Es decir, lo que pretendo hacer es dar un valor al registro completo y luego

if(REGISTRO8bits.BIT0==1){} (por ejemplo) pero lo consigo de ninguna manera. ¿alguna idea?. Gracias.

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: utilizar los bits de un byte.
« Respuesta #4 en: 15 de Abril de 2008, 09:32:02 »
Podrías usar lo que se llama una unión en C

typedef union {
    unsigned char value;
    struct {
       unsigned bit0:1;
       unsigned bit1:1;
       unsigned bit2:1;
       unsigned bit3:1;
       unsigned bit4:1;
       unsigned bit5:1;
       unsigned bit6:1;
       unsigned bit7:1;
    } bits;
} Tmibyte;

bits sería el nombre de la estructura el cual es exigido por algunos compiladores.  NO todos, por ejemplo en C18 no hace falta pero en Hitech si.

La forma de usarlo sería algo asi


   Tmibyte mivariable;

   mivariable.value = 20;
   if (mivariable.bits.bit0 ==1 ) { ...}



Y cuantas combinaciones se te ocurran  :)
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado ochi

  • PIC10
  • *
  • Mensajes: 48
Re: utilizar los bits de un byte.
« Respuesta #5 en: 15 de Abril de 2008, 11:23:09 »
Perfecto! si meto eso que me dices en una librería funciona justo como quiero. Muchas gracias

Desconectado Marttyn

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1835
    • IDEAA
Re: utilizar los bits de un byte.
« Respuesta #6 en: 18 de Abril de 2009, 10:11:51 »
Podrías usar lo que se llama una unión en C

typedef union {
    unsigned char value;
    struct {
       unsigned bit0:1;
       unsigned bit1:1;
       unsigned bit2:1;
       unsigned bit3:1;
       unsigned bit4:1;
       unsigned bit5:1;
       unsigned bit6:1;
       unsigned bit7:1;
    } bits;
} Tmibyte;

bits sería el nombre de la estructura el cual es exigido por algunos compiladores.  NO todos, por ejemplo en C18 no hace falta pero en Hitech si.

La forma de usarlo sería algo asi


   Tmibyte mivariable;

   mivariable.value = 20;
   if (mivariable.bits.bit0 ==1 ) { ...}



Y cuantas combinaciones se te ocurran  :)

Estoy haciendo un programa que necesito hacer exactamente eso. Poder acceder a cada bit de una variable INT y tambien poder leer la variable entera.
Mi duda es si hace falta crear la union, o solo con la estructura me llega.
Con la union puedo hacer como dice Maunix para leer o escribir en la variable entera: mivariable.value = 20;
Pero si no creo la union, podria crear "mivariable" como estructura, y luego hacer mivariable = 20?
De esa manera podria acceder tanto a los bits, como al byte completo, sin tener que crear la union... siempre y cuando sea posible, claro  :mrgreen:
La gente ve las cosas que existen y se pregunta por qué.
Yo prefiero imaginar lo que no existe y preguntarme por qué no.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: utilizar los bits de un byte.
« Respuesta #7 en: 18 de Abril de 2009, 14:24:50 »
Si no haces la unión no podrás asignar un valor a la variable completa de una sóla tacada.

Desconectado PHLAKO

  • PIC10
  • *
  • Mensajes: 49
Re: utilizar los bits de un byte.
« Respuesta #8 en: 05 de Mayo de 2009, 15:11:40 »
no me funciona :(, no puedo asignarle valores al registro.

bue...como voy a trabajar esta vez con registro de 8 bits, le puse 3 lineas de ASM y listoco :mrgreen:

no puedo creer que no exista algo sencillo como VARIABLEbits.B0 = 1/0 y VARIABLEbits.B0 == 1/0 (como el BSF y BTFSS de ASM)

ASM 1 / C18 0

saludos,

chaos :)
SIEMPRE TE RECORDARE AMADO Y FIEL COMPAÑERO "LOBO"

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: utilizar los bits de un byte.
« Respuesta #9 en: 05 de Mayo de 2009, 15:20:52 »
Sí, claro que existe, se llaman bit_set y bit_clear. E incluso existe el bit_test que te devuelve el estado.

Desconectado PHLAKO

  • PIC10
  • *
  • Mensajes: 49
Re: utilizar los bits de un byte.
« Respuesta #10 en: 05 de Mayo de 2009, 19:06:50 »
pues quedo mas confundido aun, si existe eso que nombras, para que usar lo de las estructuras? si eres tan amable me lo explicas, porque prefiero evitar usar ASM dentro de C,  :-/

saludos,

chaos :)
SIEMPRE TE RECORDARE AMADO Y FIEL COMPAÑERO "LOBO"

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: utilizar los bits de un byte.
« Respuesta #11 en: 05 de Mayo de 2009, 20:03:42 »
Hay muchas soluciones para un mismo problema, por suerte. Así cada cual escoge la que más le convenga.

Yo particularmente veo mucho más legible el código con estructuras, pero es cuestión de gustos.

Desconectado Duende_Azul

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 902
Re: utilizar los bits de un byte.
« Respuesta #12 en: 05 de Mayo de 2009, 23:09:03 »
Que tal esto:


Defines la variable cuyos bits deseas acceder y luego defines cada bit con un nombre..  ejemplo:

Código: [Seleccionar]
int8 banderas;  //Registro
#bit cero  = banderas.0  //define el bit o de banderas como "cero"
#bit signo = banderas.1  //define el bit 1 de banderas como "signo"
#bit parid = banderas.2  //etc....
#bit acarr = banderas.3
#bit a_aux = banderas.4


void main()
{
//asignas el valor de cada bit del registro banderas así:
   cero=1;  //bit 0 se pone a 1
   signo=1; //bit 1 se pone a 1
   parid=1; //etc...
   acarr=1;
   a_aux=1;
   
//puedes consultar el estado de un bit así:

   if(acarr==1)
      cero=0;

}




Desconectado Marttyn

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1835
    • IDEAA
Re: utilizar los bits de un byte.
« Respuesta #13 en: 06 de Mayo de 2009, 00:08:22 »
Duende, lo que acabas de decir es una GENIALIDAD!!!
Lo utilizo siempre para darle nombre al puerto y a sus pines, pero no lo habia pensado para un byte.... QUE BUENO!!!!
Ya mismo me pongo a modificar el codigo donde tenia un typedef, una union entre el typedef y un byte, y una variable declarada como la union.... eso si que es simplificar!  :mrgreen:
La gente ve las cosas que existen y se pregunta por qué.
Yo prefiero imaginar lo que no existe y preguntarme por qué no.

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: utilizar los bits de un byte.
« Respuesta #14 en: 06 de Mayo de 2009, 00:16:14 »
Yo lo uso asi en mis programas, solo que no lo puse porque crei que no aplicaba a la pregunta general... :(
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.


 

anything