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ó!