Autor Tema: funciones a nivel de bits/bytes  (Leído 5511 veces)

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

Desconectado devaronaomar

  • PIC10
  • *
  • Mensajes: 27
funciones a nivel de bits/bytes
« 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.

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: funciones a nivel de bits/bytes
« Respuesta #1 en: 05 de Marzo de 2010, 16:07:31 »
si, no creo que haya una función incorporada en el CCS para eso...

te tocará hacerte la función

saludos.
.

Desconectado felipito

  • PIC10
  • *
  • Mensajes: 19
Re: funciones a nivel de bits/bytes
« Respuesta #2 en: 06 de Marzo de 2010, 17:23:31 »
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 );
 }
« Última modificación: 06 de Marzo de 2010, 17:26:17 por felipito »

Desconectado devaronaomar

  • PIC10
  • *
  • Mensajes: 27
Re: funciones a nivel de bits/bytes
« Respuesta #3 en: 08 de Marzo de 2010, 07:27:33 »
gracias felipito, voy a probarlo

Desconectado jim_17

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 309
    • Blog personal
Re: funciones a nivel de bits/bytes
« Respuesta #4 en: 08 de Marzo de 2010, 07:44:36 »
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) ?
Share the world !

Blog's

http://www.area0x33.com

Desconectado felipito

  • PIC10
  • *
  • Mensajes: 19
Re: funciones a nivel de bits/bytes
« Respuesta #5 en: 08 de Marzo de 2010, 09:39:46 »
Es correcto.

Desconectado devaronaomar

  • PIC10
  • *
  • Mensajes: 27
Re: funciones a nivel de bits/bytes
« Respuesta #6 en: 09 de Marzo de 2010, 12:47:49 »
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!

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: funciones a nivel de bits/bytes
« Respuesta #7 en: 09 de Marzo de 2010, 12:59:05 »
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
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado devaronaomar

  • PIC10
  • *
  • Mensajes: 27
Re: funciones a nivel de bits/bytes
« Respuesta #8 en: 09 de Marzo de 2010, 13:08:29 »
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 :-(

Desconectado pablomanieri

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 639
Re: funciones a nivel de bits/bytes
« Respuesta #9 en: 09 de Marzo de 2010, 13:14:26 »
es lo mismo trabajar en binario que en hexadecimal, por que dices que lo necesitas convertir?

Desconectado devaronaomar

  • PIC10
  • *
  • Mensajes: 27
Re: funciones a nivel de bits/bytes
« Respuesta #10 en: 09 de Marzo de 2010, 14:11:36 »
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

Desconectado pablomanieri

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 639
Re: funciones a nivel de bits/bytes
« Respuesta #11 en: 09 de Marzo de 2010, 14:55:17 »
Se puede hacer así
int32 concatena


....
concatena= ((int32)A)<<16|(int32)B;


Desconectado MarkKnopfler81

  • PIC12
  • **
  • Mensajes: 64
    • PICs, Electrónica y Robótica
Re: funciones a nivel de bits/bytes
« Respuesta #12 en: 09 de Marzo de 2010, 14:59:25 »
Para concatenar dos int16 solo debes multiplicar el byte mas significativo por 65536 y sumarlo al menos significativo de esta forma:

Código: [Seleccionar]
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.
« Última modificación: 09 de Marzo de 2010, 15:08:00 por MarkKnopfler81 »


 

anything