Sylvain Mahé Le site Web Retour à l'accueil Principes Partager mes idées et mes projets librement et gratuitement. Thématiques Mécatronique du système embarqué, artisanat pluridisciplinaire, bricolage commun, esthétique logicielle et matérielle, minimalisme fonctionnel, conceptualisation alternative, rédaction technique et littéraire, partage pédagogique documenté. Contact ✆ Téléphone : 06.45.49.96.98
✉ E-mail : contact@sylvainmahe.site
✎ Site Web : sylvainmahe.site
Écriture de la page : Sylvain Mahé
Lire et écrire dans la mémoire du microcontrôleur avec la classe Eeprom Sauvegarder les valeurs de certaines variables dans la mémoire interne du microcontrôleur lorsque celui-ci est coupé de son alimentation électrique est essentiel dans de nombreux projets. La mémoire EEPROM du microcontrôleur est dédiée à cette tâche car elle est non volatile et autorise de nombreux cycles de lecture/écriture. Cette mémoire est accessible très simplement à l'aide des fonctions read, write, et erase de la classe Eeprom. Le nombre d'emplacements mémoire disponibles et accessibles via la classe Eeprom correspond à la quantité d'octets de mémoire EEPROM disponibles et dépend donc du microcontrôleur utilisé : Automate programmable MODULABLE 20 :
- EEPROM du microcontrôleur ATmega48P = 256 octets (0.25Kio)
- EEPROM du microcontrôleur ATmega88P = 512 octets (0.5Kio)
- EEPROM du microcontrôleur ATmega168P = 512 octets (0.5Kio)
- EEPROM du microcontrôleur ATmega328P = 1024 octets (1Kio)

