60 nap alatt Arduino #30-#31 - IIC busz és az EEPROM

A "60 nap alatt Arduino" tanfolyam házi feladatai és közvetlen témái
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Re: 60 nap alatt Arduino #30-#31 - IIC busz és az EEPROM

Hozzászólás Szerző: Robert »

Mint a magnókazetta.
Amit ráraktál ott marad.
Törlés azt gyakorlatilag felülírást jelent.

Az "ottmarad" az a szokásos körülmények közt >100 év.
De sugárzás, napszél, stb. azért ki tud ütni 1-2 bitet :)
Avatar
csabeszq
Bitfaragó
Hozzászólások: 678
Csatlakozott: 2012. szeptember 5. szerda, 6:00

Re: 60 nap alatt Arduino #30-#31 - IIC busz és az EEPROM

Hozzászólás Szerző: csabeszq »

Viszont módjával szórakozz vele, mert 100.000 felülírást bír ki az EEPROM.

Az alkalmazásod a hőmérsékletet például ne írja bele minden leolvasás után, mert előbb-utóbb megpusztul.
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Re: 60 nap alatt Arduino #30-#31 - IIC busz és az EEPROM

Hozzászólás Szerző: Robert »

A proci EEPROMja a 100.000-es írás. A külső az 1.000.000.
De a külső I2C-s EEPROM-ban 1 lap (page) egyszerre íródik! Azaz ha 1 byte-t változtatsz, akkor is a teljes page (mind a 16/32 vagy 64 byte) újraírásra kerül!
Avatar
SzLacus
Tranzisztorgyógyász
Hozzászólások: 175
Csatlakozott: 2012. május 20. vasárnap, 6:00

Re: 60 nap alatt Arduino #30-#31 - IIC busz és az EEPROM

Hozzászólás Szerző: SzLacus »

Javaslom, hogy ebbe az élettartam dologba egy kicsit menjünk bele. Minden cellának 100.000 írás a garantált élettartama, vagy az eszközhöz fordulhatok garantáltan 100.000 szer, és utána nem garantált a hibátlan működés. Ez nem tűnik nagy különbségnek, de érdemes ezen egy kicsit tornázni. Tegyük fel, hogy egy bájt adatot kell elraknom egy 1k-s belső eepromban. Gondoskodom róla, hogy a mentés helye folyamatosan vándoroljon az eepromban, és hogy meg is találjam a mentett értéket amikor szükségem van rá, miután az új helyére beírtam az adatot, a régi címere 0xFF-et írok. Amikor az élet indul, megkeresem, hol van értelmes adat az eepromban, és örülök az értéknek, amit onnan kiolvasok. Ebben az esetben minden cellát kétszer írok egy körülfordulás alatt, miközben az eszközhöz összesen 512 alkalommal fordulok írással. Tételezzük fel, hogy az eepromban, egy adott helyen elkölönítek két bájtot, ahol minden körülfordulásnál növelem az értéket. Ez lesz az élettartam számláló. Innem tudhatom, hány kanyar futott már, mennyi életem van még a 100.000-ből. Ezek után az eszköz élettartama az hogyan alakul? Az egész kérdés nem kérdés, ha minden alkalommal ugyan oda írok. Élettartam 100.000 és balra a kijárat. Utána ne számítsak rá, hogy stabil az eszközöm. De ha gondoskodom a bitek egyenletes "koptatásáról" akkor kihasználhatom a teljes élettartamot? Szóval mennyi is az annyi?
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Re: 60 nap alatt Arduino #30-#31 - IIC busz és az EEPROM

Hozzászólás Szerző: Robert »

Bocsi hosszú lett...

Pontosítás:
A mikrokontroller (uc) belső eepromja BYTE szervezésű. A külső EEPROMok szervezése _mindig_ PAGE alapú. 1-1 lap mérete a 16 byte ... 512 byte méret közt változik (chipenként azonos mindíg, adatlapból puskázható.)
Azaz ha uC 1. byte-jét érom, akkor a többi véltozatlan marad. Se nem íródik, se nem olvasódik. Az írás folyamata:
1. EEPROM cím megadásra kerül (ún. mutató)
2, EEPROM beírás (adott címre, adott byte-t)
3, 3.3 ms (vagy 5 ms)
4, EEPROM írás kész

