<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pl-pl">
<link rel="self" type="application/atom+xml" href="https://forum.atnel.pl/feed.php?f=4&amp;t=11046&amp;mode" />

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2015-03-14T00:35:37+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=11046&amp;mode</id>
<entry>
<author><name><![CDATA[atmel]]></name></author>
<updated>2015-03-14T00:35:37+01:00</updated>
<published>2015-03-14T00:35:37+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11046&amp;p=123427#p123427</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11046&amp;p=123427#p123427"/>
<title type="html"><![CDATA[Re: Atmega328p - eeprom - adresacja]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11046&amp;p=123427#p123427"><![CDATA[
<div class="quotetitle">jedfra6 napisał(a):</div><div class="quotecontent"><br />Do obsługi pamięci EEPROM stosuje się kilka funkcji<br /></div>Wiem że je wymieniłeś, jednak nie napisałeś które stosujesz i w dalszej części postu używałeś &quot;write&quot;, stad moja sugestia <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br /><div class="quotetitle">jedfra6 napisał(a):</div><div class="quotecontent"><br />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.<br /></div>W przypadku wskaźników nie ma mowy o żadnym obcinaniu (w AVR są one 16-bitowe). &quot;uint8_t&quot; 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.<br /><br />Cóż to za &quot;warning&quot;? Z niedowierzania aż u siebie sprawdziłem i żadnych ostrzeżeń nie otrzymuję...<br /><br />Proponuję się bliżej przyjrzeć wskaźnikom poprzez niebieską książkę Mirka, albo <!-- m --><a class="postlink" href="http://helion.pl/ksiazki/wskazniki-w-jezyku-c-przewodnik-richard-reese,wskazc.htm" >http://helion.pl/ksiazki/wskazniki-w-je ... wskazc.htm</a><!-- m --><br /><br /><div class="quotetitle">jedfra6 napisał(a):</div><div class="quotecontent"><br />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,...<br /></div>Użycie tablicy wcale nie wyklucza &quot;EEMEM&quot;:<br /><br />[syntax=c]uint8_t addr&#91;n&#93; EEMEM = {20,40,60,...}   // Brak bezpośredniej manipulacji na adresach w EEPROM. Tutaj znajdują się konkretne wartości umieszczane w pamięci &lt; 256<br />...<br />eeprom_update_byte(addr + 1, 45); // Można też: &amp;addr&#91;1&#93;[/syntax]<br /><br /><div class="quotetitle">jedfra6 napisał(a):</div><div class="quotecontent"><br />Czy poprawne dla adresu większego od uint8_t ale zmiennej w zakresie uint8_t będzie zapis:<br />eeprom_update_byte = ((uint16_t *)addr, value)?<br /></div>Absolutnie nie. Wystąpi konflikt typów (<!-- m --><a class="postlink" href="http://www.nongnu.org/avr-libc/user-manual/group__avr__eeprom.html#ga63aee2719099e8435e8584d4b3e51991" >http://www.nongnu.org/avr-libc/user-man ... d4b3e51991</a><!-- m -->).<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1183">atmel</a> — 14 mar 2015, o 00:35</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[jedfra6]]></name></author>
<updated>2015-03-14T00:01:27+01:00</updated>
<published>2015-03-14T00:01:27+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11046&amp;p=123424#p123424</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11046&amp;p=123424#p123424"/>
<title type="html"><![CDATA[Re: Atmega328p - eeprom - adresacja]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11046&amp;p=123424#p123424"><![CDATA[
Co do update, to zauważ, że wymieniłem jako jeden ze sposobów, i tak jest, stosuje update, to raz;)<br />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. <br />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:<br />eeprom_update_byte = ((uint16_t *)addr, value)?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2291">jedfra6</a> — 14 mar 2015, o 00:01</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[atmel]]></name></author>
<updated>2015-03-13T23:54:56+01:00</updated>
<published>2015-03-13T23:54:56+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11046&amp;p=123423#p123423</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11046&amp;p=123423#p123423"/>
<title type="html"><![CDATA[Re: Atmega328p - eeprom - adresacja]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11046&amp;p=123423#p123423"><![CDATA[
Ogólnie jeżeli czas zapisu nie jest szczególnie krytyczny to warto używać funkcji &quot;eeprom_update_...&quot; niż &quot;eeprom_write_...&quot;. Przed zapisem sprawdza ona czy wartość ulega zmianie. Wobec czego można relatywnie zwiększyć żywotność pamięci EEPROM.<br /><br />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 &quot;byte&quot;. Jeżeli będą to dane 16-bitowe wtedy &quot;word&quot;, w przeciwnym wypadku &quot;block&quot; (pomijając &quot;dword&quot; i &quot;float&quot;).<br /><br /><div class="quotetitle">jedfra6 napisał(a):</div><div class="quotecontent"><br />Natomiast mi zależy, aby zapisać za pomocą zmiennych coś typu: eeprom_write_byte(400, 120);<br /></div><br />Lepiej używać atrybutu &quot;EEMEM&quot; w połączeniu ze zmiennymi, aniżeli posługiwać się bezpośrednimi adresami:<br /><br />[syntax=c]uint8_t Zmienna EEMEM;<br />...<br />eeprom_write_byte(&amp;Zmienna, 120);[/syntax]<br /><div class="quotetitle">jedfra6 napisał(a):</div><div class="quotecontent"><br />PS. Chciałbym jeszcze zapytać, jak to zinterpretuje uC:<br />eeprom_write_word((uint8_t*)(addr[i]+1))<br />Chcę przekazać jako adres wartość komórki addr[i] zwiększony o jeden.<br /></div><br />Brakuje drugiego argumentu/wartości (w końcu jest to funkcja &quot;write&quot;). Rzutowanie powinno być na typ &quot;uint16_t*&quot; (zapisywane jest słowo, a nie bajt).<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1183">atmel</a> — 13 mar 2015, o 23:54</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[jedfra6]]></name></author>
<updated>2015-03-13T23:36:11+01:00</updated>
<published>2015-03-13T23:36:11+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11046&amp;p=123421#p123421</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11046&amp;p=123421#p123421"/>
<title type="html"><![CDATA[Atmega328p - eeprom - adresacja]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11046&amp;p=123421#p123421"><![CDATA[
Witam,<br />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:<br />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ć:<br />1) eeprom_write_byte((uint8_t*)addr, value); <br />2) eeprom_write_word((uint16_t*)addr, value);<br />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); <br />Proszę o jakąś informację;)<br />Dzięki!<br />PS. Chciałbym jeszcze zapytać, jak to zinterpretuje uC:<br />eeprom_write_word((uint8_t*)(addr[i]+1))<br />Chcę przekazać jako adres wartość komórki addr[i] zwiększony o jeden.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2291">jedfra6</a> — 13 mar 2015, o 23:36</p><hr />
]]></content>
</entry>
</feed>