ATNEL tech-forum
https://forum.atnel.pl/

Struktura do EEPROM po I2C
https://forum.atnel.pl/topic20571.html
Strona 1 z 2

Autor:  xedossfm [ 8 kwi 2018, o 16:46 ]
Tytuł:  Struktura do EEPROM po I2C

Witam.

W jednym z moich urządzeń korzystam z wewnętrznego EEPROM A328p.
Trzymam w nim zmienne konfiguracyjne.
Przy każdym uruchomieniu urządzenia dane te są odczytywane a później
przy każdej zmianie którejkolwiek zmiennej, są one zapisywane do EEPROMu.
Tak przechowuję zmienne:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Odczyt i zapis:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Chciałbym teraz zapisywać taki typ strukturalny lub strukturę do zewnętrznego EEPROM na I2C np. 24c01(taki mam na stole)

Podpowie ktoś jak się za to zabrać?

Autor:  xentis [ 8 kwi 2018, o 17:21 ]
Tytuł:  Re: Struktura do EEPROM po I2C

W BB masz biblioteki do I2C. Przetoczona przez Ciebie kość 24C01 to pamięć EEPROM z interfejsem I2C.
I teraz masz funkcję I2C_write_buf która potrafi zapisać poprzez I2C pewien bufor danych do pomięci 24c01. Więc możesz pakiet danych pobrać z wewnętrznego EEPROMU funkcją eeprob_read_block do bufora w ram, następnie ów bufor wysłać funkcją I2C_write_buf do 24c01, lub poprostu Twoje ustawienia z RAM wysłać po I2C bezpośrednio do 24c01.
Reasumując musisz napisać funkcję która przy pomocy funkcji eeprob_read_block oraz I2C_write_buf przekopiuje dane.

Autor:  xedossfm [ 8 kwi 2018, o 17:35 ]
Tytuł:  Re: Struktura do EEPROM po I2C

Komunikację I2C mam uruchomioną od dawna.
Chodzi mi o to, że potrafię zapisywać i odczytywać pojedyncze bajty oraz ciągi bajtów a nie potrafię struktury.
Wychodzi mi też, że nie da się zapisać na raz więcej niż 8 bajtów i większe ilości trzeba rozbijać dane na paczki po 8 bajtów.
Sama struktura ja widać zajmuje więcej niż 8 bajtów.
Nawet gdyby nie trzeba było rozbijać na paczki to i tak nie wiem jak się zabrać do wysłania tego jako całość(struktura).
Z wew. EEPROM było łatwo dzięki specjalnej funkcji do tego celu przeznaczonej.

Autor:  xentis [ 8 kwi 2018, o 19:24 ]
Tytuł:  Re: Struktura do EEPROM po I2C

A co to za różnica czy to struktura, czy tablica czy co innego? Struktura ma ciągły obszar pamięci więc do funkcji I2C_write_buf przekazujesz początkowy adres pamięci od którego zaczyna się ciało struktury, oraz jej rozmiar w bajtach. Funkcja przerzuci strukturę bajt po bajcie. Oczywiście tu już nie ma czegoś takiego że owa struktura będzie widziana jako nazwa struktury, a w niej poszczególne zmianne (bo i po co - przecież to tylko kopia ustawień), tylko tu już musisz znać konkretny zakres pamięci w jakich ona leży w zewnętrznym EEPROMie.
xedossfm napisał(a):
Wychodzi mi też, że nie da się zapisać na raz więcej niż 8 bajtów i większe ilości trzeba rozbijać dane na paczki po 8 bajtów.
I tak i nie. Wszystko zależy jak szybko potrzebujesz kopiować te dane (bo przecież to znowu nie jest ich aż tak dużo). W BB masz rozdział EEPROM - I2C i masz tam funkcję która potrafi zapisywać dowolnie długi bufor - poprostu zapis jest poprzez pojedynczy bajt i odczekanie czasu potrzebnego na wewnętrzne operacje kostki 24cXX co trwa zazwyczaj nie więcej niż 10ms (te nowsze wersje mają krótszy), następnie kolejny bajt i znów odczekanie - i tak aż do wyzerowania licznika ilości bajtów jakie chcesz przekopiować . Oczywiście istnieje jeszcze szybszy sposób czyli zapis stronicowy ( i tak, dla pamięci 24C01 akurat rozmiar strony to 8 bajtów) wtedy faktycznie trzeba zorganizować dane w 8 bajtowe paczki i po wysłaniu każdej odczekać czas potrzebny na wewnętrzne procesy zapisu pamięci (przy czym trzeba pamiętać że obszar pamięci jest podzielony na sztywno na strony, więc nie można sobie zapisać 8 bajtów jako stronę zaczynając od adresu np 4 bo w efekcie cztery ostatnie bajty wylądują w komórkach kolejno 0, 1 2 i 3; poprostu po zainicjalizowaniu zapisu stronicowego licznik adresu jest automatycznie inkrementowany ale tylko jego najmłodsze bajty które są wymagane do zaadresowania odpowiedniej liczby bajtów strony, więc jeśli zaczniemy nie od początku strony lub spróbujemy wysłać więcej danych niż mieści strona licznik adresu się zapętli i zacznie zapisywać od początku strony). Ale samo napisanie takiej funkcji (która wykorzystuje zapis stronicowy) jest bardzo proste.

