Entrar    Registrar

Salvar Double EEPROM

Fórum sobre plataforma Arduino

Moderadores: aluis-rcastro, guest2003, 51, Renie

  • Autor
    Mensagem

Salvar Double EEPROM

Mensagempor brasilma » 18 Mar 2020 20:18

Olá Colegas,

Qual a melhor forma de salvar e recuperar um double (4 bytes) da EEPROM?

Pensei em convertê-la em 4 bytes (ints) e salvar individualmente!

Qual a melhor forma de converter uma double em ints?

Obrigado!
" A Teoria orienta e a Prática decide" ;-)
Avatar do usuário
brasilma
Dword
 
Mensagens: 3334
Registrado em: 11 Out 2006 15:39
Localização: Planeta Terra

Re: Salvar Double EEPROM

Mensagempor eletroinf » 19 Mar 2020 07:25

O que me vem em mente é fazer uma union com o seu float e um vetor char.
Aí salva e recupera da memória os valores do vetor que também dividem a memória com o float/double.
Veja se este tópico ajuda a esclarecer:
https://stackoverflow.com/questions/870 ... 69#8703069
"De cada um segundo sua capacidade a cada um segundo sua necessidade."
Avatar do usuário
eletroinf
Word
 
Mensagens: 805
Registrado em: 12 Out 2006 14:59
Localização: Santa Maria - RS

Re: Salvar Double EEPROM

Mensagempor cfreund » 19 Mar 2020 08:13

Código: Selecionar todos
    float f;
    char *ptr = (char*)&f;
   
    eeprom_write(addr, ptr, sizeof(float)/sizeof(char));
    ...
    eeprom_read(addr, ptr, sizeof(float)/sizeof(char));
Cláudio F
Avatar do usuário
cfreund
Word
 
Mensagens: 514
Registrado em: 14 Out 2006 14:02
Localização: São Paulo

Re: Salvar Double EEPROM

Mensagempor xultz » 19 Mar 2020 08:48

Eu descobri meio que por acaso como acessar os bytes de uma variável maior, a sintaxe é super esquisita mas depois que você se acostuma fica natural e eu tenho usado o tempo todo.
Código: Selecionar todos
float origem;    // Essa é a variável que pretendo acessar os bytes individuais
unsigned char primeiro, segundo, terceiro, quarto;     // Aqui vou guardar os quatro bytes da variavel float
float destino;   // Depois vou colocar aqui os bytes, e o conteúdo no final será igual ao da variável origem

// Guardo o primeiro byte
primeiro = ( (unsigned char *)&origem )[0];

// Guardo os demais bytes, é só seguir a mesma lógica
segundo = ( (unsigned char *)&origem )[1];
terceiro = ( (unsigned char *)&origem )[2];
quarto = ( (unsigned char *)&origem )[3];

// Agora vou colocar os bytes na variável destino
( (unsigned char *)&destino )[0] = primeiro;
( (unsigned char *)&destino )[1] = segundo;
( (unsigned char *)&destino )[2] = terceiro;
( (unsigned char *)&destino )[3] = quarto;
98% das vezes estou certo, e não estou nem aí pros outros 3%.
Avatar do usuário
xultz
Dword
 
Mensagens: 2938
Registrado em: 13 Out 2006 18:41
Localização: Curitiba

Re: Salvar Double EEPROM

Mensagempor brasilma » 19 Mar 2020 09:12

Muito Obrigado a todos!!!

Vi também uma ideia assim para separar os bytes da Double:

dado[0]=dados & 0xff;
dado[1]=(dados>>8) & 0xff;
dado[2]=(dados>>16) & 0xff;
dado[3]=(dados>>24) & 0xff;

Ele filtra byte a byte com and "shifitando" para a direita!

Vou testar todas!!!

Abraços.
" A Teoria orienta e a Prática decide" ;-)
Avatar do usuário
brasilma
Dword
 
Mensagens: 3334
Registrado em: 11 Out 2006 15:39
Localização: Planeta Terra

Re: Salvar Double EEPROM

Mensagempor brasilma » 21 Mar 2020 12:04

Com pequenas alterações todos procedimentos deram certo, consegui escrever e recuperar o mesmo número Double ou Long (em alguns casos precisei utilizar o Long)!

Acabei encontrando a biblioteca EEPROMex que permite a escrita/leitura direta de qualquer tipo de dado na EEPROM, porem pretendo fazer tudo de forma discreta mesmo!

EEPROMex: https://thijs.elenbaas.net/2012/07/exte ... or-arduino

Abraços e Obrigado novamente e todos!!!
" A Teoria orienta e a Prática decide" ;-)
Avatar do usuário
brasilma
Dword
 
Mensagens: 3334
Registrado em: 11 Out 2006 15:39
Localização: Planeta Terra

Voltar para ARDUINO

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 0 visitantes