TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: aitopes en 11 de Octubre de 2007, 12:05:20

Título: Bits individuales de un int
Publicado por: aitopes en 11 de Octubre de 2007, 12:05:20
Hola amigos!

Necesito de su "sapiencia": tengo una funcion que recibe como parametro un bit (int1, en CCS) , y hace "algo" con el. Pero necesito que haga ese "algo" con cada uno de los bits de una variable tipo int8 .

La pregunta es: ¿Como hago para que, dentro de un for, pueda invocar 8 veces a la funcion en cuestion pasandole como parametro cada uno de los bits de la variable int8?

Gracias por adelantado!
Título: Re: Bits individuales de un int
Publicado por: jfh900 en 11 de Octubre de 2007, 12:26:07
En este post dimos varias soluciones, yo soy partidario de las estructuras y así aporte mi granito de arena:

http://www.todopic.com.ar/foros/index.php?topic=4867.msg36512#msg36512

Un saludo

Título: Re: Bits individuales de un int
Publicado por: Azicuetano en 11 de Octubre de 2007, 12:28:55
Hay una función muy bonita que se llama:

Código: [Seleccionar]
Syntax:
 value = bit_test (var, bit)
 
Parameters:
 var may be a 8,16 or 32 bit variable (any lvalue) bit is a number 0-31 representing a bit number, 0 is the least significant bit.
 
Returns:
 0 or 1

Function:
 Tests the specified bit  (0-7,0-15 or 0-31) in the given variable.   The least significant bit is 0.    This function is much more efficient than, but otherwise the same as: ((var & (1<<bit)) != 0)

supongo que sería algo parecido a esto:

for(n=0; n<8; n++)
{
     llamada_a_funcion( bit_test( variable_de_aitpes_de_8_bits,n ) );
}

De esta forma llamarás a la función 8 veces y le pasarás como parámetro un '1' o un '0' dependiendo del valor que tengas en esa posición en la variable 'variable_de_aitpes_de_8_bits'

Ufff... no se si se entiende muy bien, pero, me puedo esmerar más, eh?  :D Si no queda muy claro avisa que me explico mejor  :mrgreen:


Un saludo desde Alicante.
 
Título: Re: Bits individuales de un int
Publicado por: pocher en 11 de Octubre de 2007, 12:30:50
Mira a ver si te sirve esto: bit_test(variable,i)

Un saludo
Título: Re: Bits individuales de un int
Publicado por: aitopes en 11 de Octubre de 2007, 12:32:41
Buenisimo!!!!

Por esta vez voy a usar bit_test.

Lo de las extructuras pinta como mas complicado (es que hace poco que estoy con CCS).

Gracias a todos!

Ariel.
Título: Re: Bits individuales de un int
Publicado por: MGLSOFT en 11 de Octubre de 2007, 16:00:46
Creo que por ahora CCS no permite el array de bits...
Título: Re: Bits individuales de un int
Publicado por: aitopes en 11 de Octubre de 2007, 16:13:17
Ya esta funcionando perfectamente!

No se que haria sin su ayuda. ¡No se vayan de ahi! :)

Asi quedo:

Citar
void escribodisplay(int8 digito) {
   int8 n;
   for(n=0; n<8; n++){
     enviodata( bit_test( tab7seg[digito],n ) ); }   
}


void enviodata(int1 digito) {
//------------------------------------------------------------------------------
//---Envia un 0 o un 1 al registro de desplazamiento:
//------------------------------------------------------------------------------
   RDD_DATA  = digito;
   RDD_CLOCK = 0;
   RDD_CLOCK = 1;
}
Título: Re: Bits individuales de un int
Publicado por: LABmouse en 11 de Octubre de 2007, 16:40:08
Creo que por ahora CCS no permite el array de bits...

Creo que de la version 4.0 en adelante si lo permite amigo MGLASOFT... Por lo menos la que tengo si lo permite.

int1 A_BITS[100]; Eso funciona bien!!!

Lo que si pasa es que cuando intentas trabajar con PROTEUS, este te dice que array de bits no acepta, pero CCS si lo deja.

SALUDOS!!
Título: Re: Bits individuales de un int
Publicado por: PalitroqueZ en 13 de Octubre de 2007, 14:53:39
Ya esta funcionando perfectamente!

No se que haria sin su ayuda. ¡No se vayan de ahi! :)

Asi quedo:

Citar
void escribodisplay(int8 digito) {
   int8 n;
   for(n=0; n<8; n++){
     enviodata( bit_test( tab7seg[digito],n ) ); }   
}


void enviodata(int1 digito) {
//------------------------------------------------------------------------------
//---Envia un 0 o un 1 al registro de desplazamiento:
//------------------------------------------------------------------------------
   RDD_DATA  = digito;
   RDD_CLOCK = 0;
   RDD_CLOCK = 1;
}


ajá Ariel, leyendo tu código creo que andamos en lo mismo  :P
Título: Re: Bits individuales de un int
Publicado por: aitopes en 13 de Octubre de 2007, 15:00:53
Pedro, necesitas el .C completo? Te lo paso en privado, junto al esquema.

Basicamente, es un display de varios digitos de 7 segmentos manejado por dos pines, mediante un registro de desplazamiento. Nada de otro mundo, pero como no conozco un pito de CCS, me compliqué... :)