logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Jak szybko skasować szeregowy EEPROM 32kb z organizacją 64 bajtów na bank?

Ajatol 30 Wrz 2004 14:24 2400 15
REKLAMA
  • #1 883970
    Ajatol
    Poziom 15  
    Posty: 259
    Pomógł: 1
    Ocena: 2
    W moim sterowniku wykorzystuje szeregową pamięć eeprom 32kb o organizacji 64 bajtów na bank. Pamięć ta przechowuje tygodniowy rejestr zdarzeń. Po rozpoczęciu się nowego tygodnia potrzebuje szybką ją skasować. Nie mogę jej po prostu odrazu nadpisywać, tylko najpierw muszę ją całą skasować.
    Moje pytanie brzmi jak to zrobić i ile to będzie trwało.
  • REKLAMA
  • #2 884009
    Tdv
    Poziom 34  
    Posty: 2237
    Pomógł: 150
    Ocena: 53
    Nie możesz po prostu wpisać do wszystkich komórek zer lub 255?
    Zależnie od tego co to za pamięć to trwało to będzie iloś_komórek_(bajtow) x okolo_10ms
    te 10ms zależy od pamięci.
  • #3 884099
    Ajatol
    Poziom 15  
    Posty: 259
    Pomógł: 1
    Ocena: 2
    Oczywiście mógłbym tak zrobić ale zaznaczyłem że musze to zrobić szybko(czym szybciej tym lepiej) a przy takim kasowaniu to by trwało nawet do 4 min.
  • REKLAMA
  • #4 884113
    BoskiDialer
    Poziom 34  
    Posty: 1530
    Pomógł: 353
    Ocena: 42
    szeregowy eeprom to rozumiem że z serii 24c, 32kb (kilo bity!) to więc będzie 24c32, mam tą kość, wczoraj zrobiłem sobie driver na 74244 i przez lpt -> i2c tą kość programowałem i kasowałem, naraz udało mi się zapisać 32 bajty, a odczytać całą pamięć (te 4KB), zapis poprostu jest w trybie pagewrite, więc na zapis 4096 komórek, po 32 bajty na zapis mam (4096/32)*10[ms] = 1280ms a więc coś ponad sekunde, sekunda z hakiem mi się kasowała cała kość. jeśli pomyliłeś się z jednostką, i miało być 32KB (24c256) to te kości mają zapis pagewrite z max 64bajtami naraz, więc (32768/64)*10[ms] = 5120ms to 5 sekund z hakiem powinno zająć kasowanie całej pamięci. jeśli i to cię niesatysfakcjonuje to podłącz 2 takie same kości, w tym samym momencie jedna będzie zawierała dane a druga będzie pusta, podczas zmiany tygodnia zmienisz obie kości swoją rolą (dane do aktualnie pustej) a w wolnym czasie procesora ta druga kość będzie sie opróżniała (zmiana nastąpi poprzez zmiae adresu i2c kości do której się aktualnie zwracasz). jest to sposób bardzo nieekonomiczny gdyż zawsze jedna kość jest nieużywana. lepiej poświęcić te 5 czy 6 sekund niż kupować 2 kości.
  • REKLAMA
  • #5 884405
    mzielin
    Poziom 22  
    Posty: 483
    Pomógł: 31
    Ocena: 16
    Ładuj sobie dane do jakiegoś bufora w czasie kasowania pamięci.
  • #6 885386
    Tdv
    Poziom 34  
    Posty: 2237
    Pomógł: 150
    Ocena: 53
    Bufor nie jest do końca dorbym rozwiązaniem bo zanik napięcia może spowodować utratę danych. Z drugiej strony takie urządzenie powinno być wyposażone w zegar czasu rzeczywistego, czyli i jakieś podtrzymanie.
    Druga rzecz, można skasować powiedzmy 10 - 20 komórek do bieżących zapisów i do reszty wrócić poźniej, kiedy będzie chwila czasu.
    Czas można też nieco skrócić przez dobór odstępu pomiędzy zapisem do kolejnych komórek (dawać mniej niż 10ms) ale trzeba to zrobić doświadczalnie na każdym!!! egzemplarzu pamięci i od razu piszę, że ATMELe tego nie lubią.
    Nie ma innej możliwości skasowania takiej pamięci.
  • #7 885412
    Ajatol
    Poziom 15  
    Posty: 259
    Pomógł: 1
    Ocena: 2
    No i napisałem procedurkie do kasowania ale wykonuje sie około 9s a z obliczeń wynika że to powinno być o połowe krócej, no i najważniejsze że ona wcale nie kasuje tego eeproma(zostają stare wartości).
    Cóż takiego zrobiłem żle że kasowanie nie działa.


    Sub Kasuj_eeprom
    Local Nrbanku As Integer
    Local Nrkomorki As Byte
    Local Chwilowa1 As Byte
    Nrbanku = 1 : Nrkomorki = 0 'pierwszy bank nie będzie kasowany
    Chwilowa1 = &HFF 'wpisuje same ff
    For Nrbanku = 1 To 511 '511 bank jest ostatnim bo 1 nie jest do kasowania
    I2cstart 'warunek startu
    I2cwbyte 162 'wyślij adres układu
    I2cwbyte Nrbanku 'wyślij adres banku w pamięci EEPROM
    I2cwbyte Nrkomorki 'wyślij adres komórki
    For Nrkomorki = 0 To 63
    I2cwbyte Chwilowa1 'skasowanie całego banku
    Next Nrkomorki
    Reset Nrkomorki 'znów od komórki 0
    I2cstop 'warunek stopu
    Waitms 10
    Next Nrbanku 'ustaw na następny bank
    End Sub
  • #8 885460
    mzielin
    Poziom 22  
    Posty: 483
    Pomógł: 31
    Ocena: 16
    Moment, a po co tak się śpieszysz w ogóle...
    Piszesz, że w tej pamięci są zdarzenia z całego tygodnia, oraz że kasujesz ją zawsze na początku tygodnia. Czyli w poniedziałek nie będziesz wiedział co było w sobotę, bo wykasowałeś wszystkie dane. Wg mnie źle robisz. Powinieneś zorganizować w pamięci coś w rodzaju rejestru szeregowego, pamiętającego cały tydzień, a ty z początkiem nowego dnia przesuwasz wskaźnik danych i kasujesz tylko bieżący dzień. Będziesz miał zawsze dostęp do danych z poprzednich 6-ciu dni. Nie namawiam Ciebie do rotacji danych, bo to tylko obciąży pamięć, lepiej wykorzystać jako wskaźnik którąś z komórek pamięci eeprom.
  • #9 885490
    Ajatol
    Poziom 15  
    Posty: 259
    Pomógł: 1
    Ocena: 2
    Zawartość eeproma będzie wysyłana do PC(bardzo często) możliwe że nawet real time' a w eepromie ma być pamięć zdarzeń z tygodnia żeby można było je sobie lokalnie przez operatora podglądnąć. Tak więc twój pomysł z przesuwaniem danych w pamięci albo czymś w tym rodzaju nie jest w tym przypadku potrzebny.
  • REKLAMA
  • #10 885635
    Jacu$
    Poziom 27  
    Posty: 730
    Pomógł: 119
    Ocena: 26
    Ajatol wrote:
    Cytat:
    Cóż takiego zrobiłem żle że kasowanie nie działa.


    Z dejtaszitu pamięci 24LC256 (Microchip) wynika, że powinieneś wysłać do scalaka pierwszy bajt w postaci:
    Start - 1 - 0 - 1 - 0 - A2 - A1 - A0 - R/W
    Jeśli zwarłeś pierwsze 4 nóżki scalaka do gleby to A2=A1=A0=0 oraz R/W=0
    Tak więc powinieneś wysłać do pamięci pierwszy bajt o wartości 10100000 binarnie, czyli 160 dziesiętnie.
    Tymczasem Ty napisałeś w listingu:
    Cytat:
    I2cstart 'warunek startu
    I2cwbyte 162 'wyślij adres układu

    No, ale ja nie podglądałem Twojej płytki jak jest polutowana.
    A tak na marginesie to w/w pamięć pracuje z taktowaniem 400kHz.
    Microchip robi też kostki 24FC256, które pracują (przy zasilaniu powyżej 2.5V) z zegarem 1MHz. Taką kostkę skasujesz bardzo szybko.
  • #11 885662
    Ajatol
    Poziom 15  
    Posty: 259
    Pomógł: 1
    Ocena: 2
    Adres eepromu 162 jest ok(mam zmieniony adres). Sama procedura działała przy zapisie pojedyńczych bajtów ale jak dodałem pętle żeby zapisywała za jednym zamachem cały blok(64bajty) to jóż nie działa.
    Zrobiłem tak ponieważ ktoś mi podpowiedział żeby zapisać od razy cały blok to musimy mu po komendzie
    I2cwbyte dana do zapisu
    wpisywać kolejne dane a on to sobie umieści w wewnetrznej pamięci(pewnie ram) i po zatrzymaniu transmisji przepisze całą zawartość
    do eepromu.
    Ktos coś jeszcze wie na ten temat.
  • #12 885769
    Jacu$
    Poziom 27  
    Posty: 730
    Pomógł: 119
    Ocena: 26
    Cytat:
    I2cwbyte Nrbanku 'wyślij adres banku w pamięci EEPROM
    I2cwbyte Nrkomorki 'wyślij adres komórki

    Wydaje mi się, że tutaj tkwi błąd.
    Adres banku to 9 bitów ale rozbite na 7 mniej znaczących bitów starszego bajtu adresu i dwa bardziej znaczące bity młodszego odresu. Pozostałe 6 mniej znaczących bitów młodszego adresu ustawić trzeba na zero (adres komórki).
  • #13 885807
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 51
    Ajatol napisał:
    W moim sterowniku wykorzystuje szeregową pamięć eeprom 32kb o organizacji 64 bajtów na bank. Pamięć ta przechowuje tygodniowy rejestr zdarzeń. Po rozpoczęciu się nowego tygodnia potrzebuje szybką ją skasować. Nie mogę jej po prostu odrazu nadpisywać, tylko najpierw muszę ją całą skasować.
    Moje pytanie brzmi jak to zrobić i ile to będzie trwało.


    Witam.
    Ajatol:
    Ile komórek zajmuje zapis z jednego dnia i czy jest to zawsze taka sama ilość bajtów :?:
    Czy w tym zerowym niedostępnym(?) banku masz wolne 4 bajty :?:

    Pzdr.
    Piotrek Sz.
  • #14 885859
    Ajatol
    Poziom 15  
    Posty: 259
    Pomógł: 1
    Ocena: 2
    na dzień na każdą zmiane jest 1536 bajtów.
    Zapisuje tam czasy stanięć i ruszeń maszyny czyli zapisuje jednorazowo 3 bajty.
    Tak pierwszy bank jest do celów specyjalnych i mam tam wolne komórki
  • #15 885928
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 51
    Ajatol napisał:
    na dzień na każdą zmiane jest 1536 bajtów.
    Zapisuje tam czasy stanięć i ruszeń maszyny czyli zapisuje jednorazowo 3 bajty.
    Tak pierwszy bank jest do celów specyjalnych i mam tam wolne komórki


    To może coś a'la rejestr(bufor) kołowy i odpada kasowanie komórek.
    Komplikuje się troszkę obliczanie adresów i banków ,bo musimy sprawdzać czy nam się pamięć nie skończyła ale to jest przecież do napisania.
    Czyli coś tak:
    2 bajty=adres początek zapisu
    2 bajty=adres koniec zapisu
    I teraz jeśli chcę "wyzerować" tak bufor to "adres koniec zapisu" ładuję do
    "adres początek zapisu", "adres koniec zapisu" na 0 i tak w kółko.
    Ja takie cudo wykorzystuję w jednym rejestratorze tylko tam dane są w postaci ramek , ich długość i ilość (tych ramek)jest różna.
    Tym jednak już zajmuje się PC.Atmelek po wysłaniu na żądanie PC-ta danych "zeruje" bufor i znowu zapisuje dane w eepromie,a pecet to co otrzymał zapisuje na HDD interpretuje i ... tak w kółko.

    Pzdr.
    Piotrek Sz.

    DOPISAŁEM:
    "adres koniec zapisu" nie na zero tylko zostaje jaki był :oops:
  • #16 886125
    Ajatol
    Poziom 15  
    Posty: 259
    Pomógł: 1
    Ocena: 2
    Problem z kasowaniem został rozwiązany. Dziękuje wszystkim za pomoc

