Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Szybkie kasowanie szeregowego eeprom

Ajatol 30 Sep 2004 14:24 2139 15
  • #1
    Ajatol
    Level 15  
    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.
  • #2
    Tdv
    Level 34  
    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
    Ajatol
    Level 15  
    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.
  • #4
    BoskiDialer
    Level 34  
    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.
  • #5
    mzielin
    Level 22  
    Ładuj sobie dane do jakiegoś bufora w czasie kasowania pamięci.
  • #6
    Tdv
    Level 34  
    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
    Ajatol
    Level 15  
    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
    mzielin
    Level 22  
    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
    Ajatol
    Level 15  
    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.
  • #10
    Jacu$
    Level 27  
    Ajatol wrote:
    Quote:
    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:
    Quote:
    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
    Ajatol
    Level 15  
    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
    Jacu$
    Level 27  
    Quote:
    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
    zumek
    Level 39  
    Ajatol wrote:
    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
    Ajatol
    Level 15  
    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
    zumek
    Level 39  
    Ajatol wrote:
    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
    Ajatol
    Level 15  
    Problem z kasowaniem został rozwiązany. Dziękuje wszystkim za pomoc