EEPROM


Minden Arduino panel tartalmaz különböző nagyságú beépített EEPROM-ot. Az EEPROM programfutás során képződő adatok, értékek
tárolásához nyújt segítséget. A rajta eltárolt adatok kikapcsolás után is meg őrződnek a memóriában. Az Arduino EEPROM-ja kb. 100000-szer írható.

Az Uno-ba és más Atmega 328-asokban 1024byte az eeprom nagysága, a Megában 4096byte (4kB). A memória címzés 0-1023-ig ill. 0-4095-ig tart.


A kezeléséhez külön könyvtárat hoztak létre, ami alapszinten beépített a fejlesztő környezetbe. A programba #include<EEPROM.h> néven hívható meg. Az alapkönyvtár minimálisan csak két függvényt tartalmaz:

EEPROM.write(cím,adat) – az adott memória címre tudjuk az adat értékét írni. Az adat max nagysága binárisan 255 lehet, 1byte. Ha egy 255-nél nagyobb értéket szeretnénk elmenteni akkor több memória helyet kell felhasználnunk.

EEPROM.read(cím) – beolvassa a beírt cím tartalmát.


Nézzünk rá egy progit:

#include<EEPROM.h>//könyvtár bekérése


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

void loop() {
if(Serial.available()) //a soros port változását figyeli
EEPROM.write(1,Serial.read()); // ha változik azt elmenti az eepromba
Serial.println(EEPROM.read(1)); //eeprom kiíratása
delay(300);
}


A soros port bekérő mezőjébe irt karakter a küldés gombra kattintva eltárolódik az eepromba az 1-es címen. Utána ezt olvassuk ki. A progi a karakter ascII-es kódját tárolja el, ez íródik ki a soros monitorra.

Egy cím 1byte-os tehát 8bit tárolható benne, ez vagy egy karakter vagy egy 8bites bináris szám (max255). Persze legtöbbször ennél nagyobb számokat kellene eltárolni több byte-on, hogy kivitelezhető ez?

A számot fel kell bontani matematikailag 10-es számrendszerbelire, vagy ha sok számot szeretnénk elmenteni akkor 255-ös számrendszert kell kreálnunk.


Mutatok egy tízes számrendszerbeli felbontást: pl.: 567 felbontása

5db 100-as ez megy az 1-es memória címre – EEPROM.write(1,5);

6db 10-es ez megy a 2-es memória címre – EEPROM.write(2,6);

7db 1-es ez megy a 3-as memória címre – EEPROM.write(3,7);


A szám összefűzése pedig csak egy egyszerű szorzás és összeadás:
x = EEPROM.read(1)*100+EEPROM.read(2)*10+EEPROM.read(3);


Nézzük ezt meg progiban:

#include<EEPROM.h>
int x=364, y;


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

void loop() {
EEPROM.write(1,x/100); //100-as bontás
EEPROM.write(2,x%100/10); // a maradék 10-es bontása
EEPROM.write(3,x%100%10); // a 100-as és 10-es osztás maradéka


y = EEPROM.read(1)*100+EEPROM.read(2)*10+EEPROM.read(3);
Serial.println(y);
while(1);
}


A maradék osztásról már volt szó, egy kis emlékeztető:

Mivel a 364 egészként lett eltárolva így osztásnál az eredmény egész részét fogjuk kapni 364/100 = 3 , a maradék eltűnik (64). Erre találták ki a maradékos osztást 364%100 = 64, ez csak a maradékot tárolja el.

Nekünk ez kapóra jön mert ezeket a maradékokat tovább oszthatjuk a 10 kisebb hatványaival.

Ha 255-ös számrendszert kell kreálni az ugyan így fog működik:
szétbontjuk a számot 255ł
+255˛+255ą, az elv ugyan az csak a 255 hatványaival osztunk illetve szorzunk.


Elvileg az Arduino.cc szerint van olyan eeprom könyvtár ami már jóval többet tud ennél a kezdetleges társánál, több órás keresgélés után se leltem rá. Talán másnak sikerül majd :)