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

Zapis do EEPROM 24c64 - Jak zarządzać adresami przy skokach?

PiotrLotnik 26 Sty 2006 23:35 5087 11
REKLAMA
  • #1 2223884
    PiotrLotnik
    Poziom 15  
    Posty: 207
    Pomógł: 2
    Ocena: 2
    Staram się zrobić tablice zmiennych Word w pamięci 24c64.
    Do tej pory używałem wewnętrznego EEPROMu ATMEGI32 ale teraz mi jej nie wystarczy.

    Pytanie czy moge zapisać 20 byte danych ciągiem zaczynając od adresu 1 a następnie 2 byty zaczynając od adresu 5000 i z powrotem zapisać 20 byte zaczynajac od adresu 21.
    Oczywiście wiem o konieczności sprawdzania młotrzego byte adresu (czyli &H1F).
    Tylko jak go sprawdzać jak sie skacze po tym adresie.

    Niech ktoś rzuci jakiś pomysł bo mnie szlak trafia.

    Pozdrawiam
  • REKLAMA
  • #2 2224034
    rejestr007
    Poziom 17  
    Posty: 188
    Pomógł: 12
    Ocena: 12
    Witam!
    Szczerze mówiąc nie wiem w czym problem? Musisz zapisywać adresując każdy bajt, to nie będzie problemu.
    Najpierw zapisujesz bajt pod adres 1 następnie dwa od 5000 a następnie, najlepiej w pętli z inkrementacją adresu, 20 bajtów zaczynając od 21.
    Pozdrawiam
  • REKLAMA
  • #3 2224078
    PiotrLotnik
    Poziom 15  
    Posty: 207
    Pomógł: 2
    Ocena: 2
    Nareszcie ktoś odpowiedział:)

    No w czymś jest problem, chce zrobić tablice na wzór tej w BASCOM
    Dim _Dana(1000) as eram Word
    tylko teraz to ma być w 24Cxx.
    Problem w tym, że podczas zapisu zwykych danych odbieranych z UART trzeba zapisać jeszcze adresy gdzie te dane zostały umieszczone.
    Do tej pory zapisywałem w wewnętrznym EEPROMie M32 (wszystko szło ok).
    I tak: odbieran np. 25 znaków i zapisuje je pod adresem 1, następnie musze zapisać ten adres w tablicy _Dana(1), który teraz mieści sie w 24c64 pod adresem 5000. I nastepne np.15 znaków zapisuje pod adresem 26 i ten adres umieszczam w tablicy _Dana(2) pod adresem 5002.
    W teorii wszystko wygląda ok. ale w próbach to wszystkie się miesza.

    Ponieważ adres sie zmienia (raz 25 byte pod adres 1 i nastepnie 2 byte pod adres 5000) to czy śledzenie najmłodszego byte adresu coś da??

    Pamięć 24c64 musi gubić dane zapisywane jako tablica. Jak tego uniknąć??

    Pozdrawiam
  • REKLAMA
  • #4 2224123
    rejestr007
    Poziom 17  
    Posty: 188
    Pomógł: 12
    Ocena: 12
    Witam ponownie!
    Cóż przykro mi lecz nie znam Bascoma. Ja to robiłem w C i asemblerze. Kiedyś trochę próbowałem z Bascomem ale właśnie takie dziwne zachowania i kody jakie generował skutecznie mnie do niego zniechęciły.
    Pozdrawiam
  • #5 2225165
    PiotrLotnik
    Poziom 15  
    Posty: 207
    Pomógł: 2
    Ocena: 2
    Moim zdaniem to nie jest wina programu. Czy to BASCOM czy C lub asembler.
    Chodzi o obsługe pamięci 24c64 tak jak piałem wcześniej.

    Jak możesz to powiec jak ty byś to zrobił i kiedy w takim przypadku mam czekać 5 ms, czy nie jest tak, że nie moge sobie skakać dowolnie po adresach pamięci??

    Pozdrawiam

    Widze, że mocnych w tym temacie nie ma :(
  • REKLAMA
  • #6 2227710
    rejestr007
    Poziom 17  
    Posty: 188
    Pomógł: 12
    Ocena: 12
    Ja to mam zrobione w ten sposób, iż jest napisana procedurka
    ZAPISZ_BAJT w skład której wchodzi sekwencja

    I2C_Start();
    I2C_Send(0xA2); // adres układu
    I2C_Send(subadrH); // pierwsza cześć adresu dla pamięci 24LC128
    I2C_Send(subadrL);
    I2C_Send(dbajt); // zapis danej
    I2C_Stop();
    Delay(10);

    tą procedurkę wywołuję za każdym razem gdy chce zapisać pojedynczy bajt. Adres pod który jest ona zapisywana jest wyliczany w funkcji z której ją wywołuję. W ten sposób mogę skakać po całej pamięci.
    Po każdym zapisie bajtu jest przerwa 10ms.
    Myślę, że podobnie można to zrobić w Bascomie.
  • Pomocny post
    #7 2227875
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    rejestr007 napisał:

    ... W ten sposób mogę skakać po całej pamięci.
    Po każdym zapisie bajtu jest przerwa 10ms.
    Myślę, że podobnie można to zrobić w Bascomie.

    Policz ile czasu zajmie prockowi zapisanie 8192 bajtów(24c64).Spoko można się zdrzemnąć :D

    Piotrek

    PS
    O pamięci 24c1024 , wogóle nie wspomnę :(
  • #8 2228032
    rejestr007
    Poziom 17  
    Posty: 188
    Pomógł: 12
    Ocena: 12
    Kolega widzę nie zorientowany. Dla pamięci AT24C128 max. czas cyklu zapisu, podany w karcie katalogowej, wynosi 10ms dla 5V! Przy napięciu 1,8V wzrasta już do 20ms!
    Do tego kto zapisuje od razu całą pamięć? Jak do tej pory to jednorazowo zdarzyło mi się zapisać 150 bajtów. Niestety zapis do pamięci EEPROM jest wolny i jak musisz to robić szybko to wybierz inny typ pamięci.
  • Pomocny post
    #9 2228105
    szymtro
    Poziom 30  
    Posty: 1421
    Pomógł: 101
    Ocena: 59
    Mam wrażenie że przy obecnie wybranym algorytmie nie da się przyspieszyć. Gdyby dane o adresie zapisywane były w ciągu z reszta to ujdzie i nie trzeba czekać ale tak to niestety:
    1. ładujesz adres początku
    2. wysyłasz dane po koleji
    3. czekasz te 10ms
    4. zapiszujesz pod 5000 zmienną adresu
    5. czekasz znowu 10ms

    I tak powinien wyglądać fragment zapisywania. Inaczej są szanse że ostatnie bajty nie zostaną zapisane. Teoretycznie te 10ms jest przewidziane na zapis całego bufora (w tym przypadku 64 bajty) i mozna było by skrócić ten czas do 25/64 * 10ms ale nie jest to nigdzie zagwarantowane.

    Jezeli mozesz to zapisuj samą zmienną przechowującą adres w pamięci procesora - jeżeli pamięć nie jest odłaczalna to takie rozwiazanie też zda egzamin.

    Bascom i jego kod wynikowy raczej nie ma tu nic do rzeczy - to tylko narzędzie jak wiele innych.
  • #10 2228715
    PiotrLotnik
    Poziom 15  
    Posty: 207
    Pomógł: 2
    Ocena: 2
    w pamięci 24c64 muszą być zapisywane słówka oraz adresy gdzie są te słówka zapisane bo liczba słówek już przekroczyła 200 (a wewnętrzny eeprom M8 może pomięścić tylko ok 200 adresów.

    szymtro dzięki za odpowiedź, jednak nie wiem czy moge sobie pozwoić na tak częste przerwy na czekanie, bo przy 100 słówkach mam juz 2s samego czekania i mogą pojawić sie problemy z transmisją UART.

    przyjdzie mi zrobić bufor na adresy i po zapisie słówek zapisywać w pamięć te adresy

    Pozdrawiam

    Dodano po 2 [godziny] 57 [minuty]:

    Działa.
    Dałem 5ms po zapisie słowa i 5ms po zapisie adresu_slowa oraz 5ms w przypadku kiedy mam adres komurki pamieci ma XX1F i dziala.
    Naszczęście nie zakłóciło to transmisji UART

    Jak widać BASCOM nie jest taki zły, skoro sobie poradził.

    Pozdrawiam
  • #11 2230288
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    rejestr007 napisał:
    Kolega widzę nie zorientowany. Dla pamięci AT24C128 max. czas cyklu zapisu, podany w karcie katalogowej, wynosi 10ms dla 5V!

    Hmmmm ... dla pojedynczego bajtu :?:
    Po co tracić 10x10ms na zapis 10 bajtów , skoro można to uczynić w 10 lub 20ms :?:
    rejestr007 napisał:

    Do tego kto zapisuje od razu całą pamięć? Jak do tej pory to jednorazowo zdarzyło mi się zapisać 150 bajtów. Niestety zapis do pamięci EEPROM jest wolny i jak musisz to robić szybko to wybierz inny typ pamięci.

    Ano są tacy , co zapisują całą i na dokładkę muszą to robić szybko , bo "nadawca" nie będzie czekał :D

    Piotrek
  • #12 2233276
    olekewaagata
    Poziom 25  
    Posty: 638
    Pomógł: 64
    Ocena: 28
    Panowie, trochę z duchem czasu, są już bez problemu dostępne układy FM24c64 (o innych pojemnościach również) http://www.gaw.ru/doc/Ramtron/FM24C64datasheet.pdf
    Poza tym dobrze napisana procedura zapisu do eepromu to taka , która nie czeka maksymalny czas zapisu podawany przez producenta tylko sprawdza czy pamieć odpowiada co jest wskaznikiem końca zapisu.
    Pamieci z max. czasem 10 mS zazwyczaj piszą się w 1.5-2 mS a miałem takie poniżej 1 mS .
    Natomiast teraz to tylko FM.

Podsumowanie tematu

LABEL_AI_GENERATED
Dyskusja dotyczy zarządzania zapisem danych w zewnętrznej pamięci EEPROM 24c64, szczególnie problemów z adresowaniem przy skokach między różnymi obszarami pamięci. Autor próbuje zapisać tablicę zmiennych typu Word, rozrzuconą na różnych adresach (np. 20 bajtów od adresu 1, 2 bajty od 5000, następnie kolejne 20 bajtów od 21), co powoduje problemy z poprawnym zapisem i odczytem danych. Wskazano, że konieczne jest adresowanie każdego bajtu osobno i stosowanie opóźnień (ok. 5-10 ms) po każdym zapisie, aby pamięć EEPROM zdążyła zakończyć operację zapisu. Zalecane jest stosowanie procedury zapisu pojedynczego bajtu z sekwencją I2C (start, adres, wysłanie adresu pamięci, zapis danych, stop) oraz przerwy po zapisie. Podkreślono, że skakanie po adresach jest możliwe, ale wymaga odpowiedniego zarządzania czasem zapisu i synchronizacji. Wskazano, że czas zapisu jest ograniczeniem i może powodować problemy z transmisją UART przy dużej liczbie zapisów. Zaproponowano buforowanie adresów w pamięci procesora, aby ograniczyć liczbę operacji zapisu w EEPROM. Wspomniano także o alternatywnych pamięciach FM24c64, które oferują szybszy zapis i możliwość sprawdzania zakończenia zapisu zamiast stałego opóźnienia. Dyskusja zawiera także uwagi dotyczące narzędzi programistycznych (Bascom, C, asembler) i ich wpływu na zachowanie kodu.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA