EEPROM (Electronically Erasable Programmable Read-Only Memory)

EEPROM_I2C
EEPROM is geheugen dat je kunt veranderen, maar dat na uitzetten van de spanning bewaard blijft. Handig om bijvoorbeeld sensorgegevens in op te slaan die je later nodig heb. Ik testte de zeer goedkope AT24C256 Memory module I2C interface. Door de I2C interface heb je maar twee signaaldraden nodig en je kunt meerdere apparaten aansluiten, mits ze een verschillend adres hebben. Dit bordje heeft een opslagcapaciteit van 32 kByte. Ruim voldoende om meetgegevens op te slaan, maar niet voor foto's en dergelijke. Voor het opslaan van grote hoeveelheden data en foto's kun je beter een SD kaartje gebruiken.
Op internet lees je vaak dat je A0, A1, A2 en WP moet aansluiten op GRD. Dat moet je zeker niet doen bij het type van de foto. Je krijgt dan kortsluiting. Door de jumpers een plaats richting bijschrift op te schuiven verbind je A0, A1, A2 of WP met VCC. Je krijgt dan een ander adres of je zet schrijfbeveiliging aan. Zoals de jumpers zijn ingesteld op de foto is het adres 0x50 en staat schrijfbeveiliging uit. Als je de jumper bij A0 richting label verplaatst krijg je adres 0x51, als je de jumper bij zowel A0 als A1 verplaatst krijg je adres 0x53. Dus als je het binaire getal dat als het ware gevormd wordt door de jumpersetting optelt bij 0x50 weet je het adres. Bij de chip die in deze module is gemonteerd werkt A2 overigens niet, zodat je maximaal vier verschillende adressen kunt instellen.
Opmerking: deze module werkt goed, maar is niet erg handig en op de pinnen bij de jumpers staat spanning. Koop liever gewoon een chip in plaats van deze module. Zo'n chip is lekker klein en niet moeilijk aan te sluiten.

Het is lastig om het geheugen te gebruiken. Dit ligt onder andere aan beperkingen (sommigen zeggen foute keuzes) in de benodigde bibliotheek Wire.h. Om het adres van een geheugenplaats in te stellen moet je een integer van 16 bits verzenden. De standaardbibliotheek Wire.h voorziet daar niet in. Dat moet je dus zelf doen, maar dat is niet moeilijk. Ook voor het schrijven van teksten of kommagetallen zijn geen standaardfuncties aanwezig, dus die moet je zelf maken. Het grootste probleem is dat je maar 32 tekens tegelijk kunt versturen. Daarna moet je de transmissie stoppen en opnieuw starten, nadat er 32 bytes geschreven zijn. In de praktijk moet dat al na 28 bytes. Een ander probleem is dat de gebruikte chip beperkingen kent waardoor je deze 32 bytes niet overal direct kunt wegschrijven. Bij het uitlezen van het geheugen heb je dit soort problemen niet. Er zijn veel bibliotheken en voorbeeldprogramm's op internet het schrijven niet goed doen, waardoor soms ongemerkt fouten in de opgeslagen gegevens kunnen optreden. Daarom geef ik hier alleen een langzame, maar betrouwbare methode. Deze methode komt erop neer dat alle gegevens byte voor byte wordt verstuurd. Daarmee wordt het verzenden een stuk langzamer, maar voor veel toepassingen is dat nog altijd snel genoeg!
Ik heb dit getest door het hele geheugen (32 kByte) vol te schrijven. Dat lukt met mijn Arduino Uno in 177 seconden. Alles teruglezen èn controleren gaat in 7 s (zie de schermafdruk rechts). Ik heb hierbij geen enkele lees- of schrijftest gevonden, maar niettemin zou je voor kritische toepassingen alles moeten controleren door de opgeslagen gegevens meteen terug te lezen.
De uitvoer na de eerste en tweede keer
Voor het testprogramma stuurt deze pagina je naar de pagina over de kale chip.

Ga naar pagina met schrijfprogramma voorbeeld

In een ander voorbeeld laat ik zien hoe je een zin kunt wegschrijven en weer terughalen. Nog niet klaar