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

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

Desconectado PHLAKO

  • PIC10
  • *
  • Mensajes: 49
Re: utilizar los bits de un byte.
« Respuesta #15 en: 06 de Mayo de 2009, 09:21:36 »
Marttyn, me ganaste el comentario :mrgreen: creo que Duende respondio a la perfeccion, se agradece mucho, lo voy aprobar.....

Nocturno, gracias por los datos, de igual modo si puedes poner un ejemplillo de lo que indicaste mas arriba8, seria genial, o de todas formas necesito definir los bits de la variable?

saludos

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

Desconectado Marttyn

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1835
    • IDEAA
Re: utilizar los bits de un byte.
« Respuesta #16 en: 06 de Mayo de 2009, 10:39:20 »
Hola phlaco, aqui tienes un ejemplo de como hacerlo con estructuras y uniones:

Código: C
  1. typedef struct{
  2. //a cada bit puse nombres "bitx" para que se vea mejor, pero realmente se puede usar cualquier nombre mas representativo, como "Led", "Motor", etc
  3.         short bit0;
  4.         short bit1;
  5.         short bit2;
  6.         short bit3;
  7.         short bit4;
  8.         short bit5;
  9.         short bit6;
  10.         short bit7;
  11. }Bits;          //nombre de mi estructura
  12.  
  13. typedef union{
  14.         int sByte;              //declaro un INT
  15.         Bits sBits;             //declaro una variable como estructura
  16. }Bits_Bytes;            //nombre de mi union
  17.  
  18. Bits_Bytes Indicadores;         //declaracion una variable como union
  19.  
  20. //Para leer o escribir el bit0 por ejemplo, te referiras a el como:
  21. Indicadores.sBits.bit0
  22.  
  23. //Para leer o escribir el byte completo usaras:
  24. Indicadores.sByte

Este codigo, casi tal cual lo ves lo puedes encontrar en el foro, yo lo encontre por aqui, pero lo modifique un poquito a mi gusto.
Salu2
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 PHLAKO

  • PIC10
  • *
  • Mensajes: 49
Re: utilizar los bits de un byte.
« Respuesta #17 en: 06 de Mayo de 2009, 10:58:24 »
al parecer no es C18, no me funciona :(

saludos

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

Desconectado Marttyn

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1835
    • IDEAA
Re: utilizar los bits de un byte.
« Respuesta #18 en: 06 de Mayo de 2009, 11:08:20 »
perdon, no sabia que necesitabas C18....
la verdad que de eso aun no entiendo... tal vez los amigos te puedan ayudar
Salu2!
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 PHLAKO

  • PIC10
  • *
  • Mensajes: 49
Re: utilizar los bits de un byte.
« Respuesta #19 en: 06 de Mayo de 2009, 11:21:42 »
Marttyn, al contrario, muchas gracias por las ganas de ayudar. Yo aun no identifico bien cuando es C18 u otro compilador :mrgreen:

saludos

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

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: utilizar los bits de un byte.
« Respuesta #20 en: 06 de Mayo de 2009, 13:42:49 »
Hola, el ejemplo que puso Duende Azul seguramente es para CCS, si no estoy equivocado C18 es practicamente ANSI C con lo cual la definción #bit cero  = banderas.0 no es valida. Las definiciones correctas segun mi entender serian los post de Ochi y del maestro Nocturno, que en definitiva son campos de bits. Si queres acceder a cada bit y al byte completo deberas usar la definción de Maunix que suma una union a la definción del campo de bits.

Citar
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
Si no declaras la union y te quedas con la estructura solo accederas a los miembros del campo de bits o a los bits en particular, con la union accedes a un bit en particular o al byte contendedor, tal cual no ejemplifico Maunix.

Desconectado PHLAKO

  • PIC10
  • *
  • Mensajes: 49
Re: utilizar los bits de un byte.
« Respuesta #21 en: 06 de Mayo de 2009, 13:57:21 »
Pues si, gracias por recordarmelo, no habia agradecido a Maunix, lo que puso al principio, funciona a la perfccion. :-/

Pero no me deja de extrañar que se tenga que realizar esa operacion para manejar bits de un byte, ademas de mover el registro completa (ademas que se usa un byte enterito por cada bits y en mi opinion se desperdicia espacio)

Saludos,

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

Desconectado Duende_Azul

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 902
Re: utilizar los bits de un byte.
« Respuesta #22 en: 06 de Mayo de 2009, 14:08:13 »
Lo que puse antes es para CCS.

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: utilizar los bits de un byte.
« Respuesta #23 en: 06 de Mayo de 2009, 14:45:38 »
Hola, justamente un campo de bits permite manejar n bits en forma particular, lamentablemente es uno de los puntos oscuros del estandart ANSI C y por ende poco portable. Y justamente el uso de la union es definir un espacio que es igual al mayor de los miembros, con lo cual en este caso no se desperdicia nada, porque los 8 bits ocupan el mismo byte. Eso lo podes ver en al archivo map que genera el linker y ver como se comparte la memoria.

Saludos !

Desconectado PHLAKO

  • PIC10
  • *
  • Mensajes: 49
Re: utilizar los bits de un byte.
« Respuesta #24 en: 06 de Mayo de 2009, 15:22:30 »
Hola, justamente un campo de bits permite manejar n bits en forma particular, lamentablemente es uno de los puntos oscuros del estandart ANSI C y por ende poco portable. Y justamente el uso de la union es definir un espacio que es igual al mayor de los miembros, con lo cual en este caso no se desperdicia nada, porque los 8 bits ocupan el mismo byte. Eso lo podes ver en al archivo map que genera el linker y ver como se comparte la memoria.

Saludos !



yo lo veo tal cual un array con variables de 8 bits, dehecho cambian de 0 a 1, decimal. Por lo tanto se estaria ocupando un solo bit par cada uno de los bytes................toy mal?

Saludos,

chaos :)


ME AUTO CORRIJO, no habia visto que estan en la misma direccion :mrgreen: tienes toda la razon, es un solo byte :-/
Gracias por la explicacion.
« Última modificación: 06 de Mayo de 2009, 15:29:03 por PHLAKO »
SIEMPRE TE RECORDARE AMADO Y FIEL COMPAÑERO "LOBO"

Desconectado Braulio

  • PIC12
  • **
  • Mensajes: 52
Re: utilizar los bits de un byte.
« Respuesta #25 en: 07 de Septiembre de 2010, 03:51:42 »
Amigos tengo un problema similar usando CCS
 
Resulta que tengo un vector de 64 bytes definido como

int8 dato[64]

del cual debo utilizar de forma indistinta algunos bytes y algunos bits específicos. Por ejm.:

  • necesito leer y escribir directamente el cuarto byte: dato[3]
  • necesito leer y escribir directamente el primer bit del tercer byte : dato[2].0

La primera no es problema, manipulo directamente usando dato[3], o le pongo un nombre:

#DEFINE   byte_4to   dato[3]


Pero la segunda si es problemática, pues no me permite hacer lo que indica Duente_Azul:


int8 dato[64];
#bit  bandera = dato[2].0


Al compilar me salen 3 errores en la misma linea

Expecting a .
Expecting a declaration
Expecting a declaration



por favor ojala alguien pueda darme una idea de como solucionar esto. Manipular un bit directamente  por su nombre simplifica mucho el entendimiento del programa y el programa en si.

BRAULIO

« Última modificación: 07 de Septiembre de 2010, 04:02:27 por Braulio »