Étape 3: Logiciel - EEPROM
En collaboration avec le tour de l’EEPROM sur pour être plus difficile que je l’avais prévu. La puce AT24C256 a 256 Kbit de mémoire qui est de 32 Ko.
J’ai utiliser le code dans l' Arduino Playground pour I2C EEPROM incluent 2 façons de travailler avec la mémoire : un octet à un moment ou un une fois la page. L’avoir petit avertissement de mise en garde : l’adresse est une adresse de la page, 6 bits fin enveloppera autour - qui signifie que, en raison de la structure physique de cette puce, écrire l’opération doit être effectuée à l’intérieur d’une seule page, si vous allez sur une seule page l’écriture enveloppera autour du début de cette page. Vous pouvez lire tous les détails et comment le résoudre dans ce post mais j’ai décider de travailler simplement avec un octet à la fois.
Les structures de données que je côtoie dans cette application sont les suivantes
struct Time{ byte hour; byte minute; byte second; };
struct LocationItem { float lat; float lng; Time time; };
flotteur est 4 octets, donc j’ai besoin d’écrire 1 octet à la fois et pour que j’ai écrit la fonction write_float et read_float.
Structure de temps est composé de 3 octets, mais j’ai réussi à pousser dans 2 octets par limiter l’heure d’être seulement 12 heures, au lieu de 24 (étant donné que l’enregistrement peut être effectué pendant environ 2,7 heures il n’y a aucun point dans l’horloge de 24 heures). Les nombres 0-11 exigent 4 bits. Les minutes et les secondes sont des valeurs de 0 à 59 qui exigent 6 bits de chaque ensemble de 4 + 6 + 6 = 16 bits qui correspond exactement à 2 octets. Vous pouvez voir write_timewrite_time et read_time pour la manipulation de bits sérialiser et désérialiser structure de temps à bits et retour.
La seule chose qui reste est de gérer la liste des emplacements enregistrés. Pour que je garde un int (2 octets) à la position 0 de l’EEPROM et qu’int est le nombre d’endroits, nous avons enregistré jusqu’ici. Chaque fois que nous enregistrons un nouvel emplacement nous lisons cette valeur qui nous permettent de calculer l’emplacement pour écrire le nouvel emplacement, puis nous incrémenter le nombre de dossiers et écrire de nouveau à l’emplacement 0. Regardez add_location_item pour le code.