xedossfm napisał(a):
Nawet gdyby nie trzeba było rozbijać na paczki to i tak nie wiem jak się zabrać do wysłania tego jako całość(struktura).
Funkcja I2C_write_buf z BB ma 4 parametry, pierwszy to adres sprzętowy pamięci, drugi to pierwsza komórka pamięci od której ma się zacząć zapis, trzecia to ile bajtów ma zostać wysłane więc dajesz sizeof(struktura), a ostatni parametr to wkaźnik na strukturę (inaczej adres pierwszego bajtu struktury) czyli pomocny będzie operator pobierania adresu &struktura.

Autor:  xedossfm [ 8 kwi 2018, o 21:48 ]
Tytuł:  Re: Struktura do EEPROM po I2C

Na razie osiągnąłem zapis dowolnej ilości danych bez dzielenia na paczki.
Po prostu trzeba przesyłać bajt po bajcie zwiększając adres docelowy jednocześnie.
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Żeby wysłać tablicę

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Ze strukturą nie przechodzi - &nazwa_struktury

Autor:  mirekk36 [ 8 kwi 2018, o 21:56 ]
Tytuł:  Re: Struktura do EEPROM po I2C

xedossfm napisał(a):
Ze strukturą nie przechodzi - &nazwa_struktury

A co oznacza to tajemnicze stwierdzenie "nie przechodzi" ?

Autor:  xedossfm [ 8 kwi 2018, o 22:13 ]
Tytuł:  Re: Struktura do EEPROM po I2C

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Autor:  mirekk36 [ 8 kwi 2018, o 22:38 ]
Tytuł:  Re: Struktura do EEPROM po I2C

ok a wiesz co to jest jawne rzutowanie w C ? ... wystarczy je tutaj zastosować ... jak masz typ wskaźnika dla bufora ? uint8_t * ... tak ? a zatem

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


i po zawodach

Autor:  xedossfm [ 9 kwi 2018, o 05:52 ]
Tytuł:  Re: Struktura do EEPROM po I2C

Witam. Nie pomyślałem o tym nawet a faktycznie to było to.
Teraz pozostaje transfer w drugą stronę ☺

Autor:  mirekk36 [ 9 kwi 2018, o 08:01 ]
Tytuł:  Re: Struktura do EEPROM po I2C

xedossfm napisał(a):
Teraz pozostaje transfer w drugą stronę

rozumiem, że bliźniacza funkcja

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


to jakiś problem ?

Autor:  xedossfm [ 9 kwi 2018, o 08:06 ]
Tytuł:  Re: Struktura do EEPROM po I2C

Myślę, że nie. Po pracy się tego czepię.

Autor:  xedossfm [ 9 kwi 2018, o 20:03 ]
Tytuł:  Re: Struktura do EEPROM po I2C

Działa.
Trzeba to uporządkować, może przyda się komuś kto polubił wygodę korzystania ze struktur a czepił takiego EEPROMu jak ja.
Zanim zapytałem tutaj to znalazłem "w świecie" tylko informacje, że po I2C będzie skomplikowane.

Mamy jakąś strukturę
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Do EEPROM typu 24c01 itp. które nie "inkrementują" adresu, serię bajtów najprościej zapisywać
w pętli bajt po bajcie inkrementując adres jednocześnie, trochę zmienioną Mirkową funkcją
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

używając jej tak:

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

zapis do struktury z EEPROM nie zmienioną funkcją TWI_read_buf()

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Autor:  mirekk36 [ 9 kwi 2018, o 20:08 ]
Tytuł:  Re: Struktura do EEPROM po I2C

