TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: fastyx en 16 de Abril de 2006, 22:47:19

Título: como hago para "armar " un byte con los bits que quiero?
Publicado por: fastyx en 16 de Abril de 2006, 22:47:19
Amigos: necesito que me enseñen como puedo asignarle a una variable de digamos 1 byte los bits que quiero y en el orden que quiero.

sucede que a veces no trabajo con un puerto entero  y necesito decir por ejemplo: el byte var esta formado por el bit ra0,ra1,ra2,rc3,rc4 ,rb5,rb6,rb7 y en ese orden.

desde ya gracias!!!


Título: Re: como hago para "armar " un byte con los bits que quiero?
Publicado por: migsantiago en 17 de Abril de 2006, 00:20:02
¿Qué te parece así?

Código: [Seleccionar]
int8 variable;

void asigna_bits(void)
{
if(input(pin_a0))
   bit_set(variable,0);
else bit_clear(variable,0);

...

if(input(pin_b7))
   bit_set(variable,7);
else bit_clear(variable,7);
}
Título: Re: como hago para "armar " un byte con los bits que quiero?
Publicado por: kain589 en 17 de Abril de 2006, 06:23:28
Por si te sirve ayer estuve haciendo algo parecido y lo hice asi, te puesto la parte de codigo interesantes

Código: C
  1. int m_estado;
  2.  
  3. #bit motor1e = m_estado.0//Habilita    1
  4. #bit motor1h = m_estado.1//Horario     1
  5. #bit motor1a = m_estado.2//Antihorario 1
  6. #bit motor2e = m_estado.3//Habilita    2
  7. #bit motor2h = m_estado.4//Horario     2
  8. #bit motor2a = m_estado.5//Antihorario 2
  9.  
  10. //m_estado se trata como una variable de 8 bits aunque yo la uso como de 6bits
  11.  
  12. void uso_puente (void){
  13.       //funcion que hara valores se asignen a salidas correspondientes
  14.       //las habilitaciones las ultimas
  15.       output_bit( PIN_A1, motor1h);
  16.       output_bit( PIN_A2, motor1a);
  17.       output_bit( PIN_C4, motor2h);
  18.       output_bit( PIN_C5, motor2a);
  19.       output_bit( PIN_A0, motor1e);
  20.       output_bit( PIN_C3, motor2e);
  21.       }
Título: Re: como hago para "armar " un byte con los bits que quiero?
Publicado por: jfh900 en 17 de Abril de 2006, 08:37:53
Otra forma es con las estructuras de "C":

struct sByte
{

 bit bit0;
 bit bit1;
 bit bit2;
 bit bit3;
 bit bit4;
 bit bit5;
 bit bit6;
 bit bit7;
}

union
{
  struct sByte usByte;
  int nByte;
} uByte;     

La forma de utilizarlo es:

uByte.nByte = 0b01110011;

Y para acceder a cualquiera de los bit"s:

uByte.usByte.bit4;  devolveria el bit 4 del registro.

O para esvribir un bit:

uByte.usByte.bit4 = 1;

Título: Re: como hago para "armar " un byte con los bits que quiero?
Publicado por: fastyx en 18 de Abril de 2006, 19:18:52
gracias por la contestacion amigos!!!!

lo de struct lo tengo que leer porque no entiendo algunas palabras de las expresiones

en cuanto a lo de definir bit a bit me parece interesante... lovoy a probar

desasnandome un poco estuve leyendo vectores....

se podria plantear algo como var[ 8] y que cada elemento del vector o array sea un bit?

desde ya gracias!!!
Título: Re: como hago para "armar " un byte con los bits que quiero?
Publicado por: jfh900 en 18 de Abril de 2006, 19:54:44
El CCS no soporta arrays de tipo bit.  :(
Título: Re: como hago para "armar " un byte con los bits que quiero?
Publicado por: migsantiago en 18 de Abril de 2006, 22:00:03
Cierto, CCS no compila arrays de 1 bit, yo lo intenté y simplemente no es posible.
Título: Re: como hago para "armar " un byte con los bits que quiero?
Publicado por: maunix en 18 de Abril de 2006, 22:09:24
Cierto, CCS no compila arrays de 1 bit, yo lo intenté y simplemente no es posible.

El C18 tampoco los soporta.  Creo que es porque termina siendo muy muy complejo el manejo de los mismos.

Si uno por ejemplo direccionara al bit nro 12, sería el 4bit del segundo byte en memoria lo cual realmente me parece bastante complejo en código, más pensando en que dicho código deba 'compilarse', es decir que tenga un código ensamblador asociado.

Saludos
Título: Re: como hago para "armar " un byte con los bits que quiero?
Publicado por: fastyx en 19 de Abril de 2006, 09:11:35
haber si estoy confundido....
yo me referia a definir #bit A= rbo; #bit B= rb1;o sea definir  a A y a B directamente en la ram  y asi sucesivamente y despues dentro del vector invocar a A, B como partes de la variable,no hace falta que el compilador busque que numero de bit ocupa en el byte , o si el bit numero 12 es del segundo byte

desde ya les agradezco la contestacion!!!
Título: Re: como hago para "armar " un byte con los bits que quiero?
Publicado por: pocher en 19 de Abril de 2006, 12:01:49
Te refieres a algo así:

#byte var = 0x50

#bit var0 = var.0
    .
    .
    .
#bit var7 = var.7

var0 = PIN_A0
var1 = PIN_A1
var2 = PIN_A2
var3 = PIN_C3
var4 = PIN_C4
var5 = PIN_B5
var6 = PIN_B6
var7 = PIN_B7

Un saludo
Título: Re: como hago para "armar " un byte con los bits que quiero?
Publicado por: nyquist2 en 19 de Abril de 2006, 13:02:54
Hola,

Si lo q necesitas es trabajar con variables q ocupen un bit, podes crear un campo de bits de esta forma:
 unsigned A:1;    //A es un bit
 unsigned B:2;    //B ocupa dos bits

Los podes sar asi nomas o si los pones dentro de una estructura, vas a ocupar menos ram, porque el compilador asigna las direcciones de memoria continuas.
Código: DOS
  1.  
Lo q estas haciendo es particionar una variable del tipo unsigned en bits (16) y asignarle a A una de esas particiones (o a B dos). Tengo entendido que podes hacer esto usando unsigned o int (tendrias q fijarte si en tu compilador podes hacerlo con otro tipo).

Saludos, Nyquist.