<?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=47&amp;t=16445&amp;mode" />

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2016-10-13T15:34:37+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=47&amp;t=16445&amp;mode</id>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2016-10-13T15:34:37+01:00</updated>
<published>2016-10-13T15:34:37+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16445&amp;p=171431#p171431</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16445&amp;p=171431#p171431"/>
<title type="html"><![CDATA[Re: Funkcja do odczytu z EEPROM z wyszukaniem końca tekstu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16445&amp;p=171431#p171431"><![CDATA[
<div class="quotetitle">Sparrow-hawk napisał(a):</div><div class="quotecontent"><br />chciałem jednak podkreślić, że są sytuacje, kiedy wykorzystanie pamięci EEPROM będzie bardziej korzystne, skoro już ją mamy.<br /></div><br />No oczywiście, z tym się trudno nie zgodzić - ot po prostu warto umieć dobrać sytuację do potrzeby albo potrzebę do sytuacji <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 13 paź 2016, o 15:34</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[micky]]></name></author>
<updated>2016-10-13T11:23:43+01:00</updated>
<published>2016-10-13T11:23:43+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16445&amp;p=171399#p171399</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16445&amp;p=171399#p171399"/>
<title type="html"><![CDATA[Re: Funkcja do odczytu z EEPROM z wyszukaniem końca tekstu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16445&amp;p=171399#p171399"><![CDATA[
Rzeczywiście - masz rację co do ilości zapisu, tylko że ja mam trochę inne doświadczenia ze stabilnością zapisu do Eeproma. Co ciekawe, to w Microchipie ilość cykli jest większa. <br /><br />Sent from my Mi-4c<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1546">micky</a> — 13 paź 2016, o 11:23</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Sparrow-hawk]]></name></author>
<updated>2016-10-13T11:15:15+01:00</updated>
<published>2016-10-13T11:15:15+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16445&amp;p=171398#p171398</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16445&amp;p=171398#p171398"/>
<title type="html"><![CDATA[Re: Funkcja do odczytu z EEPROM z wyszukaniem końca tekstu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16445&amp;p=171398#p171398"><![CDATA[
<div class="quotetitle">micky napisał(a):</div><div class="quotecontent"><br />Jak bedziesz często pisał do EEproma, to się w końcu wykrzaczy. Jak już musisz coś często zapisywać to wykorzystaj pamięć flash<br /></div>Więc odniosłem się do słowa <strong>często</strong> sugerując, że często -&gt; EEPROM, rzadko -&gt; Flash, pytanie ile dla kogo to jest często, a ile rzadko. I że moim zdaniem patrząc na notę katalogową szybciej wykrzaczy się flash, a nie EEPROM.<br /><br />Co do rozmiaru strony strony to pisałem przecież o tym, że optymalnie będzie gdy rozmiar danych będzie bliski rozmiarowi strony, a nie o tym, że nas to w jakiś sposób ogranicza. <br /><div class="quotetitle">mirekk36 napisał(a):</div><div class="quotecontent"><br />po tysiąckroć większa pewność ich utrzymania w ciągu życia projektu nawet w mało sprzyjających warunkach zewnętrznych<br /></div>Dlatego pisałem o temperaturze pokojowej <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";-)" title="Puszcza oko" /><br /><div class="quotetitle">mirekk36 napisał(a):</div><div class="quotecontent"><br />Nie kłócę się ani oczywiście nie przekonuję, że nagle warto w KAŻDYM przypadku stosować Flash zamiast EEPROM<br /></div>Ja też nie, chciałem jednak podkreślić, że są sytuacje, kiedy wykorzystanie pamięci EEPROM będzie bardziej korzystne, skoro już ją mamy.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=10614">Sparrow-hawk</a> — 13 paź 2016, o 11:15</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[iwi]]></name></author>
<updated>2016-10-13T10:21:22+01:00</updated>
<published>2016-10-13T10:21:22+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16445&amp;p=171397#p171397</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16445&amp;p=171397#p171397"/>
<title type="html"><![CDATA[Re: Funkcja do odczytu z EEPROM z wyszukaniem końca tekstu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16445&amp;p=171397#p171397"><![CDATA[
<div class="quotetitle">micky napisał(a):</div><div class="quotecontent"><br />Zamów sobie Yellowbooka<br /></div><br />Nie ma jeszcze w sklepie Yellowbooka <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1988">iwi</a> — 13 paź 2016, o 10:21</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2016-10-13T09:11:16+01:00</updated>
<published>2016-10-13T09:11:16+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16445&amp;p=171388#p171388</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16445&amp;p=171388#p171388"/>
<title type="html"><![CDATA[Re: Funkcja do odczytu z EEPROM z wyszukaniem końca tekstu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16445&amp;p=171388#p171388"><![CDATA[
<div class="quotetitle">Sparrow-hawk napisał(a):</div><div class="quotecontent"><br />No nie zgodzę się z tym, skoro nota katalogowa od np. Atmega88 twierdzi, że:<br /></div><br />Bo patrzysz tylko przez pryzmat jednej zależności a nigdy pewnie nie próbowałeś sposobu który opisuję w YB <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br />Co za znaczenie może mieć ilość cykli zapisu, jeśli ktoś w procku dokona ich hmm nie wiem może 500 a może i nawet 2500 razy w ciągu życia projektu ? <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> Oczywiście jeśli ktoś przewiduje tych zapisów np 50 tys w ciągu życia projektu no to wtedy oczywistym jest że warto zdecydowanie wybrać EEPROM, chociaż życzę powodzenia z takim przebiegiem <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> ... Warto czasem realnie spojrzeć po prostu na różne przypadki i potrzeby ....<br /><br /><div class="quotetitle">Sparrow-hawk napisał(a):</div><div class="quotecontent"><br />Po za tym w przypadku zapisu do FLASH musisz zapisać całą stronę, więc dobrze jest, kiedy ilość danych jest bliska rozmiarowi tej strony.<br /></div><br />I znowu - a co to za nakaz albo oograniczenie że ilość danych musi być bliska rozmiarowi strony ? <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> a kto mi zabroni zapisać 10 bajtów przy stronie o pojemności 128 bajtów ? <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> Albo co to za ograniczenie, że że trzeba zapisać całą stronę ? ... żadne <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" />  Tylko proszę nie podawaj mi argumentu, że szkoda pamięci Flash szczególnie gdy się używa procka w którym zostaje nam i tak mnóstwo wolnego miejsca w jakimś projekcie, który realizujemy.<br /><br />Nie kłócę się ani oczywiście nie przekonuję, że nagle warto w KAŻDYM przypadku stosować Flash zamiast EEPROM, zwracam uwagę na bardzo arcy-ciekawą wg mnie alternatywę, z której zresztą korzysta się także w większych np 32-bitowych prockach <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> bez żadnego tam &quot;ale&quot;<br /><br />No a niewątpliwą zaletą zapamiętania danych we Flash w stosunku do EEPROM jest wg mnie po tysiąckroć większa pewność ich utrzymania w ciągu życia projektu nawet w mało sprzyjających warunkach zewnętrznych. I tu jeśli chcesz to możemy się założyć o skrzynkę dobrego złocistego trunku <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 13 paź 2016, o 09:11</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Sparrow-hawk]]></name></author>
<updated>2016-10-13T07:23:37+01:00</updated>
<published>2016-10-13T07:23:37+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16445&amp;p=171385#p171385</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16445&amp;p=171385#p171385"/>
<title type="html"><![CDATA[Re: Funkcja do odczytu z EEPROM z wyszukaniem końca tekstu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16445&amp;p=171385#p171385"><![CDATA[
<div class="quotetitle">micky napisał(a):</div><div class="quotecontent"><br />Jak bedziesz często pisał do EEproma, to się w końcu wykrzaczy. Jak już musisz coś często zapisywać to wykorzystaj pamięć flash.<br /></div><br />No nie zgodzę się z tym, skoro nota katalogowa od np. Atmega88 twierdzi, że:<br /><div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"><br />- Write/Erase cycles: 10,000 Flash/100,000 EEPROM<br />- Data retention: 20 years at 85°C/100 years at 25°C<br /></div>EEPROM pozwala na 10 razy więcej cykli zapis/wyczyszczenie, a i działa znacznie dłużej w temperaturze pokojowej.<br /><br />Po za tym w przypadku zapisu do FLASH musisz zapisać całą stronę, więc dobrze jest, kiedy ilość danych jest bliska rozmiarowi tej strony.<br /><br /><div class="quotetitle">iwi napisał(a):</div><div class="quotecontent"><br />odczyt z eeproma chyba nie jest szkodliwy<br /></div>Nie jest <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";-)" title="Puszcza oko" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=10614">Sparrow-hawk</a> — 13 paź 2016, o 07:23</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[iwi]]></name></author>
<updated>2016-10-13T06:48:50+01:00</updated>
<published>2016-10-13T06:48:50+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16445&amp;p=171383#p171383</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16445&amp;p=171383#p171383"/>
<title type="html"><![CDATA[Re: Funkcja do odczytu z EEPROM z wyszukaniem końca tekstu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16445&amp;p=171383#p171383"><![CDATA[
Dziekuje.<br />1000razy zapis wytrzyma. w Eeprom chce przechowywac ustawienia zegara tj czas letni albo zimowy plus adresy ds18 b20. oraz jeszcze nazwy menu. odczyt z eeproma chyba nie jest szkodliwy<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1988">iwi</a> — 13 paź 2016, o 06:48</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[micky]]></name></author>
<updated>2016-10-12T23:28:58+01:00</updated>
<published>2016-10-12T23:28:58+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16445&amp;p=171375#p171375</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16445&amp;p=171375#p171375"/>
<title type="html"><![CDATA[Re: Funkcja do odczytu z EEPROM z wyszukaniem końca tekstu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16445&amp;p=171375#p171375"><![CDATA[
Jak bedziesz często pisał do EEproma, to się w końcu wykrzaczy. Jak już musisz coś często zapisywać to wykorzystaj pamięć flash. Zamów sobie Yellowbooka - Mirek w nim porusza ten sposób. Dużo bardziej trwały i wcale nie taki trudny do opanowania. <br /><br />Sent from my Mi-4c<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1546">micky</a> — 12 paź 2016, o 23:28</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Sparrow-hawk]]></name></author>
<updated>2016-10-12T14:29:58+01:00</updated>
<published>2016-10-12T14:29:58+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16445&amp;p=171307#p171307</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16445&amp;p=171307#p171307"/>
<title type="html"><![CDATA[Re: Funkcja do odczytu z EEPROM z wyszukaniem końca tekstu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16445&amp;p=171307#p171307"><![CDATA[
Może zacznę od końca, chociaż ja nie jestem biegły w takich wyjaśnieniach. <br /><br />Pamięć EEPROM, to pamięc, która służy głównie do przechowywania rzadko modyfikowanych zmiennych. Może służyć też do ochrony danych, np w przypadku braku zasilania. <br /><br />Pamięć EEPROM przeważnie, jeśli nie zawsze organizujemy w sposób stały. Czyli przechowujemy gdzieś w programie adresy i rozmiary wszystkich przechowywanych zmiennych. W przypadku stringów, wystarczą tylko adresy, ale na każdy taki string musisz zarezerwować sobie odpowiednią ilość miejsca). <br /><br />Zamiast korzystać ze wskaźników, można to zapisać w notacji tablicowej (wyszło nawet prościej):<br />[syntax=c]void eeprom_write_cstring(uint16_t eepromaddresspage, char data&#91;&#93;) {<br />  uint8_t i = 0;<br />  do {<br />    EEPROM.write(eepromaddresspage + i, data&#91;i&#93;);<br />  } while (data&#91;i++&#93; != '\0');<br />}<br /> <br />void eeprom_read_cstring(uint16_t eepromaddresspage, char data&#91;&#93;) {<br />  uint8_t i = 0;<br />  do {<br />    data&#91;i&#93; = EEPROM.read(eepromaddresspage + i);<br />  } while (data&#91;i++&#93; != '\0');<br />}[/syntax]<br /><div class="quotetitle">iwi napisał(a):</div><div class="quotecontent"><br />Pierwsze pytanie. Skoro napis_1 deklarujemy jako tablicę to dlaczego w funkcji podajesz * data.<br /></div>Ponieważ przekazując tablicę do funkcji, przekazujesz adres jej pierwszego elementu, czyli wskaźnik na pierwszy element.<br /><br /><div class="quotetitle">iwi napisał(a):</div><div class="quotecontent"><br />Drugie pytanie. Jak to się dzieje że przy funkcji zapisu inkrementuje się po zmiennej &quot;data&quot;.<br /></div>Inkrementuje wskaźnik, co oznacza, że poruszam się po kolejnych elementach przekazanej tablicy.<br /><br />[syntax=c]while (*data++ != '\0');[/syntax]Co do trzeciego pytania: To najpierw sprawdzany jest warunek, czy wskazywany obiekt jest różny od znaku '\0', a następnie inkrementowany jest wskaźnik i pętla jest kontynuowana lub nie w zależności od poprzedniego porównania.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=10614">Sparrow-hawk</a> — 12 paź 2016, o 14:29</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[iwi]]></name></author>
<updated>2016-10-12T13:37:28+01:00</updated>
<published>2016-10-12T13:37:28+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16445&amp;p=171303#p171303</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16445&amp;p=171303#p171303"/>
<title type="html"><![CDATA[Re: Funkcja do odczytu z EEPROM z wyszukaniem końca tekstu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16445&amp;p=171303#p171303"><![CDATA[
Dziękuję za wyjaśnienia.<br />Funkcje sprawdzałem przed skopiowaniem ich tutaj i działały. Jedyne co zapomniałem przekopiować to wielkość ILE_BAJTOW, ale to sobie każdy może wpisać ile potrzebuje.<br /><br />Twoje funkcje też działają, ale nie wiem dlaczego.<br />Pierwsze pytanie. Skoro napis_1 deklarujemy jako tablicę to dlaczego w funkcji podajesz * data.<br />Drugie pytanie. Jak to się dzieje że przy funkcji zapisu inkrementuje się po zmiennej &quot;data&quot;.<br />O ile zapis data[i] jest jasne że jeśli i się zmienia to przesuwa się po elementach o tyle u Ciebie jest po prostu wskaźnik na początek zmiennej. Powinno zapisać pierwszy znak do każdej komórki pamięci a zapisuje dobrze.<br />Trzecie pytanie petla do while<br />Jest warunek [syntax=c]while (*data++ != '\0');[/syntax]<br />Jak to rozumieć? Czy to działa tak.<br />Pierwsze wywołanie funkcji i sprawdzamy czy 'T' != '\0' jeśli tak to zostaje w pętli<br />Drugie wywołanie funkcji i sprawdzamy czy 'e' != '\0' jeśli tak to zostaje w pętli<br />Trzecie wywołanie funkcji i sprawdzamy czy 'n' != '\0' jeśli tak to zostaje w pętli itd. aż do <br />Ostatnie wywołanie funkcji i sprawdzamy czy '\0' != '\0' tutaj wychodzi z pętli.<br /><br />Czemu tego nie zapisać prościej [syntax=c]while (data&#91;i&#93; != '\0');[/syntax] Oczywiście to nie będzie działało tak dobrze jak Twoje rozwiązanie, ale nie rozumiem dlaczego.<br /><br />No i na koniec pytanie o organizację pamięci EEPROM.<br />Jak to rozwiązujecie sobie w programach.<br /><br />Powiedzmy, że zapisuję pierwszą zmienną do EEPROM. Potem wrzucam tą naszą napis_1 potem wrzucam jeszcze parę innych napisów.<br />Żeby obliczyć początek każdego zapisu to muszę zrobic sobie jakieś notatki, żeby przez przypadek czegoś nie nadpisać a co najgorsze, żeby &quot;ogon&quot; nie zjadł &quot;głowy&quot; pamięci. Czy to się tak robi ręcznie czy można to jakoś zautomatyzować.<br />Żeby było może jaśniej.<br />Funkcja Serial.print wypisuje nam jakiś napis, dając raz jeszcze funkcję Serial.print wypisuje nam w tej samej linii następny napis - czyli gdzieś jest zapisana informacja o tym gdzie się skończył poprzedni wpis. Czy jest taka sama funkcja w zapisie do EEPROMa. Czyli zapis do EEPROM podając tylko zmienną a początek sobie obliczy sam i dorzuci nam w drugiej zmiennej adres i trzeciej zmiennej wielkość.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1988">iwi</a> — 12 paź 2016, o 13:37</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Sparrow-hawk]]></name></author>
<updated>2016-10-12T12:24:20+01:00</updated>
<published>2016-10-12T12:24:20+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16445&amp;p=171299#p171299</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16445&amp;p=171299#p171299"/>
<title type="html"><![CDATA[Re: Funkcja do odczytu z EEPROM z wyszukaniem końca tekstu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16445&amp;p=171299#p171299"><![CDATA[
To co wstawiłeś tutaj, to sprawdzałeś w ogóle? Przecież te funkcje są bez sensu. CStringi, to chyba jeden z prostszych typów danych. <br /><br />To:<br />[syntax=c]data&#91;length&#93;='\0';  //Dodajemy dla pewności na koniec łańcucha znak NULL[/syntax] Zastanów się gdzie wstawiasz ten znak końca!<br /><br />Tu:<br />[syntax=c]#include &quot;EEPROM.h&quot;<br />#define ILE_BAJTOW<br />char data&#91;ILE_BAJTOW&#93;;[/syntax] Ile wynosi ILE_BAJTOW?<br /><br />Stosowanie sizeof() do cstringów? Żeby zapisywać puste bajty do pamięci. EEPROM, ma ograniczoną ilość cykli.<br /><br />Więc może spróbuj tak:<br />[syntax=c]#define SIZE 50<br /><br />char napis_1&#91;SIZE&#93; = &quot;Ten napis zapisujemy do pamieci EEPROM&quot;;<br />char napis_2&#91;SIZE&#93; = &quot;1234567890&quot;;<br /> <br />void eeprom_write_cstring(uint16_t eepromaddresspage, char *data) {<br />  uint8_t i = 0;<br />  do {<br />    EEPROM.write(eepromaddresspage + i, *data);<br />    ++i;<br />  } while (*data++ != '\0');<br />}<br /> <br />void eeprom_read_cstring(uint16_t eepromaddresspage, char *data) {<br />  uint8_t i = 0;<br />  do {<br />    *data = EEPROM.read(eepromaddresspage + i);<br />    ++i;<br />  } while (*data++ != '\0');<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=10614">Sparrow-hawk</a> — 12 paź 2016, o 12:24</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[iwi]]></name></author>
<updated>2016-10-12T12:05:55+01:00</updated>
<published>2016-10-12T12:05:55+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16445&amp;p=171298#p171298</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16445&amp;p=171298#p171298"/>
<title type="html"><![CDATA[Re: Funkcja do odczytu z EEPROM z wyszukaniem końca tekstu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16445&amp;p=171298#p171298"><![CDATA[
Dziękuję za pomoc.<br />Po wielu próbach odpuszczam sobie wyszukiwanie końca znaku stringa w EEPROM.<br />Ponieważ taka funkcja może się przydać też do innych celów niekoniecznie odczytu stringa ale np kilku bajtów to myślę że najoptymalniejsze rozwiązanie z podaniem długości do odczytu. Przynajmniej będziemy wiedzieć co odczytujemy <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br />I tak na gotowo Funkcja Zapisu i Odczytu<br />[syntax=c]void eeprom_write_bytes( uint16_t eepromaddressstart, char data&#91;&#93;, uint8_t length) {<br />uint8_t i=0;<br />    for ( i=0; i&lt;length; i++) {<br />      EEPROM.write(eepromaddressstart+i, data&#91;i&#93;);<br />    }<br />}<br /><br />void eeprom_read_bytes( uint16_t eepromaddressstart,char data&#91;&#93;, uint8_t length) {<br />    uint8_t i=0;<br />    for ( i=0; i&lt;length; i++) {<br />      data&#91;i&#93; = EEPROM.read(eepromaddressstart+i);<br />    }<br />      data&#91;length&#93;='\0';  //Dodajemy dla pewności na koniec łańcucha znak NULL<br />}[/syntax]<br />i teraz wywołanie może wyglądać tak dla stringa napis:<br />[syntax=c]eeprom_write_string(0,napis,sizeof(napis));[/syntax]<br />a odczyt przy zadeklarowanu wcześniej<br />[syntax=c]#include &quot;EEPROM.h&quot;<br />#define ILE_BAJTOW<br />char data&#91;ILE_BAJTOW&#93;;[/syntax]<br />[syntax=c]eeprom_read_string (0,data,ILE_BAJTOW);[/syntax]<br /><br />Próbowałem funkcję odczytu przerobić, żeby potem można było przypisywać zmienną np tak<br />napis2 = eeprom_read_bytes(address_start, length)<br />ale niestety to nie jest takie proste bo o ile w funkcji wszystko działało, ale po opuszczeniu funkcji wskaźnik do tej tablicy znikał.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1988">iwi</a> — 12 paź 2016, o 12:05</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[iwi]]></name></author>
<updated>2016-10-11T21:29:14+01:00</updated>
<published>2016-10-11T21:29:14+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16445&amp;p=171251#p171251</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16445&amp;p=171251#p171251"/>
<title type="html"><![CDATA[Re: Funkcja do odczytu z EEPROM z wyszukaniem końca tekstu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16445&amp;p=171251#p171251"><![CDATA[
<div class="quotetitle">andrews napisał(a):</div><div class="quotecontent"><br />Skoro wiesz lepiej...<br /></div><br />Nie wiem dlatego się pytam. Mówię tylko że w tym programie nie widziałem różnicy w tym zapisie. Program działa identycznie źle w obu przypadkach. Ale już teraz wiem dlaczego - ponieważ wpisywałem ten sam napis bez czyszczenia EEPROM.<br />Poprawny jest oczywiście zapis char napis[]=&quot;1234&quot;;<br /><br />Masz rację tez co do wielkości tablic. Tablica 2 nie może być mniejsza niż jeden.<br />Zastanawia mnie tylko dlaczego jeśli napis2 zadeklaruję w ten sposób<br />[syntax=c]char napis2&#91;50&#93;;[/syntax]<br />czy tez w taki sposób<br />[syntax=c]char napis2&#91;50&#93;=&quot;&quot;;[/syntax]<br />to po pierwszym obiegu pętli wychodzi z funkcji odczytawszy tylko pierwszą literę.<br /><br />Natomiast jeśli dam tak to działa poprawnie<br />[syntax=c]char napis2&#91;&#93;=&quot;Jesli ten tekst jest dluzszy niz tekst z tablicy &quot;napis&quot; to poprawnie odczyta EEPROM do ostatniego znaku&quot;;[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1988">iwi</a> — 11 paź 2016, o 21:29</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[andrews]]></name></author>
<updated>2016-10-11T19:19:40+01:00</updated>
<published>2016-10-11T19:19:40+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16445&amp;p=171230#p171230</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16445&amp;p=171230#p171230"/>
<title type="html"><![CDATA[Re: Funkcja do odczytu z EEPROM z wyszukaniem końca tekstu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16445&amp;p=171230#p171230"><![CDATA[
<div class="quotetitle">iwi napisał(a):</div><div class="quotecontent"><br />Co do tej inkrementacji w do...while to tak nie da rady w ogóle nie wychodzi z tej pętli.<br /></div><br />Ta pętla jest we funkcji do odczytu i będzie działać (&quot;wyjdzie z pętli&quot;) pod warunkiem, że ciąg znaków w EEPROM jest zakończony znakiem terminującym. Piszesz, że zapis jest poprawny, tylko jak to sprawdzasz, skoro odczyt nie działa poprawnie? Jesteś pewien, że Twoja funkcja <em>eeprom_write_string()</em> zapisuje poprawnie znak '\0' na końcu ciągu w EEPROM?<br /><br />Piszesz tak:<br /><div class="quotetitle">iwi napisał(a):</div><div class="quotecontent"><br />[syntax=c]char * napis = &quot;Ten napis zapisujemy do pamieci EEPROM&quot;;<br />char * napis2 = &quot;1234567890&quot;;<br />// a później<br />void setup() {<br /> eeprom_write_string(0,napis,sizeof(napis));<br />}<br />void loop() {<br />eeprom_read_string (0,napis2);<br />}[/syntax]<br /></div><br />Robisz tutaj dwa poważne błędy. Po pierwsze próbujesz skopiować tablicę o większym rozmiarze do tablicy o mniejszym rozmiarze (bez nadzoru nad przekroczeniem rozmiaru). Po drugie próbujesz pisać do tablicy zadeklarowanej poprzez wskaźnik (string literal), a tego się nie robi ani w C ani w C++.<br /><br /><div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"><br />Zamieniłem też deklaracje na char[] ale nic to nie zmienia<br /></div><br />Skoro wiesz lepiej...<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=14165">andrews</a> — 11 paź 2016, o 19:19</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[iwi]]></name></author>
<updated>2016-10-11T18:04:44+01:00</updated>
<published>2016-10-11T18:04:44+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16445&amp;p=171228#p171228</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16445&amp;p=171228#p171228"/>
<title type="html"><![CDATA[Re: Funkcja do odczytu z EEPROM z wyszukaniem końca tekstu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16445&amp;p=171228#p171228"><![CDATA[
Dzięki. Po prostu chciałem inkrementowac adresy wpisywane do Eeprom i sprawdzać kiedy się pamięć przepełnia ale widzę że tak nie da rady. <br /><br />Co do tej inkrementacji w do...while to tak nie da rady w ogóle nie wychodzi z tej pętli. <br />Zamieniłem też deklaracje na char[] ale nic to nie zmienia <br />Ale sprawdzałem też zamiast char* jako String w końcu to c++ i po takim zapisie już nie można podmienić zmiennej napis2. Ptzy char* napis2 bez problemu można wpisać nowe wartości <br /><br />Wysłane z mojego Redmi 3 przy użyciu Tapatalka<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1988">iwi</a> — 11 paź 2016, o 18:04</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[micky]]></name></author>
<updated>2016-10-11T11:14:48+01:00</updated>
<published>2016-10-11T11:14:48+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16445&amp;p=171201#p171201</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16445&amp;p=171201#p171201"/>
<title type="html"><![CDATA[Re: Funkcja do odczytu z EEPROM z wyszukaniem końca tekstu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16445&amp;p=171201#p171201"><![CDATA[
Nie wiem jak w Atmedze (obstawiam,ze podobnie), ale w zewnetrznych Epromach zapisze ci sie do adresu 88. W programatorach przy kostce o pojemnosci 128bajtow i odczycie jej jako 256 bajtowa dostaniesz dwa razy to samo.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1546">micky</a> — 11 paź 2016, o 11:14</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[andrews]]></name></author>
<updated>2016-10-11T09:51:49+01:00</updated>
<published>2016-10-11T09:51:49+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16445&amp;p=171197#p171197</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16445&amp;p=171197#p171197"/>
<title type="html"><![CDATA[Re: Funkcja do odczytu z EEPROM z wyszukaniem końca tekstu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16445&amp;p=171197#p171197"><![CDATA[
<div class="quotetitle">iwi napisał(a):</div><div class="quotecontent"><br />Tylko jak to obejść - jak dam inkrementację wcześniej to zacznie czytać od drugiej komórki<br /></div><br />Możesz spróbować np. tak:<br />[syntax=c]//<br />    do {<br />        string&#91;i&#93; = EEPROM.read(eepromaddresspage+i);<br />    } while (string&#91;i++&#93;!='\0');[/syntax]i myślę, że raczej niczego nie będziesz musiał dopisywać <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br /><div class="quotetitle">iwi napisał(a):</div><div class="quotecontent"><br />I jeszcze pytanie co do wielkości pamięci. dla uproszczenia - załóżmy że mamy Atmegę 8 z 512bajtowym EEPROM.<br />Czy jeśli zrobię zapis do adresu 600 to zapisze do komórki (600-512) czyli defakto do 88 komórki pamięci<br /></div><br />Nie wiem do czego potrzebna Ci ta informacja. Na pewno nie zapiszesz niczego do adresów większych od pojemności pamięci EEPROM zadeklarowanej przez producenta w dokumentacji <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" />, choćby dlatego, że rejestr adresowy pamięci EEPROM (EEAR) ma maskowane bity powyżej pojemności pamięci, więc cokolwiek byś tam spróbował wpisać, adresem będzie zawsze pozostałość z dzielenia Twojego adresu przez pojemność pamięci EEPROM.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=14165">andrews</a> — 11 paź 2016, o 09:51</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[iwi]]></name></author>
<updated>2016-10-11T09:01:48+01:00</updated>
<published>2016-10-11T09:01:48+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16445&amp;p=171195#p171195</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16445&amp;p=171195#p171195"/>
<title type="html"><![CDATA[Re: Funkcja do odczytu z EEPROM z wyszukaniem końca tekstu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16445&amp;p=171195#p171195"><![CDATA[
<div class="quotetitle">andrews napisał(a):</div><div class="quotecontent"><br />A tak w ogóle kompilator nie dawał Ci żadnych ostrzeżeń?<br /></div><br />Nie ma żadnych ostrzeżeń w środowisku Arduino 1.6.2<br /><br />Myślałem że nie ma różnicy między *napis a napis[]. Zresztą parę dni temu oglądałem poradnik C++ odc 8 o stringach gdzie jest pokazany ten zapis jako równoważny.<br />Niemniej obie wersje działają. Wyczytałem teraz że jeśli zapiszę<br />[syntax=c]char napis&#91;&#93; = &quot;Jakis napis&quot;;[/syntax] <br />to teraz oprócz odczytu mogę robić zapis i zmianę tego napisu na inny, a jak zapiszę<br />[syntax=c]char * napis = &quot;Jakis napis&quot;;[/syntax] to odczyt będzie działał, ale nie mogę tego napisu podmienić na inny.<br /><div class="quotetitle">andrews napisał(a):</div><div class="quotecontent"><br />inkrementacja i występuje przed sprawdzeniem warunku, więc w ten sposób raczej nie sprawdzisz ostatnio odczytanego znaku (co było, jak się domyślam, Twoim zamiarem).<br /></div><br />Tylko jak to obejść - jak dam inkrementację wcześniej to zacznie czytać od drugiej komórki, a tak jak jest to odczyta całego stringa bez znaku NULL - więc to mi wystarczy bo ten znak potem na końcu można dopisać. Tylko to tak teoretycznie bo muszę sprawdzić czy po zamianie na zmienną tablicową będzie to działać.<br /><br /><br />Co do tej funkcji ostatniej to na razie się nią nie zajmuję bo w sumie nie ma znaczenia czy będę ten napis odczytywał w sposób taki czy taki, ważne aby działało a na razie nie działa.<br /><br />I jeszcze pytanie co do wielkości pamięci. dla uproszczenia - załóżmy że mamy Atmegę 8 z 512bajtowym EEPROM.<br />Czy jeśli zrobię zapis do adresu 600 to zapisze do komórki (600-512) czyli defakto do 88 komórki pamięci<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1988">iwi</a> — 11 paź 2016, o 09:01</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[andrews]]></name></author>
<updated>2016-10-11T06:56:30+01:00</updated>
<published>2016-10-11T06:56:30+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16445&amp;p=171193#p171193</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16445&amp;p=171193#p171193"/>
<title type="html"><![CDATA[Re: Funkcja do odczytu z EEPROM z wyszukaniem końca tekstu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16445&amp;p=171193#p171193"><![CDATA[
Po pierwsze ciągi znaków deklaruje się jako:<br /><strong><em>char napis[] = &quot;Ten napis zapisujemy do pamieci EEPROM&quot;;</em></strong><br />i to zdecydowanie nie to samo co:<br /><strong><em>char * napis = &quot;Ten napis zapisujemy do pamieci EEPROM&quot;;</em></strong><br /><br />Po drugie w Twojej pętli:[syntax=c]do {<br />      string&#91;i&#93; = EEPROM.read(eepromaddresspage+i);<br />      i++;<br />      } while (string&#91;i&#93;!='\0');[/syntax] inkrementacja <strong><em>i</em></strong> występuje przed sprawdeniem waruknu, więc w ten sposób raczej nie sprawdzisz ostatnio odczytanego znaku (co było, jak się domyślam, Twoim zamiarem).<br /><br />Po trzecie w ostatniej funkcji:[syntax=c]char * eeprom_read_string( uint16_t eepromaddresspage) {<br />  char * string<br />  uint8_t i=0;<br />      do {<br />      string&#91;i&#93; = EEPROM.read(eepromaddresspage+i);<br />      i++;<br />      } while (string&#91;i&#93;!='\0');<br />    return string;<br />  }[/syntax]deklarujesz wewnątrz funkcji niezainicjowany wskaźnik do <strong><em>char</em></strong>, a później zapisujesz dane do lokalizacji, którą ten wskaźnik określa. Jak myślisz, gdzie te dane są zapisywane?<br /><br />A tak w ogóle kompilator nie dawał Ci żadnych ostrzeżeń?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=14165">andrews</a> — 11 paź 2016, o 06:56</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[iwi]]></name></author>
<updated>2016-10-11T14:55:09+01:00</updated>
<published>2016-10-10T23:47:11+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16445&amp;p=171186#p171186</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16445&amp;p=171186#p171186"/>
<title type="html"><![CDATA[Funkcja do odczytu z EEPROM z wyszukaniem końca tekstu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16445&amp;p=171186#p171186"><![CDATA[
Witajcie.<br />Napisałem funkcję do zapisu do EEPROM i odczytu z EEPROM.<br />Problem w tym, że nie mogę sobie poradzić z odczytem z EEPROMa aż do wystąpienia znaku '\0'<br /><br />[syntax=c]char * napis = &quot;Ten napis zapisujemy do pamieci EEPROM&quot;;<br />char * napis2 = &quot;1234567890&quot;;<br /><br />void eeprom_write_string( uint16_t eepromaddresspage, char * data, uint8_t length) {<br />    int i=0;<br />    for ( i = 0; i &lt; length; i++) {<br />      EEPROM.write(eepromaddresspage+i,data&#91;i&#93;);<br />    }<br />  }<br /><br />void eeprom_read_string( uint16_t eepromaddresspage, char * string) {<br />  uint8_t i=0;<br />      do {<br />      string&#91;i&#93; = EEPROM.read(eepromaddresspage+i);<br />      i++;<br />      } while (string&#91;i&#93;!='\0');<br />  }[/syntax]<br /><br />Mając takie funkcje można je wywołać np tak:w Setup zapis, a w LOOP odczyt<br />[syntax=c]void setup() {<br /> eeprom_write_string(0,napis,sizeof(napis));<br />}<br />void loop() {<br />eeprom_read_string (0,napis2);<br />}[/syntax]<br /><br />o ile zapis działa poprawnie to odczyt działa ale tylko dla pierwszych 10 znaków. Przecież funkcja do ... while najpierw wykonuje działania a potem sprawdza czy &quot;string[i]!='\0'&quot; jest NULL - tutaj wychodzi że jest inaczej.<br />Niestety zmieniając formułę na [syntax=c]while ((EEPROM.read(eepromaddresspage+i)!='\0')[/syntax] funkcja się zawiesza<br /><br />Tak docelowo to jeszcze inaczej zrobiłbym tą funkcję, ale po takiej zamianie w ogóle nie działa, a powinna zwrócić wskaźnik na początek łańcucha.<br />[syntax=c]char * eeprom_read_string( uint16_t eepromaddresspage) {<br />  char * string<br />  uint8_t i=0;<br />      do {<br />      string&#91;i&#93; = EEPROM.read(eepromaddresspage+i);<br />      i++;<br />      } while (string&#91;i&#93;!='\0');<br />    return string;<br />  }[/syntax]<br /><br />No i na koniec pytanie o Arduino MEGA2560. Ile to ma pamięci EEPROM? W nocie jest podane że tylko 4KB czyli 4096bajtów.<br />A próbując zapisać pod komórką 4097 zapisuje poprawnie, nawet pod adresem 5000000000 też zapisuje i odczytuje poprawnie.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1988">iwi</a> — 10 paź 2016, o 23:47</p><hr />
]]></content>
</entry>
</feed>