Podsumowanie tematu

✨ Dyskusja dotyczy szybkiego kasowania szeregowej pamięci EEPROM o pojemności 32kb z organizacją 64 bajtów na bank, wykorzystywanej do przechowywania tygodniowego rejestru zdarzeń w sterowniku. Standardowe kasowanie polega na nadpisywaniu wszystkich komórek wartościami 0xFF lub 0x00, co trwa około kilku sekund do kilku minut, zależnie od modelu pamięci i rozmiaru strony zapisu (page write). Przykładowo, dla kości 24C32 (4KB) z zapisem po 32 bajty na stronę czas kasowania wynosi około 1,3 sekundy, a dla 24C256 (32KB) z zapisem po 64 bajty około 5 sekund. Szybsze metody obejmują stosowanie dwóch kości EEPROM i przełączanie ich rolami, co pozwala na kasowanie jednej kości w tle podczas zapisu na drugiej. Problemy z implementacją kasowania blokowego wynikają z nieprawidłowego adresowania i obsługi protokołu I2C, szczególnie rozbicia 16-bitowego adresu na starszy i młodszy bajt oraz konieczności prawidłowego ustawienia bitów adresu urządzenia. Zalecane jest stosowanie page write zgodnie z dokumentacją układu, wysyłając kolejne bajty danych bez przerywania transmisji, a następnie oczekiwanie na zakończenie zapisu. Alternatywnie sugerowano organizację pamięci jako bufor kołowy, co eliminuje konieczność kasowania całej pamięci, jednak w opisywanym zastosowaniu wymagana jest pełna pamięć tygodniowa. Ostatecznie problem z kasowaniem został rozwiązany przez poprawne zaadresowanie i implementację procedury zapisu blokowego.
Wygenerowane przez model językowy.
REKLAMA