Automate programmable MODULABLE 32 :
- EEPROM du microcontrôleur ATmega164P = 512 octets (0.5Kio)
- EEPROM du microcontrôleur ATmega324P = 1024 octets (1Kio)
- EEPROM du microcontrôleur ATmega644P = 2048 octets (2Kio)
- EEPROM du microcontrôleur ATmega1284P = 4096 octets (4Kio)
Par exemple le microcontrôleur ATmega1284P dispose de 4096 emplacements mémoire. Il est essentiel de ce référer à la note ci-dessus afin de ne pas dépasser la mémoire disponible pour un microcontrôleur donné (éviter de vouloir accéder à un emplacement mémoire qui n'existe pas). Lire la mémoire EEPROM : La lecture de la mémoire EEPROM du microcontrôleur ne demande pas beaucoup d'opérations. Exemple de lecture de la mémoire EEPROM du microcontrôleur : #include <Eeprom.h> int main() { unsigned char myData = 0; myData = Eeprom::read (1, 8); return 0; } Dans cet exemple la fonction statique read est appelée prenant en 1er paramètre 1, l'emplacement mémoire demandé (soit la lecture du 1er octet de la mémoire). Puis la fonction prend en 2ème paramètre 8, le nombre de bits à lire. Ce paramètre peut prendre les valeurs possibles 8, 16, et 32 : - 8 : 8 bits de mémoire seront lus sur l'emplacement mémoire 1.
- 16 : 16 bits de mémoire seront lus sur l'emplacement mémoire 1 à 2.
- 32 : 32 bits de mémoire seront lus sur l'emplacement mémoire 1 à 4.
Et également les valeurs -8, -16, et -32 (voir plus bas : "Lecture et interprétation des nombres négatifs") : - -8 : 8 bits de mémoire seront lus sur l'emplacement mémoire 1.
- -16 : 16 bits de mémoire seront lus sur l'emplacement mémoire 1 à 2.
- -32 : 32 bits de mémoire seront lus sur l'emplacement mémoire 1 à 4.
Bien entendu le nombre de bits indiqué en paramètre doit être cohérent avec ce que vous souhaitez lire, de même avec la taille de donnée de destination (myData dans l'exemple), sauf si ces transformations sont nécessaires et trouvent une logique dans le fonctionnement de votre programme. Lecture et interprétation des nombres négatifs : Si vous souhaitez lire en mémoire EEPROM un nombre signé tout en conservant son interprétation correcte, il convient de renseigner le 2ème paramètre de la fonction statique read comme étant négatif. Exemple de lecture d'un nombre négatif de 8 bits dans la mémoire EEPROM du microcontrôleur : #include <Eeprom.h> int main() { signed char myData = 0; myData = Eeprom::read (1, -8); return 0; } Dans cet exemple le 2ème paramètre de la fonction statique read prend la valeur -8, ce qui force le format retourné sur 8 bits signés. Exemple de lecture d'un nombre négatif de 32 bits dans la mémoire EEPROM du microcontrôleur : #include <Eeprom.h> int main() { signed long myData = 0; myData = Eeprom::read (1, -32); return 0; } Ici le 2ème paramètre de la fonction statique read prend la valeur -32, ce qui force le format retourné sur 32 bits signés. Écrire dans la mémoire EEPROM : La fonction d'écriture reprend les mêmes principes que la fonction de lecture, soit un certain nombre d'emplacements disponibles et une certaine taille de donnée. Exemple d'écriture d'un octet dans la mémoire EEPROM du microcontrôleur : #include <Eeprom.h> int main() { Eeprom::write (1, 135, 8); return 0; } La fonction statique write est appelée prenant en 1er paramètre l'emplacement mémoire demandé, en 2ème paramètre la donnée à écrire dans la mémoire EEPROM, et en 3ème paramètre le nombre de bits qui seront écrits dans la mémoire. Ici c'est le nombre 135 qui est écrit dans la mémoire à l'emplacement 1. Ce nombre occupe 8 bits de mémoire, soit 1 octet. Exemple d'écriture de deux octets dans la mémoire EEPROM du microcontrôleur : #include <Eeprom.h> int main() { Eeprom::write (1, 6950, 16); return 0; } Dans l'exemple ci-dessus c'est le nombre 6950 qui est écrit dans la mémoire à partir de l'emplacement 1. Il est indiqué que ce nombre occupe 16 bits de mémoire, soit 2 octets. Il s'étend donc jusqu'à l'emplacement 2 de la mémoire. Exemple d'écriture de quatre octets dans la mémoire EEPROM du microcontrôleur : #include <Eeprom.h> int main() { Eeprom::write (101, -125000, -32); return 0; } Dans cet exemple le nombre -125000 est écrit dans la mémoire à partir de l'emplacement 101. Ce nombre occupe 32 bits de mémoire, soit 4 octets. Il s'étend donc jusqu'à l'emplacement 104 de la mémoire. La fonction statique write n'est pas sujette à la contrainte des nombres négatifs comme l'est la fonction statique read, vous pouvez donc renseigner indifféremment le paramètre LENGTH comme étant positif ou négatif (dans l'exemple ci-dessus 32 ou -32). Effacer la mémoire EEPROM : Pour effacer la totalité de la mémoire EEPROM, autrement dit remettre tous les bits à 0, il suffit d'appeler la fonction statique erase comme le montre l'exemple ci-dessous. Exemple pour effacer la totalité de la mémoire EEPROM : #include <Eeprom.h> int main() { Eeprom::erase(); return 0; } Ci-dessus la fonction statique erase est appelée, ce qui efface toute la mémoire EEPROM du microcontrôleur. À noter que les fonctions d'écriture comme write ou d'effacement comme erase (qui est une écriture de 0) offrent l'avantage d'économiser les cycles d'écriture pour garantir la meilleure durée de vie de la mémoire EEPROM. En effet ces fonctions lisent la mémoire avant d'y écrire, de sorte que l'écriture n'intervient que lorsque nécessaire. Références : Récapitulatif des fonctions de cette classe : static signed long read (const unsigned int ADDRESS, const signed char LENGTH); static void write (const unsigned int ADDRESS, const signed long DATA, const signed char LENGTH); static void erase();