ATNEL tech-forum https://forum.atnel.pl/ |
|
Zapisywanie danych do zewnętrznego EEPROMu (I2C) https://forum.atnel.pl/topic22495.html |
Strona 1 z 1 |
Autor: | Semi [ 19 sie 2019, o 08:29 ] |
Tytuł: | Re: Zapisywanie danych do zewnętrznego EEPROMu (I2C) |
Użyj struktury. język c Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod. Do eepromu wyślesz element struktury (można i calą strukturę) język c Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod. gdzie kolejne parametry to 0 - adres w eeprom I2C eeprom+rekord*nrRekordu- adres danych w ram sizeof(rekord) - liczba danych do zapisu Strony pamięci nie przekraczasz (24C512 ma 128bajtów), więc zapis zajmie max 5ms. Aby program nie wisiał w czasie transferu danych użyj przerwań TWI. Dlaczego zewnętrzny EEPROM a nie wbudowany w AVR? Mega16 ma 512bajtów eeprom. Potrzebujesz 40x4x2 bajty = 320. Warto aby dane były chronione przez CRC (np CRC8), więc 40x4x(2+2) = 480bajtów. |
Autor: | Semi [ 20 sie 2019, o 13:34 ] |
Tytuł: | Re: Zapisywanie danych do zewnętrznego EEPROMu (I2C) |
felinutti napisał(a): Ogromne dzięki za wskazówkę! Nie mam o tym pojęcia więc trochę czasu mi zajmie ugryzienie tego Cytuj: Dlaczego zewnętrzny EEPROM a nie wbudowany w AVR? Pytałem kiedyś, na którymś forum jakie rozwiązanie lepsze to polecono mi zewnętrzną kość bo jest mniej awaryjna (bezpieczniejsza) Z tym się nie zgodzę. Każdy dodatkowy element powoduje ryzyko zwiększenia awaryjności. Co się częściej psuje, rower czy samochód? felinutti napisał(a): i ma 10-krotnie większą żywotność jeśli chodzi o zapis. Ile zapisów potrzebujesz? Jaki czas "życia" urządzenia jest wymagany? Może lepszy będzie FRAM? felinutti napisał(a): Zasugerowałem się tym i takie rozwiązanie zastosowałem. 24c512 jest sporo za duże, ale chciałem coś z dużym zapasem, żeby nie musieć wymieniać w razie jakby się okazało, że jednak brakuje. Obecnie cały program piszę dla Atmega16, ale domyślnie będzie to Atmega1284 z tego samego powodu co EEPROM Jak masz dużo FLASH a potrzebujesz dużej liczby zapisów, to emuluj EEPROM w FLASH. W ten sposób może sobie zwiększyć liczbę zapisów do 10 czy słynnych wałęsowych 100 mln niskim kosztem. W praktyce, w mikrokontrolerach często nie ma pamięci EEPROM, jest ona emulowana w FLASH. |
Autor: | Semi [ 20 sie 2019, o 19:55 ] |
Tytuł: | Re: Zapisywanie danych do zewnętrznego EEPROMu (I2C) |
felinutti napisał(a): Urządzenia będzie działać dopóki któreś z nas wymięknie Ilość odczytów i zapisów nie będzie jakaś ogromna (myślę, że jeśli przekroczę 1000 to będzie cud), ale chcę do minimum ograniczyć możliwą awaryjność. I myślisz, że osiągniesz to dodając zewnętrzne układy? Mylisz się, już pisałem, w ten sposób awaryjność zwiększa się. felinutti napisał(a): Myślałem nad czymś w stylu back'upu wszystkich ustawień Dobry pomysł ale połącz to z CRC o którym pisałem. Możesz dodatkowo trzymać pozą kopia w EEPROM kopię w FLASH. |
Autor: | xentis [ 11 wrz 2019, o 07:30 ] |
Tytuł: | Re: Zapisywanie danych do zewnętrznego EEPROMu (I2C) |
trudno powiedzieć czy wszystko ok nie widząc ciała funkcji "TWI_write/read_bufor" ale pierwsze co rzuca sie w oczy to to: język c Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod. Tak czy inaczej pierwsze dwie komórki tablicy bufora powinny zostać napełnione prawidłowo, a skoro nie są to problemu bym szukał w funkcjach zapisu/odczytu eeproma. Te funkcje naskrobałeś sam czy masz z jakiegoś źródła? Bo widzisz z tymi pamięciami jest pewien problem, a mianowicie ich cała rodzina nie ma jednorodnego protokołu komunikacji ze względu na różną długość adresu potrzebnego do zaadresowania całej przestrzeni pamięci. I tak np kość 24c02 ma pojemność 2048 bitów, a komórki są 8 bitowe więc komórek jest 256, wiec adres ostatniej komórki to 255, czyli dokładnie jeden bajt. Pamięć której użyłeś ma pojemność 512*1024=524288, dzieląc przez 8 otrzymujemy 65536 komórek pamięci, a do zaadresowania ostatniej potrzeba dwóch bajtów. A to nie koniec niespodzianek. Pamięci których pojemność wymaga niepełnych dwóch bajtów są tak pokręcone że część adresu komórki która "wystaje" poza pierwszy bajt jest upychana w miejsce adresu sprzętowego (te kości mają albo ograniczoną możliwość zmiany adresu albo nie mają tej możliwości wcale). Podsumowując, może być tak, że funkcje których używasz, były napisane pod inny rozmiar pamięci i twoją kostko nie chcą poprawnie gadać. |
Autor: | xentis [ 11 wrz 2019, o 22:32 ] |
Tytuł: | Re: Zapisywanie danych do zewnętrznego EEPROMu (I2C) |
Funkcje TWI_write_buf i TWI_read_buf są niewłaściwe dla pamięci 24C512, tak jak pisałem wcześniej, w obecnej postaci nadają się do obsługi pamięci 24C01 i 24C02. Z kolei funkcje EI2C_write_buf i EI2C_read_buf są już bliższe prawdy, ale jeszcze nie to, te nadają się do obsługi pamięci 24C04, 24C08 i 24C16. Tu masz właściwą postać dla 24C512: |
Autor: | xentis [ 12 wrz 2019, o 20:40 ] |
Tytuł: | Re: Zapisywanie danych do zewnętrznego EEPROMu (I2C) |
Masz bluebooka? |
Autor: | xentis [ 12 wrz 2019, o 21:52 ] |
Tytuł: | Re: Zapisywanie danych do zewnętrznego EEPROMu (I2C) |
To ustaw sobie w stopce ikonę bb (można to zrobić w ustawieniach profilu). Dzięki temu jak ktoś będzie chciał Ci pomóc od razu widzi czym dysponujesz, i lepiej może dopasować odpowoedź. |
Autor: | xentis [ 4 paź 2019, o 17:35 ] |
Tytuł: | Re: Zapisywanie danych do zewnętrznego EEPROMu (I2C) |
Nie wiem czy dobrze rozumiem Twój problem bo trochę chaotycznie to opisujesz. Rozumiem to tak, że masz rejestr który czymś steruje, i chcesz mieć możliwość odczytanie stanu pinów rejestru i zapisu ich w rozbiciu na zmienne, oraz w drugą stronę ze zmiennych chcesz mieć możliwość wysłać ich stan do rejestru Takie coś możesz zrobić na zwykłych warunkach if: język c Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod. dodatkowe ale: nie wiem skąd Ci się to wzięło ale ten zapis ustawia 0 a nie jeden i na odwrót z drugim zapisem, chyba że potrzebujesz mieć wartość zanegowaną, bo np masz diody sterowane zerem... |
Strona 1 z 1 | Strefa czasowa: UTC + 1 |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |