Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 29 sty 2026, o 23:44


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 9 ] 
Autor Wiadomość
PostNapisane: 6 sie 2014, o 11:51 
Offline
Użytkownik

Dołączył(a): 17 mar 2013
Posty: 143
Lokalizacja: Bydgoszcz
Pomógł: 2

Witam.

Chciałbym zapisywać dane do pamięci eeprom. Ponieważ danych nie będzie dużo a zapisy będą dość częste to chciałbym wykorzystać całą dostępną pamięć EEPROM aby jej komórki były zapisywane równomiernie a nie np. stale tylko początkowe. Do tego dane będą kolejkowane FIFO. Czyli idealnie nadaje się do tego jakiś bufor. Na końcu bufora będą zapisywane dane a pobierane z początku więc początek i koniec danych będzie się zmieniał (tak jak to opisywał Mirek w BlueBooku). Normalnie miałbym 2 zmienne Head i Tail, w których przechowywałbym adres początku i końca danych. Ale tu mamy do czynienia z pamięcią EEPROM. Nie zapiszę tych danych (Head i Tail) w tej pamięci bo musiałbym to robić stale w tych samych komórkach. Nie mogę tego trzymać w RAMie bo jak wyłączę zasilanie to dane znikną. A co jeśli można byłoby odtworzyć adres głowy i ogona. Czyli po włączeniu zasilania uC przeleciałby się po pamięci EEPROM i znalazł gdzie jest początek a gdzie koniec danych (czyli gdzie głowa i ogon). Zapisana przeze mnie wartość w buforze nigdy nie będzie równa 255 więc można 255 traktować jako pustą komórkę. Jak najprościej do tego podejść ?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 sie 2014, o 11:58 
Offline
Użytkownik

Dołączył(a): 25 lip 2013
Posty: 2605
Pomógł: 129

A nie myslales, żeby zrobić układ detekcji braku zasilania i wtedy szybko zrzucić dane z ram do eeprom? Nie musiałbyś wtedy sie przejmować równomiernym zapisywaniem do eeprom.

Sent from my mobile.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 sie 2014, o 11:59 
Offline
Użytkownik

Dołączył(a): 17 mar 2013
Posty: 143
Lokalizacja: Bydgoszcz
Pomógł: 2

Zastanawiałem się nad tym. Ale to by mi skomplikowało sprzęt.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 sie 2014, o 12:17 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 cze 2013
Posty: 988
Lokalizacja: Byram, MS 39272
Pomógł: 55

Jak częste będą zapisy? Bierzesz pod uwagę to, że ilość zapisów do EEPROM jest ograniczona?
Masz około 1 000 000 zapisów. Jeśli częstotliwość zapisu do pamięci jest 1 Hz to urządzenie będzie CI działać około 11 dni. Jeśli częściej to czas odpowiednio spadnie.

_________________
Pomysły na podpis - wyślij SMSa +1 769 243 0011



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 sie 2014, o 12:24 
Offline
Użytkownik

Dołączył(a): 17 mar 2013
Posty: 143
Lokalizacja: Bydgoszcz
Pomógł: 2

WoodPaker napisał(a):
Jak częste będą zapisy? Bierzesz pod uwagę to, że ilość zapisów do EEPROM jest ograniczona?
Masz około 1 000 000 zapisów. Jeśli częstotliwość zapisu do pamięci jest 1 Hz to urządzenie będzie CI działać około 11 dni. Jeśli częściej to czas odpowiednio spadnie.


Spokojnie zapisów będzie niewiele np 200 dziennie. Biorąc EEPROM AT24C64A mamy 8192 * 1000 000 zapisów co daje wiele wiele lat działania. Ale o tym już była mowa na forum. Teraz trzeba tylko znaleźć mądry algorytm co wyszuka głowę i ogon.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 sie 2014, o 12:32 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 cze 2013
Posty: 988
Lokalizacja: Byram, MS 39272
Pomógł: 55

OK, ok. To wyjaśnia wiele aczkolwiek 8192 * 1 000 000 to zly zapis. Masz Milion zapisów do pamięci eeprom. Nigdy nie wiesz, ktora komórka uszkodzi się pierwsza więc nie możesz pisać 8192 * 1 000 000
Masz po prostu milion plus/minus kilka

Przy 200 zapisach dziennie masz około 13 lat działania. A co do głowy i ogona widziałem jakiś algorytm w II części symfoni C++. Co prawda nie chodziło o EEPROM tylko o jakiś bufor ale przecież można potraktować to tak samo

_________________
Pomysły na podpis - wyślij SMSa +1 769 243 0011



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 sie 2014, o 13:24 
Offline
Użytkownik

Dołączył(a): 16 maja 2012
Posty: 349
Lokalizacja: Legnica
Zbananowany użytkownik

Pomógł: 23

Pomysł na takie rozwiązanie ma TMF w swojej książce. Zadeklarowana w EEPROM tablica wypełniona np. wartościami 0xFF. Wartość 0xFF nie może należeć do zbioru zapisywanych danych. Można wybrać inny typ danych np. typ ze znakiem lub odpowiednio większy tak aby zapisywane dane nie były w kolizji z daną początkową zapisywaną w tablicy. Dalej jest już z górki. Przy zapisie szukasz pierwszego napotkanego pola tablicy z wartością 0xFF i tam zapisujesz. Jak osiągniesz koniec tablicy wypełniasz całą tablicę wartościami 0xFF i na pierwszej pozycji zapisujesz kolejną daną. Wariacją tego rozwiązania jest zapisywanie dwóch komórek. Dana i w następnej komórce znacznik, oczywiście najpierw zapis znacznika potem dana. Unikamy w sumie krytycznej sytuacji kasowania wszystkich zgromadzonych danych. Ale i to nie jest 100% bezpieczne. Zależy jak bardzo zależy ci na integralności danych zapisanych w EEPROM.

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 sie 2014, o 15:01 
Offline
Użytkownik

Dołączył(a): 05 lut 2013
Posty: 302
Pomógł: 19

Po angielsku ale wyczerpujaco rozwiazany jest twoj problem:
http://m.eet.com/media/1149460/22945-47235.pdf



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 sie 2014, o 20:31 
Offline
Użytkownik

Dołączył(a): 17 mar 2013
Posty: 143
Lokalizacja: Bydgoszcz
Pomógł: 2

Dziękuję wszystkim za odpowiedzi.

Sprawa wydaje się prosta jeżeli jesteśmy gotowi do poświęceń. Możemy np. poświęcić część bufora na klucz. Lub wykasowywać odczytane komórki.

Jeżeli usuniemy z bufora odczytaną wartość i wstawimy 0xFF to będziemy mogli znaleźć początek i koniec.

Poniżej spacja reprezentuje puste miejsce (0xFF) a "-" reprezentuje inną wartość.


Składnia: [ Pobierz ] [ Ukryj ]
język xml
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Odczytujemy 1 i ostatnią komórkę i już wiemy, która z możliwości nas dotyczy (nie dotyczy 1 i 6)

Jeżeli w danych mamy jakiś klucz narastająco np datę i godzinę to zawsze z łatwością znajdziemy ostatnią zapisaną komórkę. Problem będzie z pierwszą jeżeli nie będziemy odczytywali kasowanych danych bo nie koniecznie musi być to najmniejsza data, gdyż ta mogła już zostać odczytana. Więc zawsze trzeba oznaczyć odczytane komórki.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 9 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 2 gości


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
cron
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO