Záznam do EEPROM při vypnutí napájení

Raspberry, Arduino, Mini-PC a další

Moderátor: Moderátoři

Zpráva
Autor
Uživatelský avatar
Mahoney
Příspěvky: 347
Registrován: 26 říj 2019, 02:00

#31 Příspěvek od Mahoney »

A někdy i jako připomenutí - znám je, dokonce tu nějaké mám, a vůbec jsem si na ně nevzpomněl :D

Uživatelský avatar
JirkaZ
Moderátor
Moderátor
Příspěvky: 1429
Registrován: 26 úno 2021, 01:00

#32 Příspěvek od JirkaZ »

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...
Kdo chce, hledá způsob;
kdo ne - hledá důvod.

Ze dvou možností často volím tu třetí.

Uživatelský avatar
ondraN
Příspěvky: 209
Registrován: 16 srp 2022, 02:00
Bydliště: Roztoky

#33 Příspěvek od ondraN »

A pak ještě EERAM, což je EEPROM kombinovaná se SRAM. Pracuje se se SRAM a při vypnutí se obsah SRAM automaticky zkopíruje do EEPROM a při zapnutí zase naopak. Maká to bezvadně, je to rychlé jako SRAM. Jediný rozdíl je jeden kondenzátor, který zajistí energii pro přepis do EEPROM.

Uživatelský avatar
Crifodo
Příspěvky: 14471
Registrován: 11 říj 2005, 02:00

#34 Příspěvek od Crifodo »

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 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á.
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.

Uživatelský avatar
ondraN
Příspěvky: 209
Registrován: 16 srp 2022, 02:00
Bydliště: Roztoky

#35 Příspěvek od ondraN »

Akorát, že se s tím pak blbě řeší PID regulace, což je u páječky dost žádoucí, hlavně u těch s malou hmotou hrotu a vysokým výkonem tělesa.

Uživatelský avatar
Celeron
Příspěvky: 16140
Registrován: 02 dub 2011, 02:00
Bydliště: Nový Bydžov

#36 Příspěvek od Celeron »

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
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ě.
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. :)
Přílohy
Hroty Ersa.jpg
Jirka

Proč mi nemůže všechno chodit hned ?!!

Uživatelský avatar
samec
Příspěvky: 3692
Registrován: 19 pro 2017, 01:00

#37 Příspěvek od samec »

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.

Uživatelský avatar
Valdano
Příspěvky: 695
Registrován: 01 led 2023, 01:00
Bydliště: Česká Lípa

#38 Příspěvek od Valdano »

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.
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.

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.
    ...

  };

};

Odpovědět

Zpět na „Miniaturní počítače (Arduino, Raspberry a další)“