![Very Happy :D](./images/smilies/icon_biggrin.gif)
Záznam do EEPROM při vypnutí napájení
Moderátor: Moderátoři
Podle mě neměl napsat NVRAM (to je skutečně obecný pojem), ale konkrétně FRAM (Ferroelectric RAM).
Rychlé, nepotřebují napájení ve vypnutém stavu, snášejí hodně cyklů.
Jsou i CMOS SRAM s interní baterkou, ale tam jeden nikdy neví, kdy baterka skončí. Už jsem "pár" takových řešil...
Rychlé, nepotřebují napájení ve vypnutém stavu, snášejí hodně cyklů.
Jsou i CMOS SRAM s interní baterkou, ale tam jeden nikdy neví, kdy baterka skončí. Už jsem "pár" takových řešil...
Kdo chce, hledá způsob;
kdo ne - hledá důvod.
Ze dvou možností často volím tu třetí.
kdo ne - hledá důvod.
Ze dvou možností často volím tu třetí.
A to by se dalo jít ještě níž a pro danou aplikaci použit potenciometr a A/D, kde je taky vidět co je nastaveno, na nějakých 5% rozlišení i od oka se dostaneme taky, zabere to jediný pin, životnost taky slušná.Celeron píše:ten tlačítkovej blázinec, u kterýho není zřejmý co je vlastně nastavenýho, s pochybným ukládáním na EEprom jsem opustil
...
Maká to podle přepínače BCD, hned je vidět co je nastavený a žádný blbnutí s EEPROM.
...
Maká, není co dál řešit.
A nakonec svatokrádežně vůbec návrat k selskýmu rozumu a pwm-ovat s astabilem se změnou střídy s 2 tranzistorama.
Předkové by vrazili rovnou do tělesa pájky bimetálek a šmidra vydra.
Ale to na začátku bylo, akorát kvalita plochýho poťáku, (viz jiné vlákno zde) co jsem si objednal od radši nejmenovaného dodavatele byla otřesná, chrastil už novej a měl jsem obavu že se během chvíle rozpadne. A druhej kus byl na tom némlich stejně.Crifodo píše: A to by se dalo jít ještě níž a pro danou aplikaci použit potenciometr a A/D, kde je taky vidět co je nastaveno
Tu bimetalovku znám, Ersa, otáčelo se kroužkem na rukojeti. Bohužel se asi po 3 letech používání rozsypala. Ale jiný Ersy makaj dodnes, koupeno 1982.
Akorát mě došly nejvíc používaný hroty ale dnes jsem v AME zjistil, že Solomon ti jistí. Sice je o pár mm kratší tyčka do tělíska, ale maká. A jsou u toho prapodivný hroty, vše ze železa včetně toho Solomonu vpravo.
![Smile :)](./images/smilies/icon_smile.gif)
Jirka
Proč mi nemůže všechno chodit hned ?!!
Proč mi nemůže všechno chodit hned ?!!
V SIM kartách bývají obyčejné EEPROM (2 až 8KB). Počet zápisů bývá v rozmezí cca od 100000 do 1000000 na stejnou adresu tj. na každou buňku paměti. Při využití jen malé části adres a s postupnou změnou tj. použitím jiných adres v čase se výdrž prodlouží tím, že se nebudou používat stále stejné adresy buněk paměti.samec píše:Koľko zápisov vydrží telefónna SIM karta? Mám tu ďalšiu, ktorej skončila platnosť a príde mi škoda ju vyhodiť do smetia.
Změnu adres si musíte ošetřit ve vlastním SW, který s EEPROM v té SIMce bude pracovat. Třeba bude používat strukturu zabírající v paměti 10 bajtů místa, které se budou zapisovat vždy najednou. K tomu přidáte třeba na začátek bloku 2 bajty WORD hodnotu čítače zápisů toho bloku. Takže paměť bude rozdělena na bloky po 12-ti bajtech dat včetně čítače zápisů pro každý blok. Začnete s prvním blokem. Při každém zápisu celého bloku zvýšíte hodnotu čítače pro první blok o 1. Pokud hodnota čítače pro první blok paměti dosáhne 65535 tak začnete používat druhý blok atd. Počtem zápisů 65535 na stejné místo v paměti nepřekročíte ani tu zmíněnou dolní hranici 100000 zápisů. Pokud bude v SIM paměť 8KB tj. 8192 bajtů tak by vám to mělo vydržet celkem na 682 bloků * 65535 zápisů = celkem 44 694 870 zápisů.
Pokud budete používat menší blok dat než 12 bajtů tak bude výdrž větší a naopak pokud budete používat větší blok dat než 12 bajtů tak bude výdrž menší.
Pokud by se například používal dle toho co psal Celeron v úvodu tohoto tématu jen jeden bajt dat a k tomu by se doplnily dva bajty pro čítač tj. celková délka 3 bajty na blok tak by to při 8KB paměti mělo vydržet na 2729 bloků * 65535 zápisů = celkem 178 845 015 tj. skoro 179 milionů zápisů.
Pro identifikaci, který blok paměti je aktuální pro čtení i zápis můžete na konci paměti vyhradit 2 bajty tj. offset aktuálně používaného bloku (pozn. nazvěme to třeba AktBlokOffset). Tato hodnota bude na počátku 0 pro první blok a pak se bude pouze při změně na další blok zvyšovat o délku bloku.
Příklad (zápis v jazyce C):
Takže např. víte, že používáte SIM s délkou paměti 8192 bajtů a délku bloku 3 bajty včetně čítače zápisů.
Kód: Vybrat vše
#define DELKA_EEPROM 8192 // celkova delka v bajtech
#define DELKA_BLOKU 3 // delka v bajtech vcetne citace zapisu v kazdem bloku
#define MAX_OFFSET ((DELKA_EEPROM / DELKA_BLOKU) * DELKA_BLOKU) - DELKA_BLOKU)
#define AKTBLOK (DELKA_EEPROM - 2)
typedef struct {
unsigned short int Zapisu;
unsigned char Data;
} BLOK;
unsigned short int AktBlokOffset;
struct BLOK AktBlokData;
// Pri cteni dat z EEPROM se z adresy na offsetu AKTBLOK nactou 2 bajty
// do promenne AktBlokOffset tj. offset aktualne pouzivaneho bloku.
//
// Pote se z EEPROM nactou data bloku vcetne citace
// do struktury AktBlokData tj. delka DELKA_BLOKU
// pocinaje offsetem dle AktBlokOffset.
// Před zápisem do EEPROM se zkontroluje pocet zapisu
// v datech nactene struktury bloku v polozce
// AktBlokData.Zapisu a pokud bude 65535 tak se posune
// hodnota offsettu v promenne AktBlokOffset o DELKA_BLOKU.
if (AktBlokData.Zapis < 65535) {
AktBlokData.Zapis++;
// nyni se zapisou data ze struktury AktBlokData
// do pameti EEPROM tj. delka DELKA_BLOKU na offset AktBlokOffset
...
} else {
// pocet zapisu pro aktualni blok vycerpan
// posun na dalsi blok
if (AktBlokOffset < MAX_OFFSET) {
AktBlokOffset += DELKA_BLOKU;
AktBlokData.Zapis = 0;
// nyni se zapise hodnota z promenne AktBlokOffset
// do pameti EEPROM tj. delka 2 bajty na offset AKTBLOK
...
// pote se zapisou data ze struktury AktBlokData
// do pameti EEPROM tj. delka DELKA_BLOKU na offset AktBlokOffset
...
} else {
// Signalizace/upozorneni ze je pocet zapisu do EEPROM vycerpan.
// Je to samozrejme jen SW upozorneni ve vztahu k pouzitemu poctu 65535
// a fyzicky mozny pocet zapisu do te ci one EEPROM muze byt vyssi.
...
};
};