Mise en mémoire d'étalonnage hors tension

Bonjour,
j'aimerais savoir si il existe la possibilité de garder en mémoire une ou deux valeur d'étalonnage (eprom?) après une mise hors tension de l'arduino. par exemple un integer de 0 à 1023. Si oui combien au maxi.
merci.

Rigolo:
Bonjour,
j'aimerais savoir si il existe la possibilité de garder en mémoire une ou deux valeur d'étalonnage (eprom?) après une mise hors tension de l'arduino. par exemple un integer de 0 à 1023. Si oui combien au maxi.
merci.

bonjour
sur un uno il y a 1024 bytes d'eeprom dispo
un int tient sur 2 bytes

Ben oui et en plus tu as donné la réponse à ta question .
Combien au maxi ?
Sans connaître le modèle de micro-controleur c'est difficile de répondre : il existe des bouteilles d'un demi litre, d'un litre, de 2 l, de 5l, de 10l etc
Pour les micros c'est pareil. Tu vas sur le site Arduino rubrique produit et en cliquant sur le modèle de ta carte tu auras tout les renseignements.
Tu vois c'est pas difficile de trouver de l'information.

Excusez moi je suis un peu neuneu :D. merci

Rigolo:
Excusez moi je suis un peu neuneu :D. Donc seulement 2 octets pour un arduino uno?
c'est pas beaucoup. Et comment on y accede?

heu , t'a pas tout du bien comprendre de ma reponse :grin:

sur uno il y a 1024 bytes d'eeprom dispo

une valeur comme 1024 ça tient sur un INT , un INT occupe 2 bytes
tu peux disposer de 512 INT en 'eeprom sur UNO

merci! :wink:

Rigolo:
Excusez moi je suis un peu neuneu :D. merci

Excuse moi si je complique le débat mais c'est pour la bonne cause. :grin:
C'est vrai qu'il y a 1204 octets disponibles (octet = byte en français ) mais on ne peut stoker au maximum que 512 valeurs que ce soit des octets où des int (un "int" occupe deux octets).

Je n'ai pas compris la raison. Ce n'est pas une limitation de la classe EEPROM construite par Wiring/Arduino .
C'est déjà comme cela dans les fonctions de l'avr-libc.
J'avais trouvé une fois les sources des fonctions de l'avr-libc, je ne les retrouve plus. De toute façon je n'y avais strictement rien compris.

68tjs:
...
Excuse moi si je complique le débat mais c'est pour la bonne cause. :grin:
C'est vrai qu'il y a 1204 octets disponibles (octet = byte en français ) mais on ne peut stoker au maximum que 512 valeurs que ce soit des octets où des int (un "int" occupe deux octets).

bonsoir 68tjs
Tiens je ne connaissais pas cette "singularité" ! :grin:
c'est à avoir dans un coin de sa tete le cas echéant "devant le probleme" 8)

Salut les gars,

J'ai jamais tenté de remplir toute une EEPROM mais c'est la première fois que j'entends parler de cette limite. Comment se traduit elle ? Blocage si adresse > 512 ?

J'ai parlé de mémoire, je viens de revenir aux sources --> toujours la fameuse datasheet

C'est le registre d'adresse qui est limité à 512
voir pj (pour le 328p)

T'as pas la bonne datasheet visiblement => http://www.atmel.com/images/atmel-8271-8-bit-avr-microcontroller-atmega48a-48pa-88a-88pa-168a-168pa-328-328p_datasheet.pdf

Page 21 => 10 bits pour le 328p

Exact. ]:smiley:

C'est la version que j'avais téléchargé qu'en j'avais commandé une UNO.
Emmer**nt maximum c'était la révision D et la partie concernant l'EEPROM a été corrigée dans la version juste après : la version E.

Donc je n'ai rien écrit, vous n'avez rien lu, et moi je me plonge dans les erratas.

si on ne peut adresser que 512 octets on ne peut ecrire que 256 INT ?

Non erreur de ma part je m'étais fié à une version de la datasheet qui malheureusement avait été "mal mise à jour" par Atmel.

Batto à raison : sur la version corrigée de la datasheet il y a bien 10 bits pour les adresses : soit 1024 adresses.

Donc on revient au début : capacité de stockage 1024 "octets" ou 512 "integer" parce que dans l'avr-libc les "integer" sont codés sur 2 octets.

B@tto:
J'ai jamais tenté de remplir toute une EEPROM mais c'est la première fois que j'entends parler de cette limite. Comment se traduit elle ? Blocage si adresse > 512 ?

j'ai jeté un coup d'oeil aux librairie, il n'y a pas de verification du seuil limite.
EEPROM.write(4096, 55); compile et s'execute sans soucis (adresse sur 12 bits) sur UNO.
l'adressage des registres du datasheet laisse supposer qu'on masque les bits de poids forts inutilisé. ca revient donc a faire, sur UNO, 1K, 10 bits:
EEPROM.write(0, 55);

essaie:

#include <EEPROM.h>

int addr = 0;
byte val = 0;

void setup()
{
Serial.begin(9600);
}

void loop()
{
  Serial.println("0, 1, 2 :");
  val = EEPROM.read(0);
  Serial.println(val);
  val = EEPROM.read(1);
  Serial.println(val);
  val = EEPROM.read(2);
  Serial.println(val);

  Serial.println("4096 et 4097 :");
  val = EEPROM.read(4096);
  Serial.println(val);
  val = EEPROM.read(4097);
  Serial.println(val);
  val = EEPROM.read(4098);
  Serial.println(val);

  Serial.println("suspens...");
  delay(500); 

  EEPROM.write(4096, 55);
  EEPROM.write(4097, 56);
  EEPROM.write(2, 57);

  Serial.println("0, 1, 2 :");
  val = EEPROM.read(0);
  Serial.println(val);
  val = EEPROM.read(1);
  Serial.println(val);
  val = EEPROM.read(2);
  Serial.println(val);

  Serial.println("4096 et 4097 :");
  val = EEPROM.read(4096);
  Serial.println(val);
  val = EEPROM.read(4097);
  Serial.println(val);
  val = EEPROM.read(4098);
  Serial.println(val);

  while(true) {}
  
}

Bonjour,

Pour la solution à la question-réponse -> EEPROM, ça c'est clair.

Par contre je tiens à ajouter mon grain de sel :grin:
Calibration = données sensibles = données dont il FAUT s'assurer de l'intégrité.

Donc oui, on peux stocker juste les valeurs mais ça ne suffit pas. Il faut aussi prévoir quelque par une checksum pour s'assurer que les valeurs sont utilisables (ou tout simplement que l'eeprom contient les valeurs en question). Et dans le cas où la valeur n'est pas disponible (eeprom corrompu, eeprom effacé, etc.) il faut prévoir des valeurs par défauts en dure dans le code.

Un moyen simple de stocker un duo : donnée(s) de calibration(s) + checksum est d'utiliser cette lib : Arduino Playground - EEPROMWriteAnything avec une structure pour mettre en forme les différentes valeurs.
Pour la checksum, ça peux se résumer à un XOR de toutes les valeurs de calibration par exemple.

Exemple de structure :

typedef struct {
  int mavaleur;
  int checksum;
} Calibration_t;

effectivement, un checksum peut être utile, je n'avait pas pensé à cet aspect. Comme quoi, il y a toujours des remarques utile sur un forum. J'envisageais de garder 2 valeurs haut-bas pour un resevoir d'eau ou de gas oil fournis par le potentiometre du reservoir.