Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 29 kwi 2026, o 21:05


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 4 ] 
Autor Wiadomość
PostNapisane: 13 mar 2015, o 23:36 
Offline
Użytkownik

Dołączył(a): 26 gru 2013
Posty: 62
Pomógł: 2

Witam,
Mam do Was pytanie, ponieważ nie do końca to rozumiem. Do obsługi pamięci EEPROM stosuje się kilka funkcji z biblioteki avr/eeprom.h:
eeprom_read/write/update_byte/word/block. I teraz posiadam dane, które chcę kolejno zapisywać, więc stworzyłem sobie tablicę z adresami, których zakres przekracza wartość uint8_t, to znaczy dochodzą do 400. Z tego co wiem to każdy bajt zapisywany jest w osobnym adresie tj. od 0 do 1023. Kiedy chcę zapisać daną 1 bajtową do tablicy o adresie 2 bajtowym to muszę zastosować:
1) eeprom_write_byte((uint8_t*)addr, value);
2) eeprom_write_word((uint16_t*)addr, value);
Mam mętlik, ponieważ wydaje się, że w drugim przypadku wartość zapisze się w dwóch kolejnych adresach. Natomiast mi zależy, aby zapisać za pomocą zmiennych coś typu: eeprom_write_byte(400, 120);
Proszę o jakąś informację;)
Dzięki!
PS. Chciałbym jeszcze zapytać, jak to zinterpretuje uC:
eeprom_write_word((uint8_t*)(addr[i]+1))
Chcę przekazać jako adres wartość komórki addr[i] zwiększony o jeden.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 mar 2015, o 23:54 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 07 kwi 2013
Posty: 418
Lokalizacja: Rzeszów
Pomógł: 102

Ogólnie jeżeli czas zapisu nie jest szczególnie krytyczny to warto używać funkcji "eeprom_update_..." niż "eeprom_write_...". Przed zapisem sprawdza ona czy wartość ulega zmianie. Wobec czego można relatywnie zwiększyć żywotność pamięci EEPROM.

Oczywiście nie liczy się wielkość adresu, a danych zapisywanych do komórki pamięci. Jeżeli dane nie przekraczają wartości 255 wtedy można użyć wersji "byte". Jeżeli będą to dane 16-bitowe wtedy "word", w przeciwnym wypadku "block" (pomijając "dword" i "float").

jedfra6 napisał(a):
Natomiast mi zależy, aby zapisać za pomocą zmiennych coś typu: eeprom_write_byte(400, 120);

Lepiej używać atrybutu "EEMEM" w połączeniu ze zmiennymi, aniżeli posługiwać się bezpośrednimi adresami:

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

jedfra6 napisał(a):
PS. Chciałbym jeszcze zapytać, jak to zinterpretuje uC:
eeprom_write_word((uint8_t*)(addr[i]+1))
Chcę przekazać jako adres wartość komórki addr[i] zwiększony o jeden.

Brakuje drugiego argumentu/wartości (w końcu jest to funkcja "write"). Rzutowanie powinno być na typ "uint16_t*" (zapisywane jest słowo, a nie bajt).



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 mar 2015, o 00:01 
Offline
Użytkownik

Dołączył(a): 26 gru 2013
Posty: 62
Pomógł: 2

Co do update, to zauważ, że wymieniłem jako jeden ze sposobów, i tak jest, stosuje update, to raz;)
Dwa, właśnie mój problem polega na tym, że przy zapisie eeprom_update_byte((uint8_t*)addr,value) kiedy adres jest już większy od uint8_t, wtedy dostaje warninga, i prawdopodobnie adres jest obcinany.
W moim przypadku nie używam EEMEM. Mam po prostu tablicę addr[n] = {20,40,60,...} i w zależności od elementu, który zapisuję odwołuje się do addr[n] i addr[n]+1,addr[n]+2,... i z tego co widzę, działa. Niestety nie jestem pewny jak to w sumie działa w przypadku opisanym przeze mnie na początku tego postu. Jak powinien wyglądać zapis. Czy poprawne dla adresu większego od uint8_t ale zmiennej w zakresie uint8_t będzie zapis:
eeprom_update_byte = ((uint16_t *)addr, value)?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 mar 2015, o 00:35 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 07 kwi 2013
Posty: 418
Lokalizacja: Rzeszów
Pomógł: 102

jedfra6 napisał(a):
Do obsługi pamięci EEPROM stosuje się kilka funkcji
Wiem że je wymieniłeś, jednak nie napisałeś które stosujesz i w dalszej części postu używałeś "write", stad moja sugestia ;)

jedfra6 napisał(a):
Dwa, właśnie mój problem polega na tym, że przy zapisie eeprom_update_byte((uint8_t*)addr,value) kiedy adres jest już większy od uint8_t, wtedy dostaje warninga, i prawdopodobnie adres jest obcinany.
W przypadku wskaźników nie ma mowy o żadnym obcinaniu (w AVR są one 16-bitowe). "uint8_t" to nie jest typ adresu, bo on może być ogromny... To jest informacja że ten wskaźnik wskazuje na jedno-bajtowe miejsce w pamięci.

Cóż to za "warning"? Z niedowierzania aż u siebie sprawdziłem i żadnych ostrzeżeń nie otrzymuję...

Proponuję się bliżej przyjrzeć wskaźnikom poprzez niebieską książkę Mirka, albo http://helion.pl/ksiazki/wskazniki-w-je ... wskazc.htm

jedfra6 napisał(a):
W moim przypadku nie używam EEMEM. Mam po prostu tablicę addr[n] = {20,40,60,...} i w zależności od elementu, który zapisuję odwołuje się do addr[n] i addr[n]+1,addr[n]+2,...
Użycie tablicy wcale nie wyklucza "EEMEM":

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


jedfra6 napisał(a):
Czy poprawne dla adresu większego od uint8_t ale zmiennej w zakresie uint8_t będzie zapis:
eeprom_update_byte = ((uint16_t *)addr, value)?
Absolutnie nie. Wystąpi konflikt typów (http://www.nongnu.org/avr-libc/user-man ... d4b3e51991).



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 4 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 4 gości


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
cron
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO