Autor Tema: como hago para "armar " un byte con los bits que quiero?  (Leído 2616 veces)

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

Desconectado fastyx

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 353
como hago para "armar " un byte con los bits que quiero?
« 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!!!



Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: como hago para "armar " un byte con los bits que quiero?
« Respuesta #1 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);
}

Desconectado kain589

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 324
Re: como hago para "armar " un byte con los bits que quiero?
« Respuesta #2 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.       }
« Última modificación: 17 de Abril de 2006, 08:57:14 por kain589 »
Saludos desde Córdoba, españa

Desconectado jfh900

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3595
Re: como hago para "armar " un byte con los bits que quiero?
« Respuesta #3 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;

* Cuando hables, procura que tus palabras sean mejores que el silencio.
* 'Todos somos ignorantes, lo que ocurre es que no todos ignoramos las mismas cosas.' Albert Einstein.
* No hay nada peor que un experto para evitar el progreso en un campo
* "La vida es como una novela. No importa que sea larga, sino que esté bien narrada" Seneca
* La vida no se vive por las veces que respiras, sino por los momentos que dejan sin aliento.
* Dios dijo: ∇·E=ρ/ε0 ; ∇·B=0 ; ∇xE=-dB/dt ; ∇xB= μ0ε0dE/dt..y la luz se hizo..!!..

Desde España Jesús

Desconectado fastyx

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 353
Re: como hago para "armar " un byte con los bits que quiero?
« Respuesta #4 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!!!

Desconectado jfh900

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3595
Re: como hago para "armar " un byte con los bits que quiero?
« Respuesta #5 en: 18 de Abril de 2006, 19:54:44 »
El CCS no soporta arrays de tipo bit.  :(
* Cuando hables, procura que tus palabras sean mejores que el silencio.
* 'Todos somos ignorantes, lo que ocurre es que no todos ignoramos las mismas cosas.' Albert Einstein.
* No hay nada peor que un experto para evitar el progreso en un campo
* "La vida es como una novela. No importa que sea larga, sino que esté bien narrada" Seneca
* La vida no se vive por las veces que respiras, sino por los momentos que dejan sin aliento.
* Dios dijo: ∇·E=ρ/ε0 ; ∇·B=0 ; ∇xE=-dB/dt ; ∇xB= μ0ε0dE/dt..y la luz se hizo..!!..

Desde España Jesús

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: como hago para "armar " un byte con los bits que quiero?
« Respuesta #6 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.

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: como hago para "armar " un byte con los bits que quiero?
« Respuesta #7 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
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado fastyx

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 353
Re: como hago para "armar " un byte con los bits que quiero?
« Respuesta #8 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!!!

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
Re: como hago para "armar " un byte con los bits que quiero?
« Respuesta #9 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

Desconectado nyquist2

  • PIC10
  • *
  • Mensajes: 19
Re: como hago para "armar " un byte con los bits que quiero?
« Respuesta #10 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.
 


 

anything