TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: teban89 en 07 de Junio de 2014, 02:53:21

Título: Manejo de bits de una variable
Publicado por: teban89 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!
Título: Re: Manejo de bits de una variable
Publicado por: BrunoF en 07 de Junio de 2014, 03:29:17
Es cortita la respuesta:

Sí.

Saludos
Título: Re: Manejo de bits de una variable
Publicado por: teban89 en 07 de Junio de 2014, 09:55:31
Genial! Y como seria un código de ejemplo?
Título: Re: Manejo de bits de una variable
Publicado por: Diego E. 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.
Título: Re: Manejo de bits de una variable
Publicado por: rotting79 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..
Título: Re: Manejo de bits de una variable
Publicado por: teban89 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?
Título: Re: Manejo de bits de una variable
Publicado por: jhozate 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
Título: Re: Manejo de bits de una variable
Publicado por: teban89 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?
Título: Re: Manejo de bits de una variable
Publicado por: teban89 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.
Título: Re: Manejo de bits de una variable
Publicado por: man3s 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.