Atmel, uložení do eeprom při vypnutí
Moderátor: Moderátoři
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.
- elnovy
- Doporučuje se dohled statného moderátora
- Příspěvky: 884
- Registrován: 04 črc 2010, 00:00
- Bydliště: JČ
Re: Atmel, uložení do eeprom při vypnutí
A co takto???
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
- elnovy
- Doporučuje se dohled statného moderátora
- Příspěvky: 884
- Registrován: 04 črc 2010, 00:00
- Bydliště: JČ
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é.
nevím proč se mi nedařilo udělat to s tou proměnnou adresou
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..