Go Down

Topic: (résolu) Stocker un float dans l'EEPROM (Read 852 times) previous topic - next topic

fking

Mar 07, 2013, 09:01 am Last Edit: Mar 08, 2013, 10:25 am by fking Reason: 1
Bonjour,

J'aurais besoin de stocker un float dans l'EEPROM interne, mais je ne vois pas comment faire. La fonction EEPROM.write ne permet que de stocker du byte, et un float est sur 4 bytes.

Il faudrait donc que "j'explose" mon float pour récupérer chacun de ses 4 octets pour pouvoir ensuite les stocker individuellement, et ensuite pouvoir reconstruire le float suite à un EEPROM.read

Mais là, je sèche... Un champion du monde du code pourrait-il me filer un 'tit coup de main, SVP ?

ludobabs

Salut, j'ai rencontré le même problème qui est résolu aujourd'hui ...

http://arduino.cc/forum/index.php/topic,147297.0.html

Bon test.

fking

Merci à toi, moi j'ai trouvé ça :

http://thijs.elenbaas.net/2012/07/extended-eeprom-library-for-arduino/

68tjs

Quote
La fonction EEPROM.write ne permet que de stocker du byte


La curiosité n'est jamais un défaut dans le domaine technique, elle réserve souvent des surprises très agréables.
La première forme de curiosité est de lire le code de la fonction EEprom.write d'origine arduino (librairie EEprom de l'ide) :
Code: [Select]
void EEPROMClass::write(int address, uint8_t value)
{
eeprom_write_byte((unsigned char *) address, value);
}


Deuxièmme expression de la curiosité on voit que le fichier cpp fait l'inclusion suivante :
#include <avr/eeprom.h>
On continue en faisant une recherche google sur avr/eeprom.h et on arrive ici :
http://www.nongnu.org/avr-libc/user-manual/group__avr__eeprom.html

Et là on s'apperçoit qu'Arduino a :
- encapsulé une fonction avr sans rien y modifier. Opération inutile a part éviter aux utilisateurs d'utiliser un pointeur,
- limité les choix possibles au seul octet mais qu'il existe bien d'autres possibilités d'écriture dont celle du float qui n'attend que tu t'en serves.
Code: [Select]

uint8_t eeprom_read_byte (const uint8_t *__p) __ATTR_PURE__
uint16_t eeprom_read_word (const uint16_t *__p) __ATTR_PURE__
uint32_t eeprom_read_dword (const uint32_t *__p) __ATTR_PURE__
float    eeprom_read_float (const float *__p) __ATTR_PURE__
void         eeprom_read_block (void *__dst, const void *__src, size_t __n)
void         eeprom_write_byte (uint8_t *__p, uint8_t __value)
void         eeprom_write_word (uint16_t *__p, uint16_t __value)
void         eeprom_write_dword (uint32_t *__p, uint32_t __value)
void         eeprom_write_float (float *__p, float __value)
void         eeprom_write_block (const void *__src, void *__dst, size_t __n)
void         eeprom_update_byte (uint8_t *__p, uint8_t __value)
void         eeprom_update_word (uint16_t *__p, uint16_t __value)
void         eeprom_update_dword (uint32_t *__p, uint32_t __value)
void         eeprom_update_float (float *__p, float __value)
void         eeprom_update_block (const void *__src, void *__dst, size_t __n)


Et cerise sur le gateau toutes les fonctions sont documentées.

fking

Merci beaucoup !!!
C'est vrai que je n'ai pas cherché plus loin après avoir lu la référence de EEPROM.h
Je ne suis pas assez curieux, donc...

Go Up