Página 1 de 1

longtobcd ou inttobcd.

MensagemEnviado: 09 Fev 2009 12:10
por ffcprog
Amigos, estou precisando de algo que transforme uma long ou uma int não sinalizada em bcd.
no caso da int, a rotina pegaria o máximo valor int 65535 e jogaria em uma matris de 5 casas.
E no caso da long, a rotina pegaria o máximo valor long 4294967295 e jogaria em uma matris de 10 casas..

Eu ja testei para converter para string, só que perde muito tempo :(. Precisava de algo bem rapidão, tem algo assim para uC de 8 bits ?

ffcprog.

MensagemEnviado: 09 Fev 2009 12:18
por joao
Eu achei isto na internet:

Código: Selecionar todos
int bcd(int dec)
{
   return ((dec/10)<<4)+(dec%10);
}
int unbcd(int bcd)
{
   return ((bcd>>4)*10)+bcd%16;
}


Mas confesso que não peguei a idéia do BCD ainda...
Pode explicar com exemplos?
Pois pelo o que eu entendi, BCD usa 4 bits e só guarda números. Certo?

[]'s

MensagemEnviado: 09 Fev 2009 12:27
por ffcprog
tudo bem jhon ?

assim.
STRING DECIMAL = 48 + valor decimal de 0 a 9.
string decimal 1 = 49
string decimal 2 = 50
..............................
Certo ?

AGORA O BCD, é apenas o valor decimal de cada casa da string,
Eu poderia por exemplo inttostr(minha_int, meu_array_5);
meu_array[0] -= 48;
meu_array[1] -= 48;
..............................

Mas aí ele perde mais tempo ainda...

Eu queria algo pronto, que separasse a long ou a int apenas em valores decimais em uma matriz, e que fosse rapidão.
pois o tempo que eu tenho para conversão é de 1,235mS rodando a 20mhz.

ffcprog

MensagemEnviado: 09 Fev 2009 13:05
por joao
hmmm

Não entendi! :)
Desculpa, mas não entendi...

Digamos que vc tem num=123.
O que vc quer é por no seu char de 4 posicoes, isto?
Código: Selecionar todos
text[0] = '1';
text[1] = '2';
text[2] = '3';
text[3] = '\0';


Eu sei que para o gcc a existe o sprintf que joga o resultado do printf para string.
então, se vc tiver:
Código: Selecionar todos
int num = 123;
char text[4];

sprintf(text,"%d", num);


vc vai ter em text exatamente o que eu postei ali em cima.
Não sei se existe para compiladores usados em microprocessadores.

[]'s

MensagemEnviado: 09 Fev 2009 18:03
por ffcprog
int num = 123;
char text[4];

sprintf(text,"%d", num);

Hey jhon..

mais este comando converte uma int para 4 char, cada char o valor está em ASCII, ou em Decimal ?

ffcprog

MensagemEnviado: 09 Fev 2009 18:44
por ffcprog
cruiz credo,,,, sprintf o caramba.. ou jhon to mechendo com pic meu e não arm,,rsrsrs

Cara 14K só pra esse comando, ta louco.............rsrsrsrs

Bem, voltando ao assunto..

Rapido, simples, pequeno..

E que separa uma int em partes.
Dezena de milhar
Milhar
Centena
Dezena
Unidade.

"Não deve ser em sting, apenas seus respectivos decimais em uma array"

MensagemEnviado: 09 Fev 2009 19:59
por msamsoniuk
eh meio simplao hein! mas nao tem como converter base facil sem usar divisao e modulo...ao menos eu nao sei como! olha este exemplo simples:

Código: Selecionar todos
unsigned long long2bcd(unsigned long i)
{
  unsigned long r,c;

  for(c=r=0;i;i/=10,c+=4)
  {
    r |= (i%10)<<c;
  }
  return r;
}


em essencia, ele vai puxando a entrada em base 10 e fazendo a saida em base 16. eu fiz o exemplo usando variaveis fixas tambem, mas se vc quiser nao eh dificil adaptar para um array de nibbles.

MensagemEnviado: 09 Fev 2009 20:26
por barboza
Já fiz algo parecido para um printf customizado que precisei, e convertia int em string assim:

Código: Selecionar todos
u8   p_hexa_2_ascii (u8 u8_hexa)
{
   u8_hexa &= 0x0F;
   if (u8_hexa < 10) return ( u8_hexa + '0' );
   else return ( u8_hexa + ('A' - 10) );
}


void p_int_2_str(u16 u16_int, u8 *u8_str)
{
   u16 u16_cont;

   for (u16_cont = 10000; u16_cont; u16_cont /= 10)
   {
      *u8_str++ = p_hexa_2_ascii((u8) (u16_int / u16_cont));
      u16_int %= u16_cont;
   }
}


A essência é mesma do Marcelo, é só mais um exemplo.