Converter Double para String

Software e Hardware para uC da Qualcomm, NXP, FreeScale e Motorola

Moderadores: 51, guest2003

Converter Double para String

Mensagempor Junior_C » 12 Mar 2008 16:50

Olá, preciso mostrar o valor de um double em um LCD mas não estou conseguindo, tentei usar a função Sprintf mas não funciona com o double, será que estou fazendo algo errado? segue abaixo um trecho do código


void main(void) {
double teste_float;
char teste_str[200];
teste_float =12.01;

while(1){
(void)sprintf(teste_str,"teste=%f\n",teste_float);

saida1 = 1;

while(1){
}

}
}


Após executar a função sprintf a string teste_str fica assim "teste=" estou utilizando o codewarrior 5.1 e o mcu 9s08gt16.

Se alguem souber o que está errado, ou conheça outra função por favor me ajude, obrigado a todos.
Junior_C
Nibble
 
Mensagens: 72
Registrado em: 16 Nov 2006 14:30

Mensagempor Fábio Pereira » 12 Mar 2008 17:26

Se não estou enganado, o código de formatação para double é %g ou %e ...

T+
Fábio Pereira
embeddedsystems.io
Avatar do usuário
Fábio Pereira
Word
 
Mensagens: 674
Registrado em: 16 Out 2006 09:07
Localização: Kitchener, ON

Mensagempor Junior_C » 12 Mar 2008 20:52

Obrigado pela dica, mas já havia testado antes com %e, %g mas não funcionu tb
Junior_C
Nibble
 
Mensagens: 72
Registrado em: 16 Nov 2006 14:30

Mensagempor Junior_C » 13 Mar 2008 07:56

Descobri o que estava acontecendo, era uma configuração do compilador, estava configurado para não oferecer suporte aos tipos doule e float.
Junior_C
Nibble
 
Mensagens: 72
Registrado em: 16 Nov 2006 14:30

Mensagempor Kremer » 13 Mar 2008 08:53

Haja flash !!!

Sugestão:

Quantas casa decimais vc precisa no LCD? Para economizar memoria pelo menos com o sprintf (que é um gastão de flash), multiplique seu valor por 10^numero de casas decimais e trunque o valor para um long. Depois faça a sua propria int_to_ascii (ou use o sprintf para inteiro) e escalone o ponto decimal na string resultante.
So pra se ter uma ideia, em um projetinho meu com o QG8 que tem 8K de flash e 512 bytes de RAM coloquei uma serie de coisas como filtro digital em ponto fixo, bootloader, e todo um set de comandos, além de reservar uma página inteira para emular EEPROM. Se eu tivesse usado sprintf nesse projeto nunca teria conseguido colocar tudo que eu precisava.
Até usei ela no começo (só para inteiros) e em um certo ponto vi que não daria. Neste ponto, por exemplo, o programa com o sprintf estava em 5555 bytes ocupados na flash, e sem o sprintf ocupava apenas 3661 bytes. Uma bela redução...
Avatar do usuário
Kremer
Nibble
 
Mensagens: 82
Registrado em: 25 Jul 2007 17:15
Localização: Florianópolis

Mensagempor Ander_sil » 13 Mar 2008 09:06

Eu já usei o sprintf no keil para formatar uma string para o LCD dessa maneira:

Código: Selecionar todos
sprintf((char*)time,"%02d:%02d:%02d",hora,min,seg);   
LCD_printf(time,LINHA2,CENTRO);   // Envio a hora para o LCD


Note que converto de int para char na própria função do sprintf.

falou!
Anderson Chrispim da Silva
chrispimdasilva@gmail.com
Ander_sil
Byte
 
Mensagens: 368
Registrado em: 30 Out 2006 09:58
Localização: Campinas - SP

Mensagempor Ander_sil » 13 Mar 2008 09:13

Realmente usando o sprintf, printf e etc... aumentou em pelo menos 2K no programa que fiz pro 8051.
Anderson Chrispim da Silva
chrispimdasilva@gmail.com
Ander_sil
Byte
 
Mensagens: 368
Registrado em: 30 Out 2006 09:58
Localização: Campinas - SP

