• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Żywotność EEPROM
#1
Cześć, czytałem z różnych źródeł i nie mogę raz na zawsze rozstrzygnąć jaka jest żywotność EEPROMU może ktoś wie czy ten rzekomo słynny zapis 100000 razy jest ogólnie na cały eeprom czy na dany adres że jak np korzystam po kolei z 5 różnych adresów to żywotność się zwiększa? Jak np padnie pierwsza komórka to bez problemu mogę korzystać z kolejnej itd itd
 
Odpowiedź
#2
Wypalają się poszczególne komórki, 100k to gwarantowana ilość, może wytrzymać i 10x razy więcej. Lepiej sobie opracować taki system zapisu, by zapisywać dane po kolei w każdej i zużywać je równomiernie wszystkie, niż czekać aż coś się uszkodzi, zmieniać program, wgrywać nowy i tak znowu. A przy okazji będziesz miał X zestawów danych archiwalnych, gdyby zapis ostatniego stanu się nie powiódł.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#3
Oki dzięki za rozstrzygnięcie zagwostki. Czyli teoretycznie w avr gdzie ma się dostępu do np 1023 adresów robić zapis 4 bajtowy co pół minuty przez 8h dziennie powinno wystarczyć na 70 lat dobrze liczę?
 
Odpowiedź
#4
tak samo zapisuje jakiegoś inta o wartości powyżej 1 bajta (255) to zapisują mi sie ostatnie cyfry czy tylko można zpaisać 1 bajtową zmienna na adres a większe wartości np inta trzeba podzielić na zmienne byte i potem je zsumować czy idzie jakoś zapisać w całości takiego inta i go odczytać bo zrobiłem test i zapisałem na pierwszy adres czyli 0 np wartość 25687 to po odczycie adresu 0 dostałem wynik 87 a w funkcji odczytu w tej oryginalnej bibliotece arduino nie mam możliwości podania ile bajtów zajmuje dana zmienna. Bo jeśli tylko można zapisywać do 255 to x 1023 adresy to daje tylko liczbę 260865
 
Odpowiedź
#5
Po prostu zastosuj "put" i "get" po drugie żle to liczysz a po trzecie ten zapis 100k tyczy się orginalnych AVR

260865 to zmieści się w int/uint16 zajmnie tylko 2b eepromu. 1b to 8 bitów czyli zmienna 64 bitowa zajmie 8b eepromu a chyba nie muszę mówić jaka liczba się mieści w zmiennej 64bity?

Musisz to sie nauczyć bo chcąc korzystać z get i put musisz sam obliczać ile miejsca zajmuje w eeprom bo podaje się tylko początek i żebyś nie najeżdżał...
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą. 
 
Odpowiedź
#6
Zapisując tak dane trzeba trochę stracić, np. dodać 2 bajty na numer zapisu, jakiś bajt czy dwa na kontrolę CRC, by mieć pewność, że odczytane dane są poprawne i zgodne z zapisanymi. Ale jest tej pamięci sporo i raczej na lata, zapis co pół minuty to jest bardzo często. Są też pamięci FLASH, FRAM, EEPROM zewnętrzne I2C/SPI jakby było za mało wbudowanej.
Może wystarczy zapisać i wykasować, tak by wiedzieć, że jak są dwie komórki FF po sobie, to nasze dane zaczynają się 4 bajty wcześniej. Pewnie jest o tym jakiś tutorial do znalezienia w Google jak to robić maksymalnie efektywnie.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#7
(11-10-2022, 20:10)Jarewa0606 napisał(a): Po prostu zastosuj "put"  i "get"  po drugie żle to liczysz a po trzecie ten zapis 100k tyczy się orginalnych AVR

260865 to zmieści się w int/uint16 zajmnie tylko 2b eepromu. 1b to 8 bitów  czyli zmienna 64 bitowa zajmie 8b eepromu a chyba nie muszę mówić jaka liczba się mieści w zmiennej 64bity?

Musisz to sie nauczyć bo chcąc korzystać z get i put musisz sam obliczać ile miejsca zajmuje w eeprom bo podaje się tylko początek i żebyś nie najeżdżał...
Tak wiem o co chodzi z tym ile zajmuje jaka zmienna jak zapomnę to sobie przypominam z internetu ile co zajmuje i o ile musze sie adresem przesunąć robiąc kolejny zapis z tym put i get pierwsze słyszę ale już mam znalezione referencje arduino i tutoriale z tym związane i przestudiuje to. 

