TODOPIC
Bienvenido(a), Visitante. Por favor, ingresa o regístrate.
¿Perdiste tu email de activación?
03 de Septiembre de 2010, 05:22:55

Ingresar con nombre de usuario, contraseña y duración de la sesión
Buscar:     Búsqueda Avanzada
257111 Mensajes en 28437 Temas por 27916 Usuarios
Último usuario: zororyuzaki
* Inicio Ayuda Buscar Calendario Ingresar Registrarse
Buscar en TodoPIC
+  TODOPIC
|-+  Microcontroladores PIC
| |-+  Lenguaje C para microcontroladores PIC (Moderadores: Modulay, pikman, pocher, vszener, Suky)
| | |-+  funciones a nivel de bits/bytes
0 Usuarios y 1 Visitante están viendo este tema. « anterior próximo »
Páginas: [1] Marcar como favorito Imprimir
Autor Tema: funciones a nivel de bits/bytes  (Leído 314 veces)
devaronaomar
PIC10
*
Desconectado Desconectado

España España

Mensajes: 24


« : 05 de Marzo de 2010, 02: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.
En línea
Cryn
Colaborador
DsPIC30
*****
Desconectado Desconectado

Sexo: Masculino
Bolivia Bolivia

Mensajes: 3914


ahora con C18 C30 C32


« Respuesta #1 : 05 de Marzo de 2010, 04:07:31 »

si, no creo que haya una función incorporada en el CCS para eso...

te tocará hacerte la función

saludos.
En línea

El peor día, cuando te fuiste.
Cuando estabas a nuestro lado, los mejores
felipito
PIC10
*
Desconectado Desconectado

Mensajes: 19


« Respuesta #2 : 06 de Marzo de 2010, 05: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, 05:26:17 por felipito » En línea
devaronaomar
PIC10
*
Desconectado Desconectado

España España

Mensajes: 24


« Respuesta #3 : 08 de Marzo de 2010, 07:27:33 »

gracias felipito, voy a probarlo
En línea
jim_17
Colaborador
PIC18
*****
Desconectado Desconectado

Sexo: Masculino
España España

Mensajes: 269



WWW
« Respuesta #4 : 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) ?
En línea

Share the world !

JIM17 Blog's

http://jimjim17.blogspot.com
felipito
PIC10
*
Desconectado Desconectado

Mensajes: 19


« Respuesta #5 : 08 de Marzo de 2010, 09:39:46 »

Es correcto.
En línea
devaronaomar
PIC10
*
Desconectado Desconectado

España España

Mensajes: 24


« Respuesta #6 : 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!
En línea
AngelGris
PIC16
***
Desconectado Desconectado

Argentina Argentina

Mensajes: 222


« Respuesta #7 : 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
En línea
devaronaomar
PIC10
*
Desconectado Desconectado

España España

Mensajes: 24


« Respuesta #8 : 09 de Marzo de 2010, 01: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 Sad
En línea
pablomanieri
Colaborador
PIC18
*****
Desconectado Desconectado

Sexo: Masculino
Argentina Argentina

Mensajes: 413



« Respuesta #9 : 09 de Marzo de 2010, 01:14:26 »

es lo mismo trabajar en binario que en hexadecimal, por que dices que lo necesitas convertir?
En línea
devaronaomar
PIC10
*
Desconectado Desconectado

España España

Mensajes: 24


« Respuesta #10 : 09 de Marzo de 2010, 02: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
En línea
pablomanieri
Colaborador
PIC18
*****
Desconectado Desconectado

Sexo: Masculino
Argentina Argentina

Mensajes: 413



« Respuesta #11 : 09 de Marzo de 2010, 02:55:17 »

Se puede hacer así
int32 concatena


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

En línea
MarkKnopfler81
PIC12
**
Desconectado Desconectado

Sexo: Masculino
España España

Mensajes: 54



WWW
« Respuesta #12 : 09 de Marzo de 2010, 02: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:
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, 03:08:00 por MarkKnopfler81 » En línea

TODOPIC
   

 En línea
Páginas: [1] Imprimir 
« anterior próximo »
Ir a:  

Impulsado por MySQL Impulsado por PHP Powered by SMF 1.1.11 | SMF © 2006-2008, Simple Machines LLC XHTML 1.0 válido! CSS válido!
Página creada en 0.076 segundos con 22 consultas.