Częste zapisywanie w pamięci nieulotnej

10

Projektuję urządzenie, które automatycznie dostosowuje swoją fizyczną pozycję wraz ze zmianami temperatury. Jeśli urządzenie się wyłączy lub zasilanie zostanie odłączone, urządzenie musi zapamiętać swoją ostatnią temperaturę i położenie. Mam możliwość przechowywania tych wartości w pamięci EEPROM, ale problem polega na tym, że pozycja i temperatura mogą się bardzo szybko zmieniać. Gdybym miał zapisać temp i pos do EEPROM po każdej zmianie, to (1) nieco spowolniłoby oprogramowanie i (2) prawdopodobnie zabiłoby EEPROM po roku lub dwóch. Tak więc widzę, że moje opcje są następujące ...

1) użyj kondensatora / baterii, aby utrzymać zasilanie urządzenia przez krótki czas po zaniku zasilania, aby móc zapisać wartości tylko w tym momencie w pamięci EEPROM. Nie podoba mi się to, ponieważ plansza jest trochę energochłonna, a to wymagałoby dużego ograniczenia. I nie mam dużo wolnego miejsca. I nie chcę dodatkowych kosztów baterii i uchwytu baterii / lub dużej czapki.

2) użyj F-RAM zamiast EEPROM, abym mógł pisać do niego tryliony razy bez zużycia. Nie podoba mi się ta opcja, ponieważ FRAM jest nieco droższy niż EEPROM i dotyczy produktu produkcyjnego (nie tylko jednego).

3) Zapisz pozycję i temperaturę tylko co około 5 minut. W ten sposób zawsze mam dość aktualną pozycję / temp, ale nie piszę co sekundę, więc mój program nie jest spowolniony, a pamięć EEPROM nie umrze tak szybko. To wydaje się być moją najlepszą opcją.

Czy ktoś jeszcze ma jakieś sugestie, o których nie myślę?

PICyourBrain
źródło
5
Tylko pytanie. Jeśli urządzenie automatycznie dostosowuje swoją pozycję fizyczną, dlaczego musisz pamiętać ostatnią temperaturę? Po ponownym włączeniu urządzenie nie zaktualizuje temperatury i nie wyreguluje jej pozycji?
Daniel Grillo
1
Zgadzam się z Danielem. Co się stanie, jeśli wyłączysz się, a temperatura otoczenia zmieni się drastycznie? Po włączeniu zasilania, jeśli używałeś ostatnio zapisanej temp / pozycji, i tak byłbyś w złym miejscu, a urządzenie skończyłoby się niezależnie. Czy istnieje inne wymaganie, które nie jest wymienione w pytaniu?
Dave
Jaka jest specyfikacja EEPROM - ile cykli zapisu?
Jason S

Odpowiedzi:

10

Potrzebujesz techniki zwanej wyrównywaniem zużycia . Nie zapisuje danych za każdym razem w tej samej lokalizacji w pamięci EEPROM, ale wykorzystuje pewien algorytm do użycia różnych lokalizacji. Czytałem o złożonych algorytmach wyrównywania zużycia, ale nie wiedziałbym, dlaczego następująca prosta metoda nie zadziała.

Dodaj do swoich danych 24-bitowy licznik, aby blok danych miał na przykład długość 8 bajtów. Strony w 24AA64 mają 32 bajty, więc pamięć EEPROM o pojemności 64 kb mieści 256 stron. Z arkusza danych:

„Podczas zapisu o długości mniejszej niż 32 bajty dane w pozostałej części strony są odświeżane wraz z zapisywanymi bajtami danych. To zmusi całą stronę do znoszenia cyklu zapisu, z tego powodu dla każdej strony określono wytrzymałość”.

więc nie ma sensu używać bloków danych mniejszych niż strona o wielkości 32 bajtów.

Spójrz na licznik pierwszej strony. Jeśli jest zero, użyłeś maksymalnej liczby cykli zapisu dla tej strony, więc przechodzisz do następnej strony i sprawdzasz licznik. Powtarzaj, aż znajdziesz licznik> zero. To jest strona, której obecnie używasz. EEPROM Microchip mają wytrzymałość 1 miliona cykli, którą można zwiększyć do 256 milionów w podanym przykładzie maksymalnie 32 bajtów na blok w EEPROM 64kb. To powinno wystarczyć, aby przetrwać Twój produkt: 40 lat, jeśli piszesz raz na 5 sekund (!).