Edit:
Dzięki potestowałem put i get i fajnie ładnie się zapisują i odczutują np inty do wartości 32k zajmujące miejsce 2 bajty, zapisuje i przesuwam się o 2 bajty tak samo z odczytem. Więc zapisując inty do adresu 1000 pozostawiając resztę adresów na zapis innych ważnych informacji mogę już zapisać wartość 16383500 to sporo aż za dużo niż potrzebuje. Zrobię tak że po prostu co minute odczytuje z danego adresu wartość jeżeli jest nowa większa wartość to nadpisuje i przechodzę na kolejny adres aż do 1000 tym samym wydłużę żywotność eepromu 500 zapisów x 100 000 cykli to juz powinienem być spokojny na lata lecz to urządzenie nie bedzie pracować długo ale niech przez kilka lat jest jakiś tam
bufor żywotności tej pamięci. Zapis co minute bedzie następował tylko i wyłącznie podczas wykonywania cyklu jak nie będzie zezowlenia na liczenie czasu nic do pamieci nie bedzie zapisywane a urządzenie może czasami bedzie pracować raz na parę tygodni kilka godzin i tyle. Tak czy siak nauczyłem się kolejnej rzeczy i rozwiązałem kolejny problem używając put i get. Dzęki!!!
 
Odpowiedź
#8
(11-10-2022, 20:14)kaczakat napisał(a): Zapisując tak dane trzeba trochę stracić, np. dodać 2 bajty na numer zapisu, jakiś bajt czy dwa na kontrolę CRC, by mieć pewność, że  odczytane dane są poprawne i zgodne z zapisanymi. Ale jest tej pamięci sporo i raczej na lata, zapis co pół minuty to jest bardzo często. Są też pamięci FLASH, FRAM, EEPROM zewnętrzne I2C/SPI jakby było za mało wbudowanej.
Może wystarczy zapisać i wykasować, tak by wiedzieć, że jak są dwie komórki FF po sobie, to nasze dane zaczynają się 4 bajty wcześniej. Pewnie jest o tym jakiś tutorial do znalezienia w Google jak to robić maksymalnie efektywnie.
taak wiem miałem to prędzej na uwadzę że musze zapisać gdzieś np na koniec epromu jaki ostatni adres wykorzystałem, co to kontrola CRC? Przeczytałem definicje tego lecz i tak nie wiem jak to mam wykorzystać w eepromie i chyba zbyt zaawansowana funkcja w tak prymitywnym urządzeniu które buduje. Zgniatarka puszek liczy ile zgniotło od momentu włączenia i ogółem zapis do pamieci eeprom aby wiedzieć ile cykli wykonała zgniatarka.
 
Odpowiedź
#9
Jak sobie wybierzesz miejsce, gdzie zapiszesz adres, to je będziesz zapisywał tak samo jak w pierwszym pomyśle do szybkiego zajechania tej komórki, przecież musisz zapisać adres przy każdym zapisie, co 30s.
Jak robisz jeden produkt dla siebie, nie ma to zresztą znaczenia, psujesz komórkę i zmieniasz sobie program co pół roku, choć bez CRC nie będziesz wiedział, że już zepsułeś, przecież program będzie coś odczytywał i używał takich danych.
W produkcie komercyjnym to powinno wytrzymać chociaż 20 lat.
To raczej polega na tym, że w czasie działania programu znasz adres do zapisu kolejnego zestawu liczb, a przy starcie to trzeba odczytać cały EEPROM i znaleźć ten ostatni zapis. Odczyt 1k EEPROM AVR to z 2ms, nieistotny w setup.
CRC to suma kontrolna, masz szereg liczb, przeprowadzasz na nich obliczenia i wstawiasz do kompletu kolejną liczbę, odwrotny algorytm potwierdza, że ten zestaw liczb jest poprawny.
Robisz to za każdym razem gdy odczytujesz DS18B20, też otrzymujesz zestaw liczb, możesz odczytać tylko dwie pierwsze i użyć temperatury, albo odczytać wszystkie i zweryfikować, czy dane, które chcesz użyć zostały wysłane przez czujnik, czy może zostały zebrane losowo ze względu na awarię magistrali/czujnika/zakłócenia.
Zestaw takich danych do zapisania można trzymać w strukturze, w C++ odpowiednikiem jest obiekt, ale i tak są używane struktury w Arduino. Wtedy masz tak samo jak w tablicy wszystkie zmienne ułożone ładnie koło siebie w RAM/EEPROM/FLASH, nie ważne jakiej są wielkości poszczególne zmienne - bajt, dwa czy cztery, algorytmem przejeżdżasz po bajtach licząc CRC i wiesz czy możesz użyć takiego zestawu, czy sięgnąć do poprzedniego. Nawet w przykładach do EEPROM jest CRC 32 , nie wiem czy to nie armata na AVR dla paru bajtów. Są też struktury pokazane w przykładach EEPROM.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#10
Produkt robię hobbystycznie po znajomości dla znajomego brata z którym nie będę miał kontaktu więc zmiana komórki co pół roku nie wchodzi w grę ale to nic urządzenie i tak nie będzie dużo pracować a jak np zostawię sobie 600 komórek na zapis 2 bitowej wartości czyli 300 i np 300 komórek na zapis adresu to i tak powinienem mieć spokój na długie lata i zapis zwiększam co minutę a nie co pół a w przypadku wyłączenia zasilania szybciej niż minuta najwyżej główny licznik oszuka o kilka cykli bo więcej niż pewnie 20 na minutę nie da się zrobić a to przybliżona orientacyjna wartość ma być do niczego ważnego nie wykorzystywana więc tolerancja błędu może być. Dzęki za odpowiedz!
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości