Autor Tema: Manejo de bits de una variable  (Leído 2599 veces)

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

Desconectado teban89

  • PIC10
  • *
  • Mensajes: 16
Manejo de bits de una variable
« en: 07 de Junio de 2014, 02:53:21 »
Hola, que tal?? Estaba pensando la estructura de un programa que tengo que hacer y me surgio una duda que, de poder hacerse, me ayudaria muchisimo. Paso a explicar:

Supongamos que tengo una variable del tipo int cualquiera:

int var;


Todos sabemos que se puede declarar al principio de nuestro codigo un bit de algun puerto como:

#byte PORTB=0x06

#bit b1=PORTB.1


Hasta aca todo muy bonito. La pregunta es: ¿puedo hacer esto mismo con alguna variable que yo declare, como por ejemplo var? Para poder trabajar (si yo quisiera) con el bit 0 o el bit 1 o el bit que quiera de esa variable. Ejemplo:

#bit bit_2_de_la_variable_var=var.2


Y entonces asi modifico el contenido de ese bit de la variable var directamente, sin tener que usar operadores de bits ni nada por el estilo:

bit_2_de_la_variable_var=0;
bit_2_de_la_variable_var=1;


Gracias y espero su respuesta!

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Manejo de bits de una variable
« Respuesta #1 en: 07 de Junio de 2014, 03:29:17 »
Es cortita la respuesta:

Sí.

Saludos
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado teban89

  • PIC10
  • *
  • Mensajes: 16
Re: Manejo de bits de una variable
« Respuesta #2 en: 07 de Junio de 2014, 09:55:31 »
Genial! Y como seria un código de ejemplo?

Desconectado Diego E.

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1086
Re: Manejo de bits de una variable
« Respuesta #3 en: 07 de Junio de 2014, 11:47:55 »
Hola, yo hago lo siguiente para utilizar bits

Para puertos
#define   rs_lcd    porta,0
#define   e_lcd    porta,1

Para variables
#define ban_libras  reg_configura,0
#define ban_mover reg_configura,1

Saludos.

Desconectado rotting79

  • PIC12
  • **
  • Mensajes: 91
Re: Manejo de bits de una variable
« Respuesta #4 en: 07 de Junio de 2014, 13:07:00 »
hey there

here is how to do it in XC8

union
{
   unsigned char _OUTPUTS_LEDS;
   
   struct   
   {
      unsigned LED_RC0   : 1;
      unsigned LED_RC1   : 1;
      unsigned LED_RC2   : 1;
      unsigned LED_RC3   : 1;
      unsigned LED_RC4   : 1;
      unsigned LED_RC5   : 1;
      
      } OUTPUTS_LEDS;   
   } PORTC_LEDS;

and then in your main loop, to control the whole Byte

   PORTC_LEDS . _OUTPUTS_LEDS = 0xF0;


and to control evrey bit

   PORTC_LEDS . OUTPUTS_LEDS . LED_RC0 = 0x01;
   PORTC_LEDS . OUTPUTS_LEDS . LED_RC5 = 0x00;


hope this helps..
...On November 2nd, a PIC10 became self-aware and decided our fate in __delay_us ( 1 ); ...

Desconectado teban89

  • PIC10
  • *
  • Mensajes: 16
Re: Manejo de bits de una variable
« Respuesta #5 en: 08 de Junio de 2014, 17:27:26 »
Hola, yo hago lo siguiente para utilizar bits

Para puertos
#define   rs_lcd    porta,0
#define   e_lcd    porta,1

Para variables
#define ban_libras  reg_configura,0
#define ban_mover reg_configura,1

Saludos.


Pero el #define no funciona asi, o si?

Por ejemplo:

#define   V0   VAR,0

while (1)
{

V0=1;
delay_ms(1000);
V0=0;
delay_ms(1000);
}

Asi lo estaria prendiendo y apagando?

