TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: iNoXSteeL en 11 de Diciembre de 2009, 11:15:52

Título: Rutina 1/2 byte a decimal
Publicado por: iNoXSteeL en 11 de Diciembre de 2009, 11:15:52
Hola a todos,

Estoy implementando la transmisión por infrarrojos con 1 byte, los 4 LSB serán los comandos y los 4 MSB serán la dirección.

Estoy conviertiendo los 4 bits a decimal de la siguiente forma:

Código: C
  1. int bitCODE[] = {0,0,0,0,0,1,1,0};    //El byte recibido por infrarojos
  2.    int irDIR=0;
  3.  
  4.      irDIR = (bitCODE[4] * 8) +        //Con esta rutina lo convierto a decimal
  5.                  (bitCODE[5] * 4) +
  6.                  (bitCODE[6] * 2) +
  7.                   bitCODE[7];

Mi pregunta es como podría hacer ésto más elegante, ya que lo veo un poco rudimentario. (el codigo funciona bien);
Título: Re: Rutina 1/2 byte a decimal
Publicado por: Suky en 11 de Diciembre de 2009, 11:28:40
No entiendo  :? Porque veo que recibes 8 bytes y no un solo byte.

Si tuvieras un solo Byte, puedes hacer una mascara ((Byte&0xF0)>>4) para capturar el nible alto y pasarlo al bajo.

Saludos!
Título: Re: Rutina 1/2 byte a decimal
Publicado por: doppel en 11 de Diciembre de 2009, 11:40:59
Hola

Aprovechando la respuesta, Suki, podrias explicar como funciona eso de la máscara? gracias
Título: Re: Rutina 1/2 byte a decimal
Publicado por: iNoXSteeL en 11 de Diciembre de 2009, 11:45:24
Cierto Suky, error mio, ahora si es un byte no?

Código: C
  1. short int bitCODE[] = {0,0,0,0,1,1,0,1};
  2.  
  3.   int irDIR=0;
  4.    
  5.      irDIR = (bitCODE[4] * 8) +
  6.                  (bitCODE[5] * 4) +
  7.                  (bitCODE[6] * 2) +
  8.                   bitCODE[7];

El tema del uso de máscaras me suena todavía complejo, no lo capto  :oops:
Título: Re: Rutina 1/2 byte a decimal
Publicado por: iNoXSteeL en 11 de Diciembre de 2009, 11:46:41
Hola

Aprovechando la respuesta, Suki, podrias explicar como funciona eso de la máscara? gracias

Eso, eso.. en mi caso algo así "for Dummies"  :mrgreen:
Título: Re: Rutina 1/2 byte a decimal
Publicado por: Suky en 11 de Diciembre de 2009, 11:47:18
Hola

Aprovechando la respuesta, Suki, podrias explicar como funciona eso de la máscara? gracias

La primer parte hace un AND entre el Byte y 0xF0, osea que mantiene el valor que haya en el nible alto y coloca a 0 el nible bajo. Luego se rota 4 veces a la derecha. Pero ahora que lo veo, con solo rotarlo a la derecha 4 veces se logra lo buscado  :mrgreen: osea (Byte>>4)

Saludos!
Título: Re: Rutina 1/2 byte a decimal
Publicado por: doppel en 11 de Diciembre de 2009, 11:54:03
muchas gracias! donde puedo encontrar informacion mas detallada sobre máscaras? de ser posible en castellano
saludos
Título: Re: Rutina 1/2 byte a decimal
Publicado por: iNoXSteeL en 11 de Diciembre de 2009, 11:55:42
Gracias Suki, pero tengo que buscar más a fondo sobre las máscaras, porque no me entero :huh:

Lo he modificado de ésta manera y lo veo mejor...

Código: C
  1. short int bitCODE[] = {0,0,0,0,1,0,0,1};
  2.  
  3.  int irDIR=0;
  4.  
  5.      int i=0; int y=8;
  6.  
  7.          for (i=4;i<8;i++)
  8.                 {
  9.             irDIR += (bitCODE[i] * (y));
  10.             y /= 2;
  11.                 }

Saludos
Título: Re: Rutina 1/2 byte a decimal
Publicado por: doppel en 11 de Diciembre de 2009, 11:58:39
de nuevo.....
encontré esta explicacion mas detallada que nos puede servir, sacado de Ucontrol
LINK máscaras (http://www.ucontrol.com.ar/forosmf/programacion-en-c/uso-de-mascaras/)

saludos

Título: Re: Rutina 1/2 byte a decimal
Publicado por: Suky en 11 de Diciembre de 2009, 12:02:27
muchas gracias! donde puedo encontrar informacion mas detallada sobre máscaras? de ser posible en castellano
saludos


 :? No se, es que son operaciones lógicas nada más  ;-) Con la operación AND forzas a que ciertos bit se hagan 0, por ejemplo:
Código: [Seleccionar]
Byte=0b01011011
Byte=(0b11111110&Byte);
Ahora Byte=01011010

Forzas a que el bit 0 sea 0 por la simple operación lógica aplicada bit a bit.

En cambio aplicar un OR fuerza a setear un bit, por ejemplo:
Código: [Seleccionar]
Byte=0b01011011
Byte=(0b10000000|Byte);
Ahora Byte=11011011


Saludos!
Título: Re: Rutina 1/2 byte a decimal
Publicado por: doppel en 11 de Diciembre de 2009, 12:05:05
se agradece, es muy útil !!  :-/