Escrevendo as funções highBits() e lowBits no Arduino

Olá Pessoal,

Precisei de uma função para retornar os 4 bits menos significativos e os 4 bits mais significativos de um byte e como não encontrei prontas, escrevi de forma didática os códigos abaixo.

Como exemplo, para um byte = 00010010 teremos em decimal 18.

A função highBits(18) retornará 1; // (0001).

e a função lowBits(18) retornará 2 ; // (0010)

Resultando = 12 em hexadecimal

Se os colegas que trabalham com Arduino puderem ajudar simplificando as funções para ficarem mais rápidas, ficarei agradecido.

 

unsigned int lowBits(unsigned int _valor) {
unsigned int valor0, valor1, valor2, valor3;
       valor0 = bitRead(_valor,0);
       valor1 = bitRead(_valor,1);
       valor2 = bitRead(_valor,2);
       valor3 = bitRead(_valor,3);
       return valor3*8 + valor2*4 + valor1*2 + valor0;
}

unsigned int highBits(unsigned int _valor) {
unsigned int valor4, valor5, valor6, valor7;
       valor4 = bitRead(_valor,4);
       valor5 = bitRead(_valor,5);
       valor6 = bitRead(_valor,6);
       valor7 = bitRead(_valor,7);
       return valor7*8 + valor6*4 + valor5*2 + valor4;
}

Exibições: 905

Responder esta

Respostas a este tópico

Olá Milton,

Que tal essa solução:

unsigned int lowBits(unsigned int x) {
       unsigned int lowx = x & B00001111;
       return lowx;
}

unsigned int highBits(unsigned int x) {
       unsigned int highx = x >> 4;
       return highx;
}

Abraço;

Olá Marcos,

Parabéns pela simplificação das funções, ficaram ótimas!

Abç

Olá Marcelo,

Eu tentei as funções que você indicou, mas elas são para selecionar bytes inteiros.

Agradeço pela sua sugestão também.

Abç

Boa noite, acho que minha sugestão seria assim:

unsigned char MHSB (unsigned char valor) {   // MSB (Most half significant bits)

    return ((valor & 0xF0)>>4); 

}

unsigned char LHSB (unsigned char valor) {   // LSB (Least half significant bits)

    return (valor & 0x0F);

}

Mas caso alguém tenha uma sugestão mais apreciável, fiquem a vontade para comentar e sugerir.

Olá Jisser, parabéns

Essa solução ficou ótima também, o que demonstra que temos muito chão para percorrer na programação do Arduino.

Será que alguém ainda tem mais uma solução inusitada?

Abç

Como você está trabalhando com 8bits não com 16, sugiro utilizar o tipo byte no lugar de unsigned int.

Além de não precisar alocar em outra variável para retornar o valor. 

byte lowBits(byte value)
{
return (value & 0x0f);
}

byte highBits(byte value)
{
return (value >> 4);
}

Valeu Bruno,

Seu código ficou enxuto! muito bom.

 

Abç

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço