Tartalom:
- Adatok tárolása a belső eeprom-ban, függvények az eeprom íráshoz és olvasáshoz
- Különféle típusú változók tárolása az EEPROM.put() függvénnyel
- Példaprogram a különféle változók tárolásának megismeréséhez
- Struktúrák adatainak tárolása
- String típus tárolási problematika az EEPROM.put() függvény esetén
- Az eeprom adattérképe különféle változók írása után
————————————————————————————–
Amikor először használtam az ATmega chip belső eeprom-ját, nem néztem meg alaposan az eeprom kezelésére rendelkezésre álló könyvtárat. Azt hittem, csak byte-onként lehet írni az eeprom-ba, illetve olvasni onnan. Nehezen boldogultam ez első long változó kiírásával, mert az ugye 4 byte-os, és nem triviális, hogyan kell byte-onként felbontani. Sikerült! Elkezdtem írni egy általános kezelő függvényt, amivel mindenféle típusú változókat lehet használni. Felesleges volt! Egy ennyire gyakran felmerülő problémára már van a világban megoldás, csak szét kell nézni. Persze alaposabban mint én tettem! Szerencsére időben felfedeztem, hogy az EEPROM.write() illetve EEPROM.read() függvényeken kívül van más is van ebben a függvény gyűjteményben. Az EEPROM.put() a leírások szerint bármilyen változót beleír az eeprom-ba egy megadott kezdőcímtől kezdve. Az EEPROM.get() pedig kiolvassa azt egy változóba. Persze a memória változóknak azonos típusúaknak kell lennie olvasáskor a beíráskor használt változó típussal. Mint a cikk végén kiderül, az EEPROM.put() függvénnyel van egy kis baj!
Írtam hát gyorsan egy próba programot, hogy lássam tényleg működik a dolog. Nagyon kényelmes, mert struktúrákat is felismer és helyesen tárol. A stringekkel már vannak problémák. Lehetséges, hogy az én ismeret hiányom miatt szaladtam bele a tapasztalt problémákba, de az is lehet, hogy az EEPROM.put() tényleg rosszul van megírva. Bárhogy is van, a string-el vigyázni kell. Tapasztalataimat kommentek formájában a programba írtam.
Itt a demóprogram forrása! Nem szabad megijedni a forráskód hosszától, a program nagy része a kommentekből és a soros portra írásból áll. Az eeprom kezelése csak néhány sor.
#include <EEPROM.h>
bool xbool; //bool típusú változó.
byte xbyte; //byte típusú változó.
int xint; //int típusú változó.
long xlong; //long típusú változó.
float xfloat; //float típusú változó.
String xszoveg; //egy karakter stringet is definiálunk
String yszoveg; //ezt egy működési hiba vizsgálata miatt csináltam
String zszoveg; //ez is a működési hiba miatt keletkezett
int eeprom_cim; //ebben a változóban vezetjük a mindíg soron következő címet, ahová írni fogunk az epromban (olvasásnál is ezt használjuk)
struct datum_ido{ //definiálunk datum_ido névvel egy struktúrát, ebben fogjuk tárolni a dátumot és idopontot
int ev;
byte ho;
byte nap;
byte ora;
byte perc;
};
datum_ido xdatum_ido; //készítünk egy datum_ido típusú változót xdatum_ido névvel
void setup(){
Serial.begin(9600);
/**********************************************************************************************************
* A következő ciklus törli a teljes eeprom-ot. Az EEPROM.lenght() megadja az eeprom-unk teljes hosszát. *
* Csak akkor futattam, amikor már alaposan teleforkáltam az eeprom-ot, és tiszta lappal akartam indulni *
**********************************************************************************************************/
// for (unsigned int i = 0 ; i < EEPROM.length() ; i++ )
// EEPROM.write(i, 0);
// Serial.print("EEPROM törölve, mérete:");Serial.println(EEPROM.length());
/********************************************************************************************************************************
* Ebben a programrészben különféle változó típusokat írunk ki az epromba. "eecim" változó mindíg az aktuális címet tartalmazza *
* ahonnan kezdve írjuk a változót. Azt, hogy hány byte-ot foglalunk el a változó kiírásával, az nekünk kell kiszámolni. *
* Ha visszaolvassuk a memória változó tartalmát az eeprom-ból, akkor ki kell számolni a váltzó címét, ahonnan kezdve kiírtuk. *
* Ha íráskor rosszul számoljuk ki a következő szabad eeprom terület kezdőcímét, akkor egymásra írhatjuk a változó tartalmakat, *
* és visszaolvasáskor marhaságokat kaphatunk. *
* Ha egyszer lefuttatuk ezt a programrészt, akkor ki lehet kommentezni a programból, mert a tárolt értékeket már lehet *
* visszaolvasni tetszőleges számban, és ekkor biztosak lehtünk a program működésében. *
********************************************************************************************************************************/
Serial.println("***************** Irunk az eeprom-ba: ");
xbool = 1;
EEPROM.put( eeprom_cim, xbool);
Serial.print("Bool: ");
Serial.print( xbool, BIN); //xbool kiírása ellenőrzéshez
Serial.print(" Merete:");
Serial.println(sizeof(bool));
xbyte = 66;
eeprom_cim=eeprom_cim+1; //a bool 1byte-ot foglal, tehát 1 byte-al kell növelni a következő eeprom címet
EEPROM.put( eeprom_cim, xbyte);
Serial.print("Byte: ");
Serial.print( xbyte); //xbyte kiírása ellenőrzéshez
Serial.print(" Merete:");
Serial.println(sizeof(byte));
xint = 29567;
eeprom_cim=eeprom_cim+1; //a byte 1 byte-ot foglal, tehát 1 byte-al kell növelni a következő eeprom címet
EEPROM.put( eeprom_cim, xint);
Serial.print("Int: ");
Serial.print( xint); //xint kiírása ellenőrzéshez
Serial.print(" Merete:");
Serial.println(sizeof(int));
xlong = 234567;
eeprom_cim=eeprom_cim+2; //az int 2 byte-ot foglal, tehát 2 byte-al kell növelni a következő eeprom címet
EEPROM.put( eeprom_cim, xlong);
Serial.print("Long:");
Serial.print( xlong); //xlong kiírása ellenőrzéshez
Serial.print(" Merete:");
Serial.println(sizeof(long));
xfloat = 1.2334567;
eeprom_cim=eeprom_cim+4; //az long 4 byte-ot foglal, tehát 4 byte-al kell növelni a következő eeprom címet
EEPROM.put( eeprom_cim, xfloat);
Serial.print("Float: ");
Serial.print( xfloat,7); //xfloat kiírása ellenőrzéshez 7 tizedesjegy hoszan
Serial.print(" Merete:");
Serial.println(sizeof(float));
xdatum_ido.ev=2010;
xdatum_ido.ho=8;
xdatum_ido.nap=11;
xdatum_ido.ora=6;
xdatum_ido.perc=1;
eeprom_cim=eeprom_cim+4; //az float 4 byte-ot foglal, tehát 4 byte-al kell növelni a következő eeprom címet
Serial.print("Datum1:");
EEPROM.put( eeprom_cim, xdatum_ido);
Serial.print(xdatum_ido.ev);Serial.print(".");
Serial.print(xdatum_ido.ho);Serial.print(".");
Serial.print(xdatum_ido.nap);Serial.print(" ");
Serial.print(xdatum_ido.ora);Serial.print(":");
Serial.print(xdatum_ido.perc);
Serial.print(" Merete:");
Serial.println(sizeof(datum_ido));
// Azért csináltam egy második tartalom kiírást, mert a string változónál tapasztalt hibajelenség miatt, szerettem volna megtudni,
// hogy struktúra esetén is keletkezhetnek hasonló hibák. Itt nincs hiba, tehát a string változó hossza zavarja meg a működést.
xdatum_ido.ev=2020;
xdatum_ido.ho=9;
xdatum_ido.nap=18;
xdatum_ido.ora=7;
xdatum_ido.perc=11;
eeprom_cim=eeprom_cim+6; //az datum_ido 6 byte-ot foglal, tehát 6 byte-al kell növelni a következő eeprom címet
Serial.print("Datum2:");
EEPROM.put( eeprom_cim, xdatum_ido);
Serial.print(xdatum_ido.ev);Serial.print(".");
Serial.print(xdatum_ido.ho);Serial.print(".");
Serial.print(xdatum_ido.nap);Serial.print(" ");
Serial.print(xdatum_ido.ora);Serial.print(":");
Serial.print(xdatum_ido.perc);
Serial.print(" Merete:");
Serial.println(sizeof(datum_ido));
xszoveg="Ez egy szoveg!"; //ha a kovetkező eeprom írásnál nem yszoveg változót használom, akkor nem ezt a tartalmat írja az eeprom-be
eeprom_cim=eeprom_cim+6;
Serial.print("String1:");
Serial.print(xszoveg);
EEPROM.put(eeprom_cim,xszoveg );
Serial.print(" Merete:");
Serial.println(xszoveg.length()); //itt már nem használhatom sizeof() függvényt, mert a string hossza változik
// Ezen a ponton érdekes dolog történt. Ha xszoveg változónak az xszoveg változót használom de új tartalaommal
// feltöltve, akkor az előző kiírásban megadott "Ez egy szoveg!" helyett a mostani "Ez egy masik szöveg!" tartalmat
// írja bele az eepromba (mégaz előző kiírásról van szó), de csonkítva az ottani szöveg hosszával. Pedig azon a
// programsoron már túl is vagyunk a végrehajtásban.
// Sőt, ha csinálok egy zszoveg változót, és annak is adok értéket, akkor már jó a tartalom
// de levágja az első két karaktert a szövegből. Nyilván az EEPROM.put() belső működéséből fakad a hibejelenség
// Megoldás, hogy külön szöveges változót kell deklarálni a szövegek kiírásához.
//zszoveg="Ez egy szoveg!"; //ennek csa akkor van szerepel, ha xszoveg változóra írom következő sorokban az yszoveg változót
yszoveg="Ez egy masik szoveg!"; //nem használhatom az xszoveg változót, mert rossz tartalmat ír az előző szöveg tárolásban (String1).
eeprom_cim=eeprom_cim+16; //a string1 változó 16 byte-ot foglal, tehát 16 byte-al kell növelni a következő eeprom címet
Serial.print("String2:");
Serial.print(yszoveg);
EEPROM.put(eeprom_cim,yszoveg );
Serial.print(" Merete:");
Serial.println(yszoveg.length()); //itt már nem használhatom sizeof() függvényt, mert a string hossza változik
/************************************************************************************************************************
* E a programrész visszaolvassa az előzőkaben letárolt változók értékét. Itt is figyelni kell az egyes változók kezdő *
* címeinek helyes kiszámolására. Érdemes kipróbálni, mi történik, ha valahol rossz címet írunk be. pL a dárum típusnál *
* az előző olvasási címhez ne 4-et, hanem 3-at adjunk hozzá *
************************************************************************************************************************/
//töröljük a változó értékekekt, hogy lássuk, tényleg működik a visszaolvasás
//az xszoveg yszoveg változókkal kapcsolatos hibajelenség itt már nem jelentkezik
//helyesen fogja visszaolvasni a szövegeket az xszoveg változóba. Láthatóan csak az íráskor van gond
xbool = 0;
xbyte = 0;
xint = 0;
xlong = 0;
xfloat = 0;
xdatum_ido.ev = 0; //feltöltjük értékekkel az xdatum nevű változót, ami datum típusú
xdatum_ido.ho=0;
xdatum_ido.nap=0;
//xszoveg=""; //Ha ezt az értékadást használom, akkor lecsípi a szöveg első karakterét az első szöveg kiolvasásáakor
//Ha az íráskor xszoveg változót használom, akkor a második szöveg kiolvasás első karakterét csípi le.
//Mindamelett a második esetben még az első szöveg is rossz tartalommal kerül az eeprom-ba.
//Ezek a hibajelenségek csak akkor keletkeznek, ha az eeprom írással foglalkozó programrész működik
//ha kikommentezem azt a részt, akkor már nem okoz problémát ez az értékedás. Az EEPROM.put() csinál
//valamit a memóriában, ami megzavarja a működést.
eeprom_cim=0; //eeprom kezdőcím ujra 0
Serial.println("***************** Olvasunk az eeprom-bol:");
Serial.print("Bool:");
EEPROM.get( eeprom_cim, xbool );
Serial.println( xbool, BIN );
eeprom_cim=eeprom_cim+1;
Serial.print("Byte:");
EEPROM.get( eeprom_cim, xbyte );
Serial.println( xbyte); //
eeprom_cim=eeprom_cim+1;
Serial.print("Int:");
EEPROM.get( eeprom_cim, xint );
Serial.println( xint); //
eeprom_cim=eeprom_cim+2;
Serial.print("Long:");
EEPROM.get( eeprom_cim, xlong );
Serial.println( xlong); //
eeprom_cim=eeprom_cim+4;
Serial.print("Float:");
EEPROM.get( eeprom_cim, xfloat );
Serial.println( xfloat,7); //
eeprom_cim=eeprom_cim+4;
Serial.print("Datum1:");
EEPROM.get(eeprom_cim, xdatum_ido );
Serial.print(xdatum_ido.ev);Serial.print(".");
Serial.print(xdatum_ido.ho);Serial.print(".");
Serial.print(xdatum_ido.nap);Serial.print(" ");
Serial.print(xdatum_ido.ora);Serial.print(":");
Serial.println(xdatum_ido.perc);
eeprom_cim=eeprom_cim+6;
Serial.print("Datum2:");
EEPROM.get(eeprom_cim, xdatum_ido );
Serial.print(xdatum_ido.ev);Serial.print(".");
Serial.print(xdatum_ido.ho);Serial.print(".");
Serial.print(xdatum_ido.nap);Serial.print(" ");
Serial.print(xdatum_ido.ora);Serial.print(":");
Serial.println(xdatum_ido.perc);
eeprom_cim=eeprom_cim+6;
Serial.print("String1:");
EEPROM.get(eeprom_cim,yszoveg );
Serial.println(yszoveg); //
eeprom_cim=eeprom_cim+16;
Serial.print("String2:");
EEPROM.get(eeprom_cim,yszoveg );
Serial.println(yszoveg); //
}
void loop(){ /* ez most üres */ }Kíváncsi voltam, hogy miképpen tárolja az adatokat az EEPROM.put() függvény. Írtam ezért egy programot, ami néhány változót tárol az EEPROM-ban. Előtte természetesen töröltem a teljes tartalmat.
#include <EEPROM.h> //eeprom kezelő programkönyvtár
//változók az íráshoz
String v_string1="abcdefg";
String v_string2="AAAAAAAAAAAAAAAAAAAAaábcdeéfg";
byte v_byte=111;
int v_int=513;
//változók a kiolvasáshoz
String vo_string1;
String vo_string2;
byte vo_byte;
int vo_int;
void setup() {
Serial.begin(9600);
//törlöm az eeprom teljes tartalmát
for (int i=0;i<1024;i++) {
EEPROM.write(i,0);
}
//kiolvasom az eeprom teljes tartalmát
for (byte i=0;i<32;i++) {
for (byte j=0;j<32;j++) {
Serial.print(EEPROM.read(i*32+j));
Serial.print(",");
}
Serial.println();
}
Serial.println("Törlés kész!");
//beírom a változókat az eepromba
EEPROM.put(0,v_byte);
EEPROM.put(32,v_int);
EEPROM.put(64,v_string1);
EEPROM.put(96,v_string2);
Serial.println("Írás kész!");
//kiolvasom az eeprom teljes tartalmát
for (byte i=0;i<32;i++) {
for (byte j=0;j<32;j++) {
Serial.print(EEPROM.read(i*32+j));
Serial.print(",");
}
Serial.println();
}
//visszaolvasom és kiírom a változók tartalmát
EEPROM.get(0,vo_byte);
EEPROM.get(32,vo_int);
EEPROM.get(64,vo_string1);
EEPROM.get(96,vo_string2);
Serial.println(vo_byte);
Serial.println(vo_int);
Serial.println(vo_string1);
Serial.println(vo_string2);
}
void loop() {
}Az eredmény teljes meglepetés! A byte és int típusú változót megtaláltam, ott van ahol lennie kell. Azonban egyáltalán nem derült ki számomra, hogyan is tárolja a stringeket az EEPROM.put() függvény. Jól látható, hogy a string tartalma nem került bele az eeprom-ba. Hogy hol is lehet, azt nem tudom. Esetleg a program flash-be tárolja konstansként?
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, Törlés kész! Írás kész! 111,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 158,2,7,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 168,2,31,0,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 111 513 abcdefg AAAAAAAAAAAAAAAAAAAAaábcdeéfg
Kicsit módosítottam a programon, és a v_string2 változót futásidőben hozom létre:
#include <EEPROM.h> //eeprom kezelő programkönyvtár
//változók az íráshoz
String v_string1="abcdefg";
String v_string2;
byte v_byte=111;
int v_int=513;
//változók a kiolvasáshoz
String vo_string1;
String vo_string2;
byte vo_byte;
int vo_int;
void setup() {
Serial.begin(9600);
//csinálok egy stringet programfutás közben
for (int i=0;i<100;i++) {
v_string2=v_string2+"A";
}
Serial.println(v_string2);
//törlöm az eeprom teljes tartalmát
for (int i=0;i<1024;i++) {
EEPROM.write(i,0);
}
//kiolvasom az eeprom teljes tartalmát
for (byte i=0;i<32;i++) {
for (byte j=0;j<32;j++) {
Serial.print(EEPROM.read(i*32+j));
Serial.print(",");
}
Serial.println();
}
Serial.println("Törlés kész!");
//beírom a változókat az eepromba
EEPROM.put(0,v_byte);
EEPROM.put(32,v_int);
EEPROM.put(64,v_string1);
EEPROM.put(96,v_string2);
Serial.println("Írás kész!");
//kiolvasom az eeprom teljes tartalmát
for (byte i=0;i<32;i++) {
for (byte j=0;j<32;j++) {
Serial.print(EEPROM.read(i*32+j));
Serial.print(",");
}
Serial.println();
}
//visszaolvasom és kiírom a változók tartalmát
EEPROM.get(0,vo_byte);
EEPROM.get(32,vo_int);
EEPROM.get(64,vo_string1);
EEPROM.get(96,vo_string2);
Serial.println(vo_byte);
Serial.println(vo_int);
Serial.println(vo_string1);
Serial.println(vo_string2);
}
void loop() {
}Futási eredmény:
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, Törlés kész! Írás kész! 111,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 128,2,7,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 120,3,100,0,100,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 111 513 abcdefg AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
Tehát a futásidőben létrehozott stringnek sincs nyoma. 100db A betű nem tűnhet el nyomtalanul? Most kikommenteztem az eeprom írását végző programrészeket, és csak kiolvastam az eeprom tartalmát. Az új program:
#include <EEPROM.h> //eeprom kezelő programkönyvtár
//változók a kiolvasáshoz
String vo_string1;
String vo_string2;
byte vo_byte;
int vo_int;
void setup() {
Serial.begin(9600);
//kiolvasom az eeprom teljes tartalmát
for (byte i=0;i<32;i++) {
for (byte j=0;j<32;j++) {
Serial.print(EEPROM.read(i*32+j));
Serial.print(",");
}
Serial.println();
}
//visszaolvasom és kiírom a változók tartalmát
EEPROM.get(0,vo_byte);
EEPROM.get(32,vo_int);
EEPROM.get(64,vo_string1);
EEPROM.get(96,vo_string2);
Serial.println(vo_byte);
Serial.println(vo_int);
Serial.println(vo_string1);
Serial.println(vo_string2);
}
void loop() {
}Rátöltés után az első futtatáskor még megtaláltam az A betűket. Azonban ekkor áramtalanítottam az Arduino-t, hátha ram-ban vannak az A betűim. Jó tipp volt áramtalanítás után a futási eredmény:
111,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
128,2,7,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
120,3,100,0,100,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
111
513
⸮⸮⸮k⸮
*⸮U⸮ߏ⸮⸮}A\⸮⸮⸮#⸮⸮⸮⸮3⸮?ݵ⸮zf⸮⸮ߟޯ⸮;Vs~,1O⸮ֵ⸮⸮w⸮⸮k⸮ݷ⸮_⸮⸮⸮⸮⸮⸮⸮ݎQ}/~q⸮⸮v⸮N⸮⸮Z⸮⸮v⸮⸮m⸮⸮⸮⸮⸮⸮{.⸮:{
Tehát kedves sorstársaim. eeprom-ba ne tároljatok stringet az EEPROM.put() függvénnyel, mert nem tárolódik! A struktúrákat már ki sem próbáltam, mert ettől a pillanattól kezdve nem bízok ebben a függvény gyűjteményben. Kétségtelen azonban, hogy kommersz int és long változókra használható!