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.
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.
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.
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.
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
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.
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.
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.
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.
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).
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
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
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ł