Mensagempor Junior_C » 14 Mar 2008 14:44

Realmente usando o sprintf aumentou em 5,5k o código gerado e só tenho 4,5k disponivel, alguem tem algum exemplo de float to string sem usar o sprintf?
Junior_C
Nibble
 
Mensagens: 72
Registrado em: 16 Nov 2006 14:30

Mensagempor Fábio Pereira » 14 Mar 2008 19:26

Float para ASCII ?

Pode se preparar para estudar...

Um documento que já li e que trata disso é a AN575 da Microchip. Esta AN mostra a conversão de float IEE754 para inteiro (é claro que é em assembly de PIC).

Obviamente que depois você ainda terá de converter o inteiro para ASCII mas isso é bem fácil.

T+
Fábio Pereira
embeddedsystems.io
Avatar do usuário
Fábio Pereira
Word
 
Mensagens: 674
Registrado em: 16 Out 2006 09:07
Localização: Kitchener, ON

Mensagempor CCandido » 14 Mar 2008 22:42

usei sprintf gasta muita memoria, axo que toda vez que chama ele
gera outra rotina, entao evite mas, se for usa chame ele um vez so em uma funçao axo que diminui bastante.

meu_sprintf (......);

void meu_sprintf (......){

(void) sprintf(blablabla ); 1 vez so
}
CCandido
Byte
 
Mensagens: 120
Registrado em: 12 Out 2006 12:54
Localização: Londrina-PR

Mensagempor Maia » 15 Mar 2008 09:09

Olá,
Quando a memória é pouca eu uso essa função:

Código: Selecionar todos
void print_val(double v)  /* 0 <= V < 999.9995 */
{
     unsigned long ll;
   neg = 0;
   if (v < 0){
        neg = 1;
        v *= -1.0;
   }     
   v*=2000; 
   ll = (long)v; 
   ll++; 
   ll>>=1; 
   st[5] = ll % 10;
   ll = ll / 10; 
   st[4] = ll % 10;
   ll = ll / 10; 
   st[3] = ll % 10;
   ll = ll / 10; 
   st[2] = ll % 10;
   ll = ll / 10; 
   st[1] = ll % 10;
   ll = ll / 10; 
   st[0] = ll % 10; 
   if (!st[0])  {
      if (!st[1])     
         st[1]=0xF0;   
      st[0]=0xF0; 
   } 
   st[7] = 0;
   st[7] = st[5] + '0';
   st[6] = st[4] + '0';
   st[5] = st[3] + '0';
   st[4] = '.';
   st[3] = st[2] + '0';
   st[2] = st[1] + '0'; 
   st[1] = st[0] + '0'; 
   if (neg == 1)
      st[0] = '-';
   else
      st[0] = ' ';    
}   


Abraços,
Maia
Avatar do usuário
Maia
Byte
 
Mensagens: 348
Registrado em: 15 Out 2006 16:25
Localização: Rio de Janeiro

Mensagempor Fábio Pereira » 15 Mar 2008 11:42

CCandido escreveu:usei sprintf gasta muita memoria, axo que toda vez que chama ele
gera outra rotina, entao evite mas, se for usa chame ele um vez so em uma funçao axo que diminui bastante.

meu_sprintf (......);

void meu_sprintf (......){

(void) sprintf(blablabla ); 1 vez so
}


De onde você tirou isso Ccandido?

A não ser que a função sprintf esteja definida como inline, o compilador insere somente uma chamada para a função e não o código da função completa...

T+
Fábio Pereira
embeddedsystems.io
Avatar do usuário
Fábio Pereira
Word
 
Mensagens: 674
Registrado em: 16 Out 2006 09:07
Localização: Kitchener, ON

Mensagempor Junior_C » 17 Mar 2008 20:32

Obrigado a todos pelas dicas, mas não teve jeito acabei usando o sprintf mesmo e tive que troca o mcu por um de 32k.
Junior_C
Nibble
 
Mensagens: 72
Registrado em: 16 Nov 2006 14:30


Voltar para NXP (ex-FreeScale (ex-Motorola))

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

x