xedossfm napisał(a):
Do EEPROM typu 24c01 itp. które nie "inkrementują" adresu, serię bajtów najprościej zapisywać
w pętli bajt po bajcie inkrementując adres jednocześnie, trochę zmienioną Mirkową funkcją

sorki ale muszę to powiedzieć - bo kolega straszliwe bzdurki tu wymyśla z tym mega kocim _delay_ms(1) - że niby trzeba modyfikować ... bo bzdurki nad bzdurami

bo wystarczy zapisywać paczkami danych (zgodnymi z wielkością strony w pamięci EEPROM do zapisu) i pomiędzy tym robić ew zwłokę czasową zgodną z notą PDF a potrzebną na zapis....

dodawanie _delay_ms(1) po każdym bajdzie to po prostu morderstwo programu i procka ;) to już prawie to samo co na piechotę linia po linii to programować. Dlatego polecam przemyśl to ... bo w nocie masz podaną wielkość strony do zapisu i czas na zapis

Autor:  xedossfm [ 9 kwi 2018, o 20:29 ]
Tytuł:  Re: Struktura do EEPROM po I2C

Nie wiem Jak to paczkować dlatego "na siłę" tak sobie poradziłem.

Autor:  mirekk36 [ 9 kwi 2018, o 20:40 ]
Tytuł:  Re: Struktura do EEPROM po I2C

xedossfm napisał(a):
Nie wiem Jak to paczkować

dlatego ci podpowiedziałem - sprawdź w PDF ile ma jedna strona do zapisu

Autor:  xentis [ 9 kwi 2018, o 20:51 ]
Tytuł:  Re: Struktura do EEPROM po I2C

Masz taki fajny operator modulo "%". I teraz weźmy tę pamięć 24c01. Ma ona stronę wielkości 8 bajtów. Adres od którego chcesz zapisywać poddajesz operacji modulo 8. W wyniku tej operacji dostajesz resztę z dzielenia przez 8 - czyli w tym przypadku już konkretny numer bajtu strony którą będziesz zapisywał (jeśli zapisujesz akurat od początku pamięci wynikiem modulo będzie 0 więc zapis będzie od początku strony równo 8 bajtów).
I teraz tworzysz drugą pętlę (wewnątrz tej pierwszej z funkcji TWI_write_buf), która będzie wysyłać bajt, inkrementować zmienną która przechowuje wynik modulo, oraz inkrementować adres pamięci, i co obieg będzie sprawdzać czy ta zmienna zrównała się z wielkością strony - jeśli się zrównała oznacza to że zapis osiągnął koniec strony, wówczas pętla jest przerywana, odczekujesz czas potrzebny na utrwalenie danych w EEPROMie, pierwsza pętla sprawdza czy są jeszcze do zapisania dane jeśli tak, operacja modulo jest powtarzana (tym razem jej wynik będzie 0 bo będziemy zapisywać kolejną stronę ale już od początku) i cała druga pętla jest powtarzana. Magia operatora "Miodulo" ;)

Autor:  xedossfm [ 9 kwi 2018, o 20:55 ]
Tytuł:  Re: Struktura do EEPROM po I2C

Cytuj:
PAGE WRITE: The AT24C01 is capable of a 4-byte page
write.

Autor:  xentis [ 9 kwi 2018, o 20:57 ]
Tytuł:  Re: Struktura do EEPROM po I2C

Nie wiem co Ty masz za notę:
Obrazek
Być może od bardzo starych wersji pamięci - a te to nawet potrafiły nie mieć pinu "Write protect" oraz nie mieć pinów konfiguracji adresu albo tylko jeden...

Autor:  xedossfm [ 9 kwi 2018, o 21:08 ]
Tytuł:  Re: Struktura do EEPROM po I2C

taką
Obrazek

ale wychodzi że jest to chyba 24C01A, bo jak pisałem na początku, da się zapisać 8bajtów na raz. Nie widać napisu na scalaku, po zerze jest kawałek jedynki tylko.

Autor:  xentis [ 9 kwi 2018, o 21:11 ]
Tytuł:  Re: Struktura do EEPROM po I2C

no to 24C01A na pewno już ma stronę 8-bajtową.

Autor:  xedossfm [ 10 kwi 2018, o 21:07 ]
Tytuł:  Re: Struktura do EEPROM po I2C

Witam ponownie.
Zostało mi jeszcze jedno pytanie.
Jak zrobić nie kocią przerwę miedzy stronami?

Autor:  xentis [ 10 kwi 2018, o 21:25 ]
Tytuł:  Re: Struktura do EEPROM po I2C