Desconectado jhozate

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1698
Re: Manejo de bits de una variable
« Respuesta #6 en: 08 de Junio de 2014, 17:44:44 »
tal cual como lo pusiste en el primer post deberia funcionar
Citar
#byte PORTB=0x06
#bit b1=PORTB.1

en el main
Citar
while (1)
{

b1=1;
delay_ms(1000);
b1=0;
delay_ms(1000);
}

si usas CCS, en la ayuda puedes buscar #bit  o byte y saldra el ejemplo
Ser Colombiano es un Premio, Saludos desde CALI-COLOMBIA

Desconectado teban89

  • PIC10
  • *
  • Mensajes: 16
Re: Manejo de bits de una variable
« Respuesta #7 en: 08 de Junio de 2014, 20:25:44 »
Lo probe y esto me funciono a la perfeccion:

Citar
hey there

here is how to do it in XC8

union
{
   unsigned char _OUTPUTS_LEDS;
   
   struct   
   {
      unsigned LED_RC0   : 1;
      unsigned LED_RC1   : 1;
      unsigned LED_RC2   : 1;
      unsigned LED_RC3   : 1;
      unsigned LED_RC4   : 1;
      unsigned LED_RC5   : 1;
     
      } OUTPUTS_LEDS;   
   } PORTC_LEDS;

and then in your main loop, to control the whole Byte

   PORTC_LEDS . _OUTPUTS_LEDS = 0xF0;


and to control evrey bit

   PORTC_LEDS . OUTPUTS_LEDS . LED_RC0 = 0x01;
   PORTC_LEDS . OUTPUTS_LEDS . LED_RC5 = 0x00;


Tambien lo hice funcionar de esta manera (pongo el codigo completo):

#include <16f628a.h>

#reserve 0x20:0x23

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES INTRC_IO                 //Internal RC Osc, no CLKOUT
#FUSES PUT                      //Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NOBROWNOUT               //No brownout reset
#FUSES MCLR                     //Master Clear pin enabled
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection
#FUSES RESERVED                 //Used to set the reserved FUSE bits

#use delay(clock=4000000)

#byte VAR=0x20

#bit VAR_B0=VAR.0
#bit VAR_B1=VAR.1
#bit VAR_B2=VAR.2


De esta manera manejo los bits de la variable VAR, previamente declarados y reservando espacio en memoria con la directiva #reserve.

Lo bueno de la primer opcion (la de rotting79) es que ocupa en memoria solo lo necesario, pero si tenemos muchas variables se hace medio tedioso hacer ese codigo por CADA variable.
La segunda opcion es mas practica y simple que la primera, pero por cada variable seguimos usando como minimo 1 byte (cuando quizas con 3 bits nos sobre).

Lo que no se es cual de las dos consume menos recursos del micro y, por ende, es mas optima. Ustedes que opinan?

Desconectado teban89

  • PIC10
  • *
  • Mensajes: 16
Re: Manejo de bits de una variable
« Respuesta #8 en: 08 de Junio de 2014, 20:30:09 »
tal cual como lo pusiste en el primer post deberia funcionar
Citar
#byte PORTB=0x06
#bit b1=PORTB.1

en el main
Citar
while (1)
{

b1=1;
delay_ms(1000);
b1=0;
delay_ms(1000);
}

si usas CCS, en la ayuda puedes buscar #bit  o byte y saldra el ejemplo


Pero esto es para una salida del PORTB y si funciona, de hecho asi lo hago. Yo necesito hacer este manejo pero con LOS BITS DE UNA VARIABLE que uso dentro del programa.

Desconectado man3s

  • PIC12
  • **
  • Mensajes: 69
Re: Manejo de bits de una variable
« Respuesta #9 en: 08 de Julio de 2014, 19:13:27 »
Lo mas cercano que se me ocurre es el utilizar las funciones bit_set(var, bit), bit_clear() y bit_test() que a fin de cuentas son unicamentes "wrappers" para las operaciones a nivel bits.

Saludos.