Atmel, uložení do eeprom při vypnutí

Diskuze a poradna o programátorech a programování různých obvodů

Moderátor: Moderátoři

Zpráva
Autor
Uživatelský avatar
Bernard
Příspěvky: 3654
Registrován: 27 kvě 2005, 00:00

#16 Příspěvek od Bernard »

Mám dojem, že limit 100 000 zápisů má každý bajt samostatně, pokud je samostatně přepsatelný. Pokud by se zapisovalo třeba 20 B a EEPROM měla 2 KB, trvanlivost vzroste 100x při postupném využívání celé kapacity. Jenom by v rámci těch 20 B muselo být počítadlo zápisů (snad do 65535) a pro celou EEPROM by někde musel být ukazovatel na aktuální banku.
Andrea
Příspěvky: 9340
Registrován: 07 zář 2007, 00:00

#17 Příspěvek od Andrea »

Bernard píše:a pro celou EEPROM by někde musel být ukazovatel na aktuální banku.

Uložený v nějaké EEPROM, která by měla ukazatel uložený v nějaké EEPROM... :D

Lepší je nějaký chytřejší algoritmus nepotřebující zvláštní ukazatel. Například jeden byte v bloku říká, jestli je obsazený. Před zápisem bloku se následující blok nastaví jako prázdný. Po zapnutí se najde první prázdný blok, blok před ním je poslední zapsaný a pokračuje se dál. V případě, že paměť umožňuje oddělené mazání a zápis, tak se životnost zvětší počet_bloků-krát, pokud je zápis kombinovaný s mazáním, tak je to zvětšení poloviční.

Zápis aktivovaný výpadkem napájení musí být spouštěný poklesem napětí před stabilizátorem. Spouštět zápis když už klesá napětí samotnému procesoru je přijít s křížkem po funuse. Procesor (AVR) by měl mít zapnutý BOD, pokud používá vnitřní EEPROM. A samozřejmě by se ten zápis měl spustit vnějším přerušením s největší prioritou.
Uživatelský avatar
Bernard
Příspěvky: 3654
Registrován: 27 kvě 2005, 00:00

#18 Příspěvek od Bernard »

Andrea píše:Uložený v nějaké EEPROM, která by měla ukazatel uložený v nějaké EEPROM... :D
........

Možná to vypadá hloupě, ale ten ukazovatel se po dobu životnosti EEPROM přepíše třeba jen 100x, tak by to snad použitelné bylo.
Andrea
Příspěvky: 9340
Registrován: 07 zář 2007, 00:00

#19 Příspěvek od Andrea »

Jo ták, no to je geniální, to mě nenapadlo :oops:
termit256
Příspěvky: 10029
Registrován: 06 pro 2007, 00:00

#20 Příspěvek od termit256 »

pokud je pristroj napajen ze site, sleduj sitove napeti.
pokud neprijde pulvlna, vygeneruj preruseni a zapis.
pouzivam tenhle system leta a pracuje spolehlive.
Uživatelský avatar
elnovy
Doporučuje se dohled statného moderátora
Příspěvky: 884
Registrován: 04 črc 2010, 00:00
Bydliště:

Re: Atmel, uložení do eeprom při vypnutí

#21 Příspěvek od elnovy »

cely problem se resi drive nez dojde k nahodnemu vypnuti.....ukladam hned po namereni do EERAM ..EXTERNI napriklad 64kb hodnot dokola ve smycce ....po vypadku tam vzdy zustanou posledni data do poctu 64kb .....bude ti to stacit :?: jarda
Uživatelský avatar
peatre
Příspěvky: 39
Registrován: 26 lis 2007, 00:00
Bydliště: Malacky
Kontaktovat uživatele:

A co takto???

#22 Příspěvek od peatre »

Do obvodu pridat superkapacitor alebo malu Li-on bateriu. po pandutí napájania ( treba merat este pred vyhladzovacim kondenzatorom ) bezi CPU na bateriu. Ulozia sa data do EEPROM, CPU sa prevedie do SLEEPU. CPU aj EEPROM ostane stale pod napatim. takze po obnoveni napajania program moze pokracovat tam kde skoncil a pokial tych dat nieje vela ani netreba pouzivat EEPROM. Zaspaty procesir pri dobre navrhnutom zapojeni zere len jednotky uA co superkapacitor alebo Lion clanok utiahne hoooodne dlho...
Bezpečnost pri práci je dúležitejší než práca samotná...
Uživatelský avatar
bigjedla
Příspěvky: 26
Registrován: 01 úno 2009, 00:00

#23 Příspěvek od bigjedla »

To ukládání jsem zkoušel udělat ve smyčce vždy na jinou adresu (při každém spuštění inkrementace adresy a pak už ukládání vždy na tuto adresu každých 10s) ale nefunguje to spolehlivě, někdy dojde ke ztrátě dat. Je možné že se procesor vypne například zrovna v průběhu ukládání dat (teoreticky)??