Flash memóriába írás
1, hova kell írni (cím megadása)
2, az adott címet _tartalmazó_ teljes PAGE kiolvasása belső SRAM-ba
3, adott módosítandó byte kicserélése a kiolvasott lap SRAM tartalmában
4, teljes SRAM lap visszaírása a régi page helyére
Azaz az 1 page-n levő _összes_ byte a FLASHban újraíródik!



És a kérdésed a belső EEPROM-ra:A szűk keresztmetszet az a címmentés, azaz ahova jegyzed hogy hol jársz. Trükk: tedd ezt SRAM-ba és csak _kikapcsoláskor_ vagy minden 10..50. íráskor mentsd el. Kikapcsolás: tápfesz kezd csökkenni és van még 1-5 sec-d a kikapcsolásig És ekkor fut a vészleállítás projekt...
De minek mented hol jársz? Az utolsó adat _után_ írj FF-t. És bekapcsoláskor scanneld végig a memóriát. Ahol FF van az a köv. szabad cella.
_Cellánként_ van a 100.000 írás, nem az össz. EEPROM celláinak összességére.
Azaz amit a legtöbbször írsz, az kopik a leggyorsabban.
De nem számoltál:
- adathiba a kozmikus sugárzás hatására
- a 0. byte _véletlen_ írási metódusa

Ha kritikus a rendszer, tegyél be FRAM-ot. Az érzéketlen az írásszámra.
És gyors. Igaz 512kbit a max kapacitása....


Külső memória esetén (24LC256) a 60+15 napos tanfolyam elkészült 9.leckéjéből:
"A gyűjtendő adatok mentését is meg kell oldani. Egy ideig - és az első kikapcsolásig - a memóriába is menthetünk. Ha nem vagyunk ennyire bevállalósak, akkor az EEPROM terület is szóba jöhet.
E két megoldásnak nagy hátránya, hogy alig lehet használni, mert kevés adat fér bele...
Itt jön képbe a külső nemfelejtő memória. Az Ext1 áramkörök a 24LC256 jelű chip 256 kbit (azaz 64 kbyte) tárhellyel rendelkeznek: a letárolás a 0. címtől a 32767. címig tart. Az egy lépésben mentendő adat dátum (6 byte), egész + tizedfok (2 byte), megvilágítás (2 byte), feszültség-ADC (2 byte), azaz összesen 12 byte hely egy adatcsomag. A későbbi bővítésre gondolva egy csomag legyen mondjuk 16 byte...

A mentés trükkje: ha már van elmentett adatunk, akkor csak a következő üres helyre lehet a mért adatsort letárolni! Ennek fejbentartása nem olyan egyszerű. A PC-s világban ezt a filerendszert leíró tábla tartalmazza - itt viszont ilyen nincs. Ezért valami mást kell kitalálni.
Az üres chip tartalma: tiszta FF. A bejegyzés első byte-ja biztosan nem FF, mivel az időadatban ilyen érték nincs. A legegyszerűbb megoldás: olyan bejegyzés vagy adatblokk helyet keresünk, ahol az első byte értéke FF. Így elég minden első byte-t megnézni: 0, 16, 32, 48, (n-1)*16, n*16... És nmax = 32768/16!
Így a program indulásakor ezt megkeressük és tudjuk hova kerül a következő írás..."
.
.
.
"16 byte byte-módú beírásakor a teljes blokk minden lépésben újraíródik (azaz 16 írás hajtódik végre és a chip is fokozottabban használódik el).
Ha figyelembe vesszük, hogy az EEPROM cellái 1.000.000 alkalommal írhatóak, akkor:
- 16 írás adatblokkonként,
- minden 32768/16 = 2048. írás esetén kerülök azonos cellára.
Így a chip írási öregedésből való elhasználódása 1.000.000/16 * 2048 = 128 M adatblokk írás. És a jelzőbyte miatt ennek felével számolhatunk (FF értékű cella). Ha 1 sec egy írás és folyamatosan írom, akkor 740 nap alatt megy tönkre a chip (ez kb. 2 év folyamatos üzem). Ha blokkos írásban gondolkodunk, akkor ez 32 évre nő!
"
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Re: 60 nap alatt Arduino #30-#31 - IIC busz és az EEPROM

Hozzászólás Szerző: Robert »

Alapszámolás:

