Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #57 da revista programar. Faz já o download aqui!

gazela

Subtrair 2 numeros em BCD e obter resultado em decimal [RESOLVIDO]

Mensagens Recomendadas

gazela    0
gazela

Precisava aqui de uma ajuda, já pesquisei no google e aqui pelo fórum, mas ainda não consegui chegar a nenhuma solução.

É o seguinte, estou a fazer um jogo em C e quero utilizar o RTC para calcular o tempo que o jogo demorou. Já tenho as funções necessárias para ir buscar o valor da data e hora ao RTC, que funcionam perfeitamente. O problema está depois no cálculo da diferença entre o tempo final e o tempo inicial.

Todos os valores utilizados (hora, minuto e segundo) são devolvidos pelo RTC em BCD. Como é que posso fazer a subtração de 2 valores em BCD e ficar com um resultado em base 10?

Obrigado

*Edit

Bem já consegui resolver o problema, fiz uma função para passar os BCD para decimal antes de fazer a subtracção e assim já não tenho problema nenhum. Obrigado na mesma.

Fica aqui a função: (estão à vontade para aconselharem onde a optimizar)

int bcd2dec(unsigned long x)
{
int resultado = 0, i;

for (i = 7; i > 3; i--)
	if (x >> i & BIT(0))
		resultado += pow(2,i-4);

resultado *= 10;

for (i = 3; i > -1; i--)
	if (x >> i & BIT(0))
		resultado += pow(2,i);

return resultado;
}

A função é para BCD de 8 bits (o máximo que preciso de manejar).

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
bubulindo    112
bubulindo

Depois de ler BCD e RTC, suspeito que estejas a utilizar o DS1307 com um microcontrolador, correcto?

Estas são as funções que uso:

unsigned char to_bcd(unsigned char C)
{
unsigned char ret; 

ret = C%10 + ((C/10)<<4);
return ret;
}

unsigned char from_bcd(unsigned char BCD)
{
unsigned char ret; 

ret = (BCD&0xF) + 10*(BCD>>4);
return ret;
}

Se quiseres converter de BCD para string directo, podes utilizar o itoa() com radix 16.

Exemplo:

recebes BCD 22 que em binário é 0b00100010 e queres imprimir para um LCD ou pela porta série em ASCII.

0b00100010 = 0x22.

Se converteres para decimal, tens depois de converter para string. No entanto, se converteres o valor que recebeste em BCD directamente para string como se fosse um número em hexadecimal, poupas uma instrução. Tudo depende da aplicação, claro... se apenas pretenderes mostrar o valor do relógio num dispositivo baseado em ASCII, o ideal é mesmo fazer a conversão directa.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora


×

Aviso Sobre Cookies

Ao usar este site você aceita a nossa Política de Privacidade