Będziesz chciał zainicjować swoją pamięć EEPROM przy pierwszym użyciu. Skąd wiesz, kiedy to jest. Użyj ostatniej strony, aby napisać unikalny podpis podczas inicjalizacji. Sprawdź przy każdym włączeniu, czy podpis jest tam. Jeśli nie, urządzenie musi zostać zainicjowane. Możesz wstępnie ustawić licznik na każdej stronie z 0xF4240 (dla 1 miliona) lub wyczyścić wszystko do 0xFF i zapisać 0xF4240 przy pierwszym użyciu strony.
Inicjowanie pamięci EEPROM jest potrzebne, ponieważ czasami w procesie produkcyjnym / testowym zapisywany jest określony wzorzec.

edytuj
Wyrównanie zużycia powinno rozwiązać twoje problemy, ale nadal chcę skomentować rozwiązanie kondensatora. Mówisz, że płytka jest dość energochłonna, ale być może możesz odizolować moc mikrokontrolera / pamięci EEPROM od reszty płytki za pomocą diody. Prawdopodobnie będziesz potrzebować tylko kilku mA, gdy zniknie główne zasilanie. 24AA64 zapisuje stronę w czasie krótszym niż 5 ms, a następnie przy 10 mA i dopuszczalnym spadku napięcia 100 mV będziesz potrzebować

do=jatΔV.=10mZA5ms100mV.=500μfa

Łatwo dzięki małej superkapce.

dalsze czytanie
arkusza danych 24AA64
EEPROM Endurance Tutorial

stevenvh
źródło
Wytrzymałość pamięci EEPROM jest podana na stronę (przynajmniej dla 24AA64 i innych używanych pamięci EEPROM). 24AA64 określa stronę 32-bajtową, więc liczba powinna wynosić na stronę, a nie na blok.
Saad
@ Saad - poprawnie. Naprawiono w mojej odpowiedzi.
stevenvh
4

1) Po rozpoczęciu procesu zapisu wystarczy tylko zasilić MCU / EEPROM i upewnić się, że linie kontrolne się nie usterki - prawdopodobnie I2C jest lepszy niż SPI. Potrzebujesz tylko kilku mA na kilka milisekund, więc nie powinieneś być wielkim ograniczeniem, a MCU możesz uśpić po zainicjowaniu zapisu. 3) prawdopodobnie możesz zastosować pewną inteligencję, np. Opóźnienie - po napisaniu zawsze zawiera określony czas, może nastąpić inny zapis. Lub poczekaj, aż wartość będzie stabilna przez chwilę przed zapisaniem.
Możesz także zwiększyć wytrzymałość, rozkładając dane w wielu lokalizacjach. Microchip ma kilka narzędzi i adnotacji do obliczania wytrzymałości swoich eepromów, które mogą być przydatne.

mikeselectricstuff
źródło
4
Uwaga aplikacji Microchip na temat wytrzymałości: ww1.microchip.com/downloads/en/AppNotes/01019A.pdf Za pomocą aplikacji można także zwiększyć wytrzymałość o około 2x, zmniejszając napięcie robocze z 5v do 3,5v.
vandee
1
Jeśli używasz swojej pierwszej metody, upewnij się, że zapis w pamięci nieulotnej ma najwyższy priorytet w twoim systemie po uruchomieniu, tj. to przerwanie nie może spowodować, że twoje wartości zmienią się w połowie zapisu lub mikroprocesor rozpocznie inne przetwarzanie, które spowoduje, że zabraknie ci czasu. Najważniejsze jest, aby nie zapisywać uszkodzonych wartości podczas wyłączania zasilania. Ponadto CRC dla wartości pomoże ci potwierdzić, że nie nastąpiło uszkodzenie, ale będziesz musiał zdecydować, co zrobić, jeśli tak się stanie, na przykład przy użyciu ustawień domyślnych.
Martin
3

Sugerowałbym użycie urządzenia flash zorientowanego na bloki i użycie jednego bajtu z każdego bloku jako flagi trybu. Zachowaj jako niezmiennik, że prawie wszystkie flagi trybu zostaną zaprogramowane; będzie tylko jeden blok, w którym flaga trybu nie jest zaprogramowana, ale poprzedni blok (zawijanie, jeśli to konieczne). Blok ten będzie zawierał najnowsze dane. Gdy ten blok się zapełni, usuń następny blok (zwróć uwagę, że usuwany blok może przechowywać dowolną kombinację danych podczas cyklu kasowania, a niezmiennik nadal będzie się utrzymywał), a następnie po zakończeniu kasowania zaprogramuj flagę trybu na tym, co kiedyś być ostatnim blokiem.

