Dúvidas com float e memória

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Dúvidas com float e memória

Mensagempor David Henrique » 02 Set 2008 14:05

Como eu faço para gravar um dado do tipo float em uma memória i2c. Na verdade, meu problema é como quebrar um float de 32bits em bytes para gravar na memória...

Grato
David Henrique
Nibble
 
Mensagens: 68
Registrado em: 17 Jun 2008 08:05

Re: Dúvidas com float e memória

Mensagempor Jorge_Francisco » 02 Set 2008 14:24

David Henrique escreveu:Como eu faço para gravar um dado do tipo float em uma memória i2c. Na verdade, meu problema é como quebrar um float de 32bits em bytes para gravar na memória...

Grato


Union?
Avatar do usuário
Jorge_Francisco
Dword
 
Mensagens: 1009
Registrado em: 12 Out 2006 09:53
Localização: Rio de Janeiro

Mensagempor David Henrique » 02 Set 2008 14:30

MAS COMO EU FARIA USANDO UNION?
David Henrique
Nibble
 
Mensagens: 68
Registrado em: 17 Jun 2008 08:05

Re: Dúvidas com float e memória

Mensagempor amboni » 02 Set 2008 16:03

David Henrique escreveu:Como eu faço para gravar um dado do tipo float em uma memória i2c. Na verdade, meu problema é como quebrar um float de 32bits em bytes para gravar na memória...

Grato



da uma olhada e vê se é isso....


http://asm51.eng.br/phpBB/viewtopic.php ... ght=make32


amboni
amboni
Nibble
 
Mensagens: 50
Registrado em: 23 Abr 2008 08:26
Localização: Içara - SC

Mensagempor ze » 02 Set 2008 16:05

Código: Selecionar todos
union {
    float f;
    unsigned char c[4];
   } fc;

pra guardar fc.f na eeprom guardar fc.c[3],fc.c[2],fc.c[1],fc.c[0]
char e float não se dão muito bem. pode ser que esteja certo ou errado ou talvez sim ou não funcione ou os dois.
Agora só com os gurus de verdade...
abs...
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Mensagempor msamsoniuk » 03 Set 2008 01:21

hmm... pq guardar na ordem inversa ?
Avatar do usuário
msamsoniuk
Dword
 
Mensagens: 2935
Registrado em: 13 Out 2006 18:04

Mensagempor Maurício » 03 Set 2008 03:10

Salve, David.

Por ponteiros tb dá.
Experimente este código. Ele separa o tipo float em 4 bytes.

Código: Selecionar todos
void salva_E2PROM ( unsigned char dado )
{
   
}

void main ( void )
{
   unsigned char contador = 0;
   float num_flut = 3.141516
   
   void *ptr_void;
   char *ptr_char;
   
   ptr_void = ( void * ) &num_flut;
   ptr_char = ( char * ) ptr_void;
   
   for ( contador = 0; contador < 4; contador++ )
   {
      salva_E2PROM ( * ( ptr_char + contador ) );
   }
}


[]'s
Editado pela última vez por Maurício em 03 Set 2008 13:53, em um total de 1 vez.
"Não leve a vida tão à sério, afinal, nenhum de nós sairá vivo, dela!"
Avatar do usuário
Maurício
Word
 
Mensagens: 678
Registrado em: 14 Out 2006 17:23
Localização: São Paulo - SP

Mensagempor ze » 03 Set 2008 07:35

Marcelo Samsoniuk escreveu:hmm... pq guardar na ordem inversa ?

hmm... pq guardar na ordem "correta" ?
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Mensagempor msamsoniuk » 03 Set 2008 12:40

nao sei, mas as funcoes genericas write e read trabalham com bytes em ordem normal em qq dispositivo, nao seria logico seguir a mesma ideia ?

eu implementaria uma funcao generica eeprom_write e eeprom_read, da seguinte forma:

Código: Selecionar todos
int eeprom_write(char *p, int size)
{
   int i;

   for(i=0;i<size;i++)
   {
      if(eeprom_write_byte(p[i])==-1)
      {
         break;
      }
   }
   return i;
}

int eeprom_read(char *p, int size)
{
   int i;

   for(i=0;i<size;i++)
   {
      if((p[i]=eeprom_read_byte())==-1)
      {
         break;
      }
   }
   return i;
}


assim conseguiria ler e escrever qq tipo de estrutura de dados. em particular:

Código: Selecionar todos
float f;

eeprom_write((char *)&f,sizeof(f));
eeprom_read((char *)&f,sizeof(f));


eventualmente, no futuro, vc pode definir eeprom_write e eeprom_read como funcoes ativadas a partir de write e read mais genericas, assim mudando apenas o nome do dispositivo na funcao open, write e read passam a operar em qq outro dispositivo:

Código: Selecionar todos
float f;
int i;

i = open("eeprom:",O_RDWR);
write(i,(char *)&f,sizeof(f));
read(i,(char *)&f,sizeof(f));


de acordo com o nome do device, open retorna um descritor e, de acordo com o descritor, write e read usam rotinas diferentes, para o device aberto em open.

se depois vc tiver alem da eeprom uma nvram, eh soh trocar a string do device para "nvram:", o resto do codigo continua igual. com isso vc vai criando codigo em bibliotecas de alto nivel que tornam as aplicacoes mais portaveis e mais isentas de erros, com maior reaproveitamento de codigo para futuros projetos.
Avatar do usuário
msamsoniuk
Dword
 
Mensagens: 2935
Registrado em: 13 Out 2006 18:04


Voltar para PIC

Quem está online

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

cron

x