Go Down

Topic: [Resolu] EEPROM et union "libre" ... (Read 733 times) previous topic - next topic

ludobabs

Feb 06, 2013, 01:01 pm Last Edit: Feb 06, 2013, 03:35 pm by ludobabs Reason: 1
Bonjour à tous.

Grace à vos nombreux conseils avisés, mon projet avance toujours. Mon objectif était de pouvoir sauvegarder la valeur ( float ) de déclenchement de certaines alarmes dans une EEPROM. Aucun souci pour lire ou écrire un octet, mais comment faire pour sauvegarder des floats - ou autres - La solution de multiplier le float par 10x, récupérer chaque digit et les savegarder les uns apres les autres ne me satisfaisait pas, mais alors pas du tout. Je me suis tourné vers l'utilisation des pointeurs, je suis certain que ce doit être possible de les utiliser dans un cas comme le mien mais je n'ai pas reussi.

Edit : "maintenant ça y est !

Je séchais jusqu'à ce que je découvre - en fouillant vraiment -union. Voiçi le code tel qu'il est au moment ou je laisse ces lignes.

Code: [Select]
void setup() {
 Serial.begin(9600);  
}

void loop() {

 union u_tag {
   byte b[4];
   float valeur;
 }
 u;

 u.valeur = 123.456;

 for (int i = 0; i < sizeof(u.valeur); i++){
   Serial.print(i);
   Serial.print(" ");
   Serial.println(u.b[i], BIN);
 }
 Serial.println("");
 
 // ces valeurs sont celles affichées par le moniteur série
 u.b[0] = 121;
 u.b[1] = 233;
 u.b[2] = 246;
 u.b[3] = 66;  

 Serial.println(u.valeur,3);
 
 delay(1000);
}


C'est formidable. Ca fonctionne, le moniteur serie m'affiche :

Quote
0 1111001
1 11101001
2 11110110
3 1000010

123.456


Je souhaiterai pouvoir "automatiser" ce traitement.

Une de mes nombreuses question est la suivante. Existe t-il en language Arduinesque lune fonction TypeOf ou GetType, une fonction qui me permettrai de connaitre le type d'une variable - int, long, float, objet ou autre - ?

Merci bien à tout ceux qui m'ont deja aidé et un grand merci à la communauté  :)

Un Ardui-Novice





skywodd

Bonjour,

Ta méthode dépend de l'architecture sur laquelle tu travailles. Rien ne te dit qu'un float fait vraiment 4 octets ;)
Si tu veut "voir" un type float, int, ... comme un tableau d'octets il te fait passer par un cast d'adresse.


Une de mes nombreuses question est la suivante. Existe t-il en language Arduinesque lune fonction TypeOf ou GetType, une fonction qui me permettrai de connaitre le type d'une variable - int, long, float, objet ou autre - ?

Arduino = C++, ni plus ni moins, le logiciel Arduino n'est rien d'autre qu'une surcouche par dessus des fonctions C et C++ classique.
En C++ tu peut connaitre le type d'un objet (et uniquement d'un objet = instance de classe) avec la technique RTTI :
http://fr.wikipedia.org/wiki/Run-time_type_information
(include : <typeinfo>, fonction : typeid())
Mais c'est une très mauvaise façon de programmer, encore plus sur un microcontrôleur (je suis même pas sûr que avr-g++ implémente cette fonctionnalité)

Dans ton cas ce que tu cherches à faire c'est :
Code: [Select]
float valeur = 13.37;
byte* ptr = (byte*) &valeur;

Serial.println(ptr[0]);
Serial.println(ptr[1]);
Serial.println(ptr[2]);
Serial.println(ptr[3]);

(le cast d'adresse marche avec n'importe quel type)

Et de manière plus générique :
Code: [Select]
monType valeur = xxxxx;
byte* ptr = (byte*) &valeur;

for (byte i = 0; i < sizeof(valeur); ++i)
  Serial.println(ptr[i]);
Des news, des tutos et plein de bonnes choses sur http://skyduino.wordpress.com !

ludobabs


Quote
Rien ne te dit qu'un float fait vraiment 4 octets


Mince alors, ça ce n'est pas forcément une bonne nouvelle. Mais peu importe puisque je n'ai plus d'union à faire et donc plus besoin de connaitre la taille occupée par la variable que je souhaite sauvegarder.

C'est génial. Merci bien  XD

Du coup voiçi le code modifié. Il fait la "même" chose que le premier que je vous ai soumis, mais en plus simple et en plus "universel"

Code: [Select]
void setup() {
  Serial.begin(9600); 
}

void loop() {

  float test = 123.456;
  byte* ptr = (byte*) &test;

  for (byte i = 0; i < sizeof(test); ++i) {
    Serial.println(ptr[i],BIN);
  }

  ptr[0] = 121;
  ptr[1] = 233;
  ptr[2] = 246;
  ptr[3] = 66;

  Serial.println(test,3);

  delay(10000);

}




le moniteur serie m'affichant :

Quote
1111001
11101001
11110110
1000010
123.456


Un obstacle de "passé", vivement le prochain.....


Go Up