Konieczne będzie wystarczające zabezpieczenie zasilania pamięci flash, aby zapewnić, że każda próba zaprogramowania bajtu zakończy się powodzeniem lub niepowodzeniem w całości, ale nie będzie miało znaczenia, czy cykl kasowania zostanie przerwany, pozostawiając blok pełen dowolnych danych, ponieważ kolejna próba wpisania danych spowoduje skasowanie tego bloku.

Jeśli twoje dane mają 16 bitów, układ 64Kx8 pomieści ponad 32 000 wpisów. Pisanie jednego wpisu na sekundę wypełniłoby układ około 2,7 razy. Nawet czip o wytrzymałości „tylko” 10 000 cykli kasowania trwałby ponad 10 lat. Zastosowanie większego układu lub takiego o wytrzymałości 100 000 proporcjonalnie wydłużyłoby żywotność.

supercat
źródło
2

1) Prawdopodobnie najprostsza opcja, chociaż może wymagać zmian sprzętowych. Osiągnąłem to wcześniej bez modyfikacji PBC, po prostu zwiększając pułapki odsprzęgania i przerywając przerywnik.

2) Jak już zauważyłeś, problemem z FRAM jest cena!

3) W zależności od zmienności danych temperatury i pozycji zwiększysz wytrzymałość, pisząc tylko, jeśli wartość się zmieniła. Możliwe, że próbkujesz temperaturę raz na sekundę, ale jeśli zmienia się ona tylko co 5 minut, problem został rozwiązany.

Tim
źródło
1

Oto jak rozwiązałem ten problem w moim projekcie:

Zarezerwuj 1 sektor pamięci flash, aby pomieścić maskę bitową nieużywanych miejsc i liczbę miejsc dla wartości.

Użyłem maski bitowej o długości 16 bajtów, więc miałem 128 miejsc do wprowadzenia wartości.

Maska bitowa jest inicjowana dla wszystkich, co w ujęciu flash jest stanem wymazanym.

Jeśli chcesz napisać nową wartość, przeczytaj maskę bitów i znajdź pierwszy bit, który jest jednym. Jest to numer gniazda, w którym zapiszesz wartość. Zmień ten bit na zero, aby oznaczyć go jako użyty, i zapisz maskę bitów z powrotem do flashowania bez uprzedniego usunięcia. Następnie zapisz wartość w gnieździe po masce bitów również bez kasowania pamięci flash.

W ten sposób wydłużysz cykle zapisu flash o 128 razy, pisząc nową maskę bitową, zmieniając tylko z jednego na zero.

Jeśli cała maska ​​bitowa ma wartość 0, usuń sektor pamięci flash i zacznij od nowa.

Robert
źródło
3
Mogę cię rozczarować, ale kiedy trochę flashujesz, cały sektor jest nadpisywany. Twoje rozwiązanie sprawi, że sektor „maski bitowej” będzie naprawdę martwy.
Andrejs Cainikovs
1
Jeśli nie usuniesz lampy błyskowej, nie wykorzystasz jednego z 10K cykli usuwania dla sektora. Jeśli masz wartość 0x7F i zapiszesz wartość 0x3F, wynikiem będzie 0x3F. Dzięki temu maska ​​bitowa jest aktualna, ale nie usuwa pamięci flash. Kasowanie następuje tylko wtedy, gdy cała maska ​​bitowa ma wartość 0.
Robert
Jeśli się mylę, porozmawiajmy. Nie chcę tutaj złych odpowiedzi i naprawdę nie chcę złego projektu w moim projekcie.
Robert
Myślę, że Robert ma rację. Na moim mikrokontrolerze możesz zapisywać tylko 4 bajty na raz, ale wymagane bity są ustawione na zero. Jedynym sposobem, aby przywrócić je do 1, jest wyczyszczenie bloku 1k. To tylko cykle kasowania, które zużywają flash ...
Tim
Może być inny dla każdego rodzaju pamięci, a może nawet dla dostawcy pamięci. Widziałem, że pamięci EEPROM muszą wymazać stronę, a następnie napisać ją ponownie dla każdego zapisu. Widziałem pamięć flash, w której możesz zapisywać bity, które wciąż są jednością bez usuwania strony.
mjh2007