Stránka 2 z 2
Napsal: 01 črc 2010, 12:43
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.
Napsal: 01 črc 2010, 13:10
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...
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.
Napsal: 01 črc 2010, 13:28
od Bernard
Andrea píše:Uložený v nějaké EEPROM, která by měla ukazatel uložený v nějaké EEPROM...
........
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.
Napsal: 01 črc 2010, 13:31
od Andrea
Jo ták, no to je geniální, to mě nenapadlo

Napsal: 03 črc 2010, 10:46
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.
Re: Atmel, uložení do eeprom při vypnutí
Napsal: 05 črc 2010, 11:20
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
A co takto???
Napsal: 07 črc 2010, 15:32
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...
Napsal: 13 črc 2010, 22:02
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

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ý

Napsal: 19 črc 2010, 19:48
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?
Napsal: 19 črc 2010, 20:35
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
Napsal: 20 črc 2010, 15:30
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?
Napsal: 20 črc 2010, 15:52
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é.
Napsal: 20 črc 2010, 15:57
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.
Napsal: 20 črc 2010, 16:46
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..