A konkretnie to co masz na myśli?

Autor:  xedossfm [ 10 kwi 2018, o 21:34 ]
Tytuł:  Re: Struktura do EEPROM po I2C

xentis napisał(a):
wówczas pętla jest przerywana, odczekujesz czas potrzebny na utrwalenie danych w EEPROMie

Autor:  mirekk36 [ 10 kwi 2018, o 21:37 ]
Tytuł:  Re: Struktura do EEPROM po I2C

_delay_ms() ?

Autor:  xedossfm [ 10 kwi 2018, o 21:45 ]
Tytuł:  Re: Struktura do EEPROM po I2C

W sumie można i kocie _delay_ms().
Działa przy 1ms przerwy miedzy 8 bajtowymi stronami. Bez tej przerwy zapisuje co drugą paczkę.

Autor:  mirekk36 [ 10 kwi 2018, o 21:47 ]
Tytuł:  Re: Struktura do EEPROM po I2C

xedossfm napisał(a):
Działa przy 1ms przerwy miedzy 8 bajtowymi stronami. Bez tej przerwy zapisuje co drugą paczkę.

ale ty piszesz - jakbyś zgadywał albo metodą prób i błędów dochodził do tego jakiej długości mają być te przerwy podczas gdy to jest konkretnie podany parametr w nocie PDF - więc po co zgadywać? badać itp ?

Autor:  xentis [ 10 kwi 2018, o 21:50 ]
Tytuł:  Re: Struktura do EEPROM po I2C

Rozumiem że nie podoba Ci się zatrzymywanie procka delayem na 10ms? Pytanie czy jest sens kombinować. Przecież zamierzasz tej funkcji używać do backupu danych do eeprom, więc chyba nie będzie ona często używana?
xedossfm napisał(a):
Działa przy 1ms przerwy miedzy 8 bajtowymi stronami. Bez tej przerwy zapisuje co drugą paczkę.
Nota dla pamięci 24C01A podaje czas zapisu 5ms (dla starszych kości nawet 10ms) więc skracanie tego czasu 5 - krotnie nie jest zbyt bezpieczne. Może i Ci teraz działa, ale też może się okazać że nie zawsze zadziała, bo przecież jest wyraźnie napisane że podczas wewnętrznych operacji zapisu pamięć nie odpowiada na żadne próby komunikacji.

Autor:  xedossfm [ 10 kwi 2018, o 22:03 ]
Tytuł:  Re: Struktura do EEPROM po I2C

mirekk36 napisał(a):
ale ty piszesz - jakbyś zgadywał albo metodą prób i błędów dochodził do tego jakiej długości mają być te przerwy

Zasugerowałem się czasem z noty starszego układu, czyli 10ms. Wcześniej dostałem "opieprz" za 8x1ms na 8 bajtów i te 10ms byłoby jeszcze gorsze.
Może i rzeczywiście te parę milisekund nic nie zmienia. Wszystko co precyzyjne wykonuje się w przerwaniach i czasochłonne wysyłanie po RS niczego nie zakłóca , więc i to nie będzie przeszkadzało.

Autor:  mirekk36 [ 11 kwi 2018, o 06:19 ]
Tytuł:  Re: Struktura do EEPROM po I2C

xedossfm napisał(a):
Wcześniej dostałem "opieprz" za 8x1ms na 8 bajtów

Co ty za bzdury opowiadasz - człowiek ci podpowiada - a ty tu o opieprzach jakichś

xedossfm napisał(a):
i te 10ms byłoby jeszcze gorsze.

Jeśli ty nie widzisz różnicy w oczekiwaniu 1ms po wysłaniu pojedynczego bajtu w stosunku do oczekiwania na prawidłowy zapis strony ... to coś mi się wydaje, że szkoda dalej mówić

xedossfm napisał(a):
Może i rzeczywiście te parę milisekund nic nie zmienia. Wszystko co precyzyjne wykonuje się w przerwaniach i czasochłonne wysyłanie po RS niczego nie zakłóca , więc i to nie będzie przeszkadzało.

O co chodzi w tym zdaniu? to już chyba tylko jeden autor raczy wiedzieć

Autor:  xedossfm [ 11 kwi 2018, o 06:59 ]
Tytuł:  Re: Struktura do EEPROM po I2C

Może kolega w pośpiechu nie zauważył, że słowo opieprz napisałem w cudzymslowiu.

Strona 1 z 2 Strefa czasowa: UTC + 1
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/