512 byte EEPROM
Körülfordulásszámláló : 2 byte
A 0. byte tiltott.

Az EEPROM egyéb cellák annyiszor íródnak, ahányszor a körülfordulásszámoló - azaz nem kezelem külön.
Egyetlen cella 100.000x írható, ha a chipet határon járatod és statisztikailag vesszük.
A beírható adatmennyiség:
100.000 x 509 = 50.900.000 darab írás.
És ha 1 sec-enként írsz, akkor ez bizony: 589 nap. (nincs napszél. áramszünet)

És a garancia általában 1 év - azaz piacradobhatod :)
Avatar
SzLacus
Tranzisztorgyógyász
Hozzászólások: 175
Csatlakozott: 2012. május 20. vasárnap, 6:00

Re: 60 nap alatt Arduino #30-#31 - IIC busz és az EEPROM

Hozzászólás Szerző: SzLacus »

Kösz, magam is így gondoltam. Gazdálkodni érdemes az eszközzel, ami remek lehetőséget ad a siker élményre.
Robi! A 60+15 Arduino már fut? A +15 érdekel, a 60 egyszer már megvolt. Persze ismerem a Tudás családfáját. Az Ismétlés az aki anyai ágon a közvetlen ős. Vagyis Ő a tudásnak a jó édes anyja. Csak az idő keletkezésének mikéntjét kéne még megismerni, arra szerintem sokan vagyunk kíváncsiak. De amire szánunk arra mindíg jut idő. Most például +15-re jutna. :)
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Re: 60 nap alatt Arduino #30-#31 - IIC busz és az EEPROM

Hozzászólás Szerző: Robert »

A +15 szept elejétől lesz. A 60 napos befejezetteknek megy 1-2 levél majd...
Most fejeztem be a 12 db lecke megírását...


Az idő keletkezése:
Molekuláris rezgés, és a relatív és abszolút idő pedig fizikai és psichológiai kérdés..
Idő: http://www.tavir.hu/cikk-idomeres

Az EEPROM-ok ideje meg az adatlapban kész tényként kezelt....
Avatar
scalesman
Újonc
Újonc
Hozzászólások: 12
Csatlakozott: 2010. augusztus 31. kedd, 6:00

Re: 60 nap alatt Arduino #30-#31 - IIC busz és az EEPROM

Hozzászólás Szerző: scalesman »

Sziasztok !

Most olvasgatom a fórumot és észbe kapok, hogy pont így jártam én is és vagy 2órát eltöltöttem vele és nem boldogultam. Tehát 24LC16B -vel is ugyanaz a helyzet, hogy nem használja az A0,A1,A2 lábait , vagy legalábbis nem a chip egyedi címzésére.A monitor programban úgy ahogy Macsek írta elfoglalja az 50-57 címet. Egyébként írni csak úgy lehet bele, ha WP láb mondjuk levegőben van, OLVASNI viszont csak úgy lehet az előzőleg beírt értéket, hogy a WP lábat pl +5V-ra kell tenni , ha ez nem történik meg , akkor 255öt olvas folyamatosan a beírt érték helyett.
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Re: 60 nap alatt Arduino #30-#31 - IIC busz és az EEPROM

Hozzászólás Szerző: Robert »

http://ww1.microchip.com/downloads/en/D ... 21703d.pdf

"A0, A1, A2
The A0, A1 and A2 pins are not used by the 24XX16.
They may be left floating or tied to either VSS or VCC."
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Re: 60 nap alatt Arduino #30-#31 - IIC busz és az EEPROM

Hozzászólás Szerző: kapu48 »

60 nap alatt Arduino #31 lecke javítása!

Kód: Egész kijelölése

//Amikor globális a változó, de már kikerül eljárásba a négyzetre emelés (2134byte)
/* Fuggveny / eljaras
 Negyzetre emeles
 60 nap alatt arduino tanfolyam
 (c) TavIR http://www.tavir.hu  */
 
int szam = 12;
int eredmeny; 
 
void setup()
{Serial.begin(9600);}
 
void loop(){
  Serial.print(szam);
  Serial.print(" x ");
  Serial.print(szam);
  Serial.print(" = ");
  negyzet();  // Az eljárás meghívása, ne maradjon ki!
  Serial.println(eredmeny);
}
 
void negyzet(){
  eredmeny= szam * szam; 
}
Válasz küldése