Autor Tema: Rutina 1/2 byte a decimal  (Leído 1991 veces)

0 Usuarios y 3 Visitantes están viendo este tema.

Desconectado iNoXSteeL

  • PIC12
  • **
  • Mensajes: 75
    • La web de InoX
Rutina 1/2 byte a decimal
« 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);

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Rutina 1/2 byte a decimal
« Respuesta #1 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!
« Última modificación: 11 de Diciembre de 2009, 11:30:41 por Suky »
No contesto mensajes privados, las consultas en el foro

Desconectado doppel

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1534
Re: Rutina 1/2 byte a decimal
« Respuesta #2 en: 11 de Diciembre de 2009, 11:40:59 »
Hola

Aprovechando la respuesta, Suki, podrias explicar como funciona eso de la máscara? gracias
" Para ser exitoso no tienes que hacer cosas extraordinarias. Haz cosas ordinarias, extraordinariamente bien "

Desconectado iNoXSteeL

  • PIC12
  • **
  • Mensajes: 75
    • La web de InoX
Re: Rutina 1/2 byte a decimal
« Respuesta #3 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:

Desconectado iNoXSteeL

  • PIC12
  • **
  • Mensajes: 75
    • La web de InoX
Re: Rutina 1/2 byte a decimal
« Respuesta #4 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:

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Rutina 1/2 byte a decimal
« Respuesta #5 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!
No contesto mensajes privados, las consultas en el foro

Desconectado doppel

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1534
Re: Rutina 1/2 byte a decimal
« Respuesta #6 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
" Para ser exitoso no tienes que hacer cosas extraordinarias. Haz cosas ordinarias, extraordinariamente bien "

Desconectado iNoXSteeL

  • PIC12
  • **
  • Mensajes: 75
    • La web de InoX
Re: Rutina 1/2 byte a decimal
« Respuesta #7 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

Desconectado doppel

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1534
Re: Rutina 1/2 byte a decimal
« Respuesta #8 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

saludos

" Para ser exitoso no tienes que hacer cosas extraordinarias. Haz cosas ordinarias, extraordinariamente bien "

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Rutina 1/2 byte a decimal
« Respuesta #9 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!
No contesto mensajes privados, las consultas en el foro

Desconectado doppel

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1534
Re: Rutina 1/2 byte a decimal
« Respuesta #10 en: 11 de Diciembre de 2009, 12:05:05 »
se agradece, es muy útil !!  :-/
" Para ser exitoso no tienes que hacer cosas extraordinarias. Haz cosas ordinarias, extraordinariamente bien "


 

anything