Nejlepší by tam bylo dát asi malou baterku která by se po uložení odpojila třeba tranzistorem. Jenže ať přemýšlím jak chci nenapadá mě jak zkombinovat 5V ze stabilizátoru a 3,3V z baterie :oops: Oddělovat to diodou je blbost... nenapadá někoho jak jinak vyřešit přepnutí na baterii? Přerušovací vstup už žádný není volný :(
Uživatelský avatar
bigjedla
Příspěvky: 26
Registrován: 01 úno 2009, 00:00

#24 Příspěvek od bigjedla »

kdybych šel cestou zálohovací baterie do DPS... jaká je její předpokládaná životnost? respektive je třeba řešit její dobíjení nebo něco takového?
Uživatelský avatar
elnovy
Doporučuje se dohled statného moderátora
Příspěvky: 884
Registrován: 04 črc 2010, 00:00
Bydliště:

#25 Příspěvek od elnovy »

zalohovani je jedna moznost ale dobijeci obvod je nutny ....dle meho nazoru je vhodne vsechny operace vcetne zalohovani resit tedy i ukladat do EEpromky ta po odpojeni napajeni vse uchovava a po zapnuti pri vhodnem programu vse pokracuje dal.....plus pridat vetsi kapacitor umoznujici dobehnuti operaci po vypadku napajeni by bylo vyhodou ....volny vstup potom snima prave onen okamzity vypadek napajeni
Uživatelský avatar
bigjedla
Příspěvky: 26
Registrován: 01 úno 2009, 00:00

#26 Příspěvek od bigjedla »

myslím to takto... procesor měří napětí napájení, při výpadku se uloží hodnoty do eeprom a procesor se vypne (třeba přes tranzistor odpojí zálohovací baterku), přičemž běh od výpadku napětí do vypnutí zajišťuje tak baterka... otázka je když dám například 80mAh NiMH baterku jestli je nutné řešit její dobíjení. Z baterie by běžel jen procesor po čas uložení všech hodnot. Takže za normálních okolností by ta baterka byla nesmrtelná, ale za jak dlouho se vybije sama od sebe? Nebo jakou asi mají ty baterie životnost?
Andrea
Příspěvky: 9340
Registrován: 07 zář 2007, 00:00

#27 Příspěvek od Andrea »

Je blbost, dávat tam dobíjecí baterku a nedobíjet ji, to je pak lepší tam dát primární článek, ten vydrží klidně 10 let, NiMH se za rok vybije samovybíjením. Druhá věc je, když bude mít zálohovací baterka třeba 3,6V, aby byl procesor schopný na takové napětí běžet a bezpečně zapisovat do EEPROM.
Ale mělo by to jít i bez zálohování. Pokud při cyklickém záznamu každých 10s má každý zapsaný blok dat svůj příznak platnosti, tak za předpokladu, že se tento příznak nastaví (zapíše) až jako poslední, nemůže dojít k poškození záznamu. Buď se příznak stihne nastavit a pak jsou i data zapsaná správně, nebo se nestihne nastavit a pak se tento blok ignoruje a vezme se jako poslední platný předchozí blok, zapsaný před 10s. V nejhorším se tedy ztratí data z posledních 10s, což zase nemusí být tak tragické.
Uživatelský avatar
Burajko
Příspěvky: 1819
Registrován: 21 srp 2009, 00:00

#28 Příspěvek od Burajko »

Staci dat dostatocne velky kondenzator oddeleny diodou od vetvy pred stabilizator (LDO)+ nejaky supervizor ,co generuje power fail + reset.Power fail dat na IRQ a mas vystarane.Treba zratat cas ,kolko bude trvat zapis do eeprom ,alebo zmerat cas od odpojenia napatia powerfail <->reset.
Naposledy upravil(a) Burajko dne 20 črc 2010, 18:48, celkem upraveno 1 x.
Už druhý krát strihám a furt je to krátke
Uživatelský avatar
bigjedla
Příspěvky: 26
Registrován: 01 úno 2009, 00:00

#29 Příspěvek od bigjedla »

andreo používám standardní knihovny eeprom.h myslíš že je to v nich vyřešeno? já se v nich moc nevyznám...

nevím proč se mi nedařilo udělat to s tou proměnnou adresou :( když by se při každém spuštění změnila adresa ukládání a perioda ukládání by byla těch 10s tak by to asi stačilo... životnost by byla dostatečná a baterie by nebyla třeba. Ale tak na 50% se mi stávalo, že po spuštění se mi načetly z paměti samé nulové hodnoty nebo maximální... kdyby to bylo pokaždé tak asi mám zmatek v adresách pro uložení, ale někdy to načetlo správně a jindy ne :(

napsáno jsem to měl takto:

Kód: Vybrat vše

int main()
{
 if (eeprom_read_byte((uint8_t*)E2END)!='A')
   {
    for(int i=0;i<=1023;i++)
       {
       eeprom_write_byte((uint8_t*)i,0);
      }
         eeprom_write_word((uint16_t*)12,611); // konstanta pro výpočty
         eeprom_write_byte((uint8_t*)E2END,'A'); // kontrolní byte na poslední místě v paměti
         }
 adresa_ulozeni=eeprom_read_word((uint16_t*)10);
 prutok=eeprom_read_word((uint16_t*)12);
 stometru = eeprom_read_word((uint16_t*)(adresa_ulozeni+14));

 eeprom_write_word((uint16_t*)(adresa_ulozeni+14),0); // vynulování použité buňky
 
 adresa_ulozeni=adresa_ulozeni+10;
 if(adresa_ulozeni >=990)
     adresa_ulozeni=0;
 eeprom_write_word((uint16_t*)10,adresa_ulozeni);   
}

a pak v každých 10s:

Kód: Vybrat vše

eeprom_write_word((uint16_t*)(adresa_ulozeni+14),stometru);

teoreticky to přece musí fungovat ne? prakticky se mi stávalo že po spuštění se načetla hodnota nula nebo 65535..
Odpovědět

Zpět na „Programování PIC, ATMEL, EEPROM a dalších obvodů“