TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: devaronaomar en 05 de Marzo de 2010, 14:22:35
-
Hola a todos. Mi pregunta es simple:
Alguien sabe cómo puedo cambiar el lugar los bits de un byte en CCS de forma que el más significativo pase a ser el menos significativo y viceversa? He mirado en la ayuda pero no encuentro una función que me ayude en eso.
Gracias.
-
si, no creo que haya una función incorporada en el CCS para eso...
te tocará hacerte la función
saludos.
-
Por aquì hay algo, entre dir y sale dir_out invertido
void invert_bits(int dir )
{int i,dir_out;
dir_out = 0;
for(i =0; i<8; i++)
{if( bit_test(dir, i)==1 )
bit_set(dir_out, 7-i);
}
return ( dir_out );
}
-
gracias felipito, voy a probarlo
-
Una pregunta, en la función de filipito él está devolviendo un valor, entonces no tendría que definir la función así: int invert_bits(int dir) ?
-
Es correcto.
-
Ahora me encuentro con otro problema en mi código.. tengo dos valores hexadecimales de 16bits cada uno tal que así
A)0x00XX
B)0xXXXX
En binario sería algo así:
A)0000 0000 xxxx xxxx
B)xxxx xxxx xxxx xxxx
Y necesito en primer lugar cambiar los primeros bits de A) para tener un 0x2, es decir que sean 0000 0010 en lugar de 0000 0000, y en segundo lugar concatenar A) y B) de forma que :
A) concatenado B) = 0x02XX XXXX
Había pensado en pasar A) a binario para cambiarle únicamente el bit número 7 (leyendo de izda a dcha) y luego pasar el resultado a hexadecimal, concatenar con B) y transmitir.
El caso es que no encuentro las funciones adecuadas en CCS para pasar de una base a otras, y tampoco sé como puedo cambiar un único bit en una trama.
Alguien me indica cómo puedo hacerlo?
gracias!
-
Para cambiar x cantidad de bits, tenés que usar máscaras....
El tema es hacer una or con un número que tenga a 1 los bits que querés que se seteen en tu variable (esto si querés setear bits)
Para borrar bits tenés que hacer una and con un número que tenga a 0 los bits que querés que se borren en tu variable.
Ejemplo con un byte, si tenés el valor 0b10000000 (que sería lo mismo que decir 128 en decimal) y querés setearle (hacer 1) el bit 1 (teniendo en cuenta que los bits van de 0 a 7).
sólo basta con decir
variable = variable | 0b00000010... o lo mismo a variable |= 0b00000010.... variable |= 2
-
muchas gracias, eso resuelve en parte mi problema, aunque para poder aplicarlo necesito una función que pase de hexadecimal a binario y de binario a hexadecimal.. me extraña que css no tenga alguna, aunque no la encuentro por ninguna parte :-(
-
es lo mismo trabajar en binario que en hexadecimal, por que dices que lo necesitas convertir?
-
no sé, me resulta más fácil trabajar en binario, aunque supongo que será cuestión de práctica.. lo que sí que sigo necesitando es una forma de concatenar A) y B) :-s
-
Se puede hacer así
int32 concatena
....
concatena= ((int32)A)<<16|(int32)B;
-
Para concatenar dos int16 solo debes multiplicar el byte mas significativo por 65536 y sumarlo al menos significativo de esta forma:
int32 valor;
int16 A=64;
int16 B=8;
A|=2; // Aquí le hago un OR con 0b00000010 a la variable A, como explico AngelGris
Valor=A;
Valor*=65536;
Valor+=B;
Saludos.
Edito: esta solución y la que te dió pablomanieri tienen el mismo resultado pero la de pablomanieri es mas corta, elegante y rápida, jeje
Saludos.