TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado 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!
-
Es cortita la respuesta:
Sí.
Saludos
-
Genial! Y como seria un código de ejemplo?
-
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.
-
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..
-
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?
-
tal cual como lo pusiste en el primer post deberia funcionar
#byte PORTB=0x06
#bit b1=PORTB.1
en el main
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
-
Lo probe y esto me funciono a la perfeccion:
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?
-
tal cual como lo pusiste en el primer post deberia funcionar
#byte PORTB=0x06
#bit b1=PORTB.1
en el main
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.
-
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.