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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2015-05-03T09:06:58+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=11556&amp;mode</id>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2015-05-03T09:06:58+01:00</updated>
<published>2015-05-03T09:06:58+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11556&amp;p=128107#p128107</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11556&amp;p=128107#p128107"/>
<title type="html"><![CDATA[Re: Przepisywanie zmiennych pomiędzy strukturami]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11556&amp;p=128107#p128107"><![CDATA[
<div class="quotetitle">PROFOLIO napisał(a):</div><div class="quotecontent"><br />Nawet jeśli kompilator zwraca z tego powodu warninga ?<br /></div><br />Nie no jak warning to zdecydowanie wolałbym zrobić rzutowanie. Ale przecież przy tej funkcji nie masz warninga<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 3 maja 2015, o 09:06</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[PROFOLIO]]></name></author>
<updated>2015-05-03T09:00:31+01:00</updated>
<published>2015-05-03T09:00:31+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11556&amp;p=128106#p128106</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11556&amp;p=128106#p128106"/>
<title type="html"><![CDATA[Re: Przepisywanie zmiennych pomiędzy strukturami]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11556&amp;p=128106#p128106"><![CDATA[
Nawet jeśli kompilator zwraca z tego powodu warninga ?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=9661">PROFOLIO</a> — 3 maja 2015, o 09:00</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2015-05-02T22:00:39+01:00</updated>
<published>2015-05-02T22:00:39+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11556&amp;p=128090#p128090</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11556&amp;p=128090#p128090"/>
<title type="html"><![CDATA[Re: Przepisywanie zmiennych pomiędzy strukturami]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11556&amp;p=128090#p128090"><![CDATA[
<div class="quotetitle">mokrowski napisał(a):</div><div class="quotecontent"><br />(void *) nigdy nie będzie określony jako typ. Nawet na etapie wykonywania. To typ który ma być &quot;brakiem typu&quot;.<br /></div><br />No dokładnie, mi chodzi o to, że ten typ &quot;nieokreślony&quot; skoro już jest użyty dla argumentów tej funkcji to właśnie po to aby mogły one przyjąć dowolny typ gdy funkcję wywołujemy. Dlatego wydaje mi się, że nie ma sensu pisać w ten sposób<br /><br />[syntax=c]uint8_t buf&#91;10&#93;;<br /><br />eeprom_write_block( (const void*)&amp;buf, ...[/syntax]<br /><br />bo spokojnie można tak:<br /><br />[syntax=c]eeprom_write_block( &amp;buf, ...[/syntax]<br /><br />niezależnie jakiego typu będzie buf[].<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 2 maja 2015, o 22:00</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2015-05-02T14:47:45+01:00</updated>
<published>2015-05-02T14:47:45+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11556&amp;p=128076#p128076</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11556&amp;p=128076#p128076"/>
<title type="html"><![CDATA[Re: Przepisywanie zmiennych pomiędzy strukturami]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11556&amp;p=128076#p128076"><![CDATA[
<div class="quotetitle">PROFOLIO napisał(a):</div><div class="quotecontent"><br />jeśli stosuje książkowy zapis:<br /></div><br />Już któryś raz powtarzasz coś o książkowym zapisie - mógłbyś wyjaśnić w czym rzecz ? o jaki książkowy zapis chodzi albo z jakiej książki ? tak z ciekawości pytam<br /><br />Poza tym zwróć uwagę jakiego babola robisz w tym niby książkowym zapisie - pokażę to tak:<br /><br /><div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"><br />void readParamsFromEem( void ) {<br />        eeprom_read_block( &amp;param_ram, &amp;param_eem, sizeof(param_ram) );<br />}<br /> <br />void writeParamsToEem( void ) {<br />        eeprom_write_block( <strong><span style="color: #FF0000">param_ram</span></strong>, &amp;param_eem, sizeof(param_ram) );<br />}<br /> <br />void writeDefParamsToRam( void ) {<br />        memcpy_P( &amp;param_ram, &amp;param_def, sizeof(param_ram) );<br />}<br /></div><br /><br />Nie brakuje ci na oko przed tym argumentem pokazanym na czerwono operatora pozyskiwania adresu &amp; ??? ... bo to właśnie przez to masz ten błąd:<br /><div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"><br />passing argument 1 of '__eerd_block_m8' discards qualifiers from pointer target type<br /></div><br /><br />jeśli to poprawisz:<br /><br /><div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"><br />void readParamsFromEem( void ) {<br />        eeprom_read_block( &amp;param_ram, &amp;param_eem, sizeof(param_ram) );<br />}<br /> <br />void writeParamsToEem( void ) {<br />        eeprom_write_block( <span style="color: #408000"><strong>&amp;</strong>param_ram</span>, &amp;param_eem, sizeof(param_ram) );<br />}<br /> <br />void writeDefParamsToRam( void ) {<br />        memcpy_P( &amp;param_ram, &amp;param_def, sizeof(param_ram) );<br />}<br /></div><br /><br />to MUSI się dobrze skompilować<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 10 minutach ]</span></strong><br /><br /><div class="quotetitle">PROFOLIO napisał(a):</div><div class="quotecontent"><br />Warningi znikają, a wtedy funkcje nieweiel się różnią od tych które na wstępie zostały uznane za potworki  ... jedyna różnica to bezpośrednie odwołanie się do struktury param_ram bez pośrednictwa struktury tymczasowej T_PARAM temp.<br /></div><br />No ale może nie zrozumiałeś poprzedniej mojej wypowiedzi. Ta &quot;potworkowatość&quot; nie wynikała z tych rzutowań na niejawny typ wskaźnikowy<br /><br />(const void*)<br /><br />bo to jest normalne ale wolałbym tego nie używać jeśli nie trzeba - a jak widać - co pokazałem wyżej, nie trzeba<br /><br />tylko &quot;potworkowatość&quot; wynikała właśnie z tego powołania na stosie zmiennej automatycznej (lokalnej) strukturalnej i przekazaniem za pomocą return struktury przez wartość (a nie wskaźnik) co właśnie WPROST prowadziło cię dalej na manowce do zapisu typu<br /><br />[syntax=c]param_ram = param_temp;[/syntax]<br /><br />rozumiesz ?<br /><br />Zaś taki zapis:<br />[syntax=c](const void*)&amp;param_ram[/syntax]<br />jest jawnym rzutowaniem na nieokreślony typ wskaźnikowy void* .... i jeśli nie trzeba go stosować - to ze względu na dobrą praktykę programowania nie warto go używać bo zaciemnia obraz. Lepiej przyjrzyj się nagłówkowi tej funkcji <br /><br />[syntax=c]eeprom_write_block()[/syntax]<br /><br />proszę bardzo:<br /><br />[syntax=c]void eeprom_write_block( const void * __src, void * __dst,  size_t __n );[/syntax]<br /><br />widzisz ? już tu masz na poziomie argumentów typ wskaźnikowy void* .... wiesz dlaczego ? Ano dlatego żeby nie było warningów podczas przekazywania wskaźników różnych typów do tejże funkcji czyli zmienna np __src przed wywołaniem funkcji może być zarówno np typu char jak i uint8_t albo i uint16_t albo int i inne i za każdym razem nie będzie zgłoszenia warninga, ponieważ argumenty są typu void* czyli TYP argumentu określany jest na etapie wywołania funkcji w kodzie. Musisz troszkę jeszcze podczytać o typie void* ... albo obejrzeć zdaje się mój poradnik:<br /><br /><!-- m --><a class="postlink" href="http://mirekk36.blogspot.com/2012/12/wskazniki-struktury-callbacki-jazda-bez.html" >http://mirekk36.blogspot.com/2012/12/ws ... a-bez.html</a><!-- m --><br /><br />tam poruszam to ważne zagadnienie - o co chodzi z void* i kiedy ew warto/można czy powinno się użyć takiego rzutowania (void*)<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 2 maja 2015, o 14:47</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[PROFOLIO]]></name></author>
<updated>2015-05-02T12:32:30+01:00</updated>
<published>2015-05-02T12:32:30+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11556&amp;p=128071#p128071</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11556&amp;p=128071#p128071"/>
<title type="html"><![CDATA[Re: Przepisywanie zmiennych pomiędzy strukturami]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11556&amp;p=128071#p128071"><![CDATA[
użyłem tej funkcji i działa prawidłowo <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />Co ciekawe jeśli stosuje książkowy zapis:<br />[syntax=c]void readParamsFromEem( void ) {<br />eeprom_read_block( &amp;param_ram, &amp;param_eem, sizeof(param_ram) );<br />}<br /><br />void writeParamsToEem( void ) {<br />eeprom_write_block( param_ram, &amp;param_eem, sizeof(param_ram) );<br />}<br /><br />void writeDefParamsToRam( void ) {<br />memcpy_P( &amp;param_ram, &amp;param_def, sizeof(param_ram) );<br />}[/syntax]<br /><br />To otrzymuje takie warningi :<br /><br /><div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"><br />passing argument 1 of '__eerd_block_m8' discards qualifiers from pointer target type<br /></div><br /><br />gdy natomiast stosuje te zapisy dodatkowe które gdzieś wyszperałem (ale jeszcze nie bardzo rozumiem ich istotę działania)<br />[syntax=c]void readParamsFromEem( void ) {<br />eeprom_read_block( (void*)&amp;param_ram, (const void*)&amp;param_eem, sizeof(param_ram) );<br />}<br /><br />void writeParamsToEem( void ) {<br />eeprom_write_block( (const void*)&amp;param_ram, (void*)&amp;param_eem, sizeof(param_ram) );<br />}<br /><br />void writeDefParamsToRam( void ) {<br />memcpy_P( (void*)&amp;param_ram, (const void*)&amp;param_def, sizeof(param_ram) );<br />}[/syntax]<br /><br />Warningi znikają, a wtedy funkcje nieweiel się różnią od tych które na wstępie zostały uznane za potworki <img src="https://forum.atnel.pl/images/smilies/icon_razz.gif" alt=":P" title="Pokazuje język" /> ... jedyna różnica to bezpośrednie odwołanie się do struktury param_ram bez pośrednictwa struktury tymczasowej T_PARAM temp.<br /><br />Jeszcze raz dziękuje za pomoc.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=9661">PROFOLIO</a> — 2 maja 2015, o 12:32</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2015-05-02T11:44:16+01:00</updated>
<published>2015-05-02T11:44:16+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11556&amp;p=128063#p128063</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11556&amp;p=128063#p128063"/>
<title type="html"><![CDATA[Re: Przepisywanie zmiennych pomiędzy strukturami]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11556&amp;p=128063#p128063"><![CDATA[
<div class="quotetitle">PROFOLIO napisał(a):</div><div class="quotecontent"><br />pokombinuje i myślę że powinno działać lepiej<br /></div><br />Mówię na szybko będzie można użyć i łatwo funkcji memcpy() <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> — 2 maja 2015, o 11:44</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[PROFOLIO]]></name></author>
<updated>2015-05-02T10:13:31+01:00</updated>
<published>2015-05-02T10:13:31+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11556&amp;p=128044#p128044</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11556&amp;p=128044#p128044"/>
<title type="html"><![CDATA[Re: Przepisywanie zmiennych pomiędzy strukturami]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11556&amp;p=128044#p128044"><![CDATA[
A no właśnie to mi umknęło, pokombinuje i myślę że powinno działać lepiej.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=9661">PROFOLIO</a> — 2 maja 2015, o 10:13</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2015-05-01T22:26:03+01:00</updated>
<published>2015-05-01T22:26:03+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11556&amp;p=128027#p128027</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11556&amp;p=128027#p128027"/>
<title type="html"><![CDATA[Re: Przepisywanie zmiennych pomiędzy strukturami]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11556&amp;p=128027#p128027"><![CDATA[
<div class="quotetitle">PROFOLIO napisał(a):</div><div class="quotecontent"><br />już wklejałem ale wkleję jeszcze raz<br /></div><br />Sorki wcześniej umknął ten babol mojej uwadze.<br /><br /><div class="quotetitle">PROFOLIO napisał(a):</div><div class="quotecontent"><br />param_ram = param_def;<br /></div><br />No widzisz - sam doszedłeś do błędu. Oczywiście że tak nie można sobie kopiować struktur w C .<br /><br />Tak można robić ze zwykłymi zmiennymi, a nie ze złożonymi strukturalnymi .<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 2 minutach ]</span></strong><br /><br />możesz skopiować np za pomocą memcpy().<br /><br />To mniej więcej tak jakbyś chciał stringi obsługiwać w ten sposób w C<br /><br />[syntax=c]char tab&#91;&#93; = &quot;ala i as&quot;;<br />char buf&#91;100&#93;;<br /><br />buf = tab;[/syntax]<br /><br />Jak myślisz dlaczego tak nie można? i dlaczego są funkcje kopiujące zawartości stringów itp ?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 1 maja 2015, o 22:26</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[PROFOLIO]]></name></author>
<updated>2015-05-01T20:00:25+01:00</updated>
<published>2015-05-01T20:00:25+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11556&amp;p=128018#p128018</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11556&amp;p=128018#p128018"/>
<title type="html"><![CDATA[Re: Przepisywanie zmiennych pomiędzy strukturami]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11556&amp;p=128018#p128018"><![CDATA[
już wklejałem ale wkleję jeszcze raz:<br /><br />[syntax=c]typedef struct {<br />uint8_t eepromSet; //weryfikowana wartosc jaka psrawdzamy czy pamiec eeprom zostala uzupelniona z wartosci domyslnych<br />uint16_t selectedPulseWidth; //wartosc wybrana na impulsatorze<br />} T_PARAMS;<br /><br />T_PARAMS param_def PROGMEM = {1, 0};  // definicja domyslnych struktury we flash<br />T_PARAMS param_eem EEMEM;  // definicja struktury w eeprom<br />volatile T_PARAMS param_ram;  // definicja struktury w ram<br /><br />void readParamsFromEem( void );<br />void writeParamsToEem( void );<br /><br />int main(void)<br />{<br /><br />....<br /><br />readParamsFromEem();<br />if (param_ram.eepromSet==1) {<br />//if (param_ram.selectedPulseWidth&gt;pwmSteps) {<br />//param_ram.selectedPulseWidth=pwmSteps;<br />//writeParamsToEem();<br />//}<br />}<br />else {<br /><br />lcd_locate(0,0); lcd_str_P(PSTR(&quot;DEF&quot;));<br />lcd_locate(0,4); lcd_uint(param_def.eepromSet);lcd_str_P(PSTR(&quot;        &quot;));<br />lcd_locate(1,2); lcd_uint(param_def.selectedPulseWidth);lcd_str_P(PSTR(&quot;        &quot;));<br />_delay_ms(2000);<br /><br />param_ram = param_def;<br />//param_ram.eepromSet = param_def.eepromSet;<br />//param_ram.selectedPulseWidth = param_def.selectedPulseWidth;<br /><br />lcd_locate(0,0); lcd_str_P(PSTR(&quot;RAM&quot;));<br />lcd_locate(0,4); lcd_uint(param_ram.eepromSet);lcd_str_P(PSTR(&quot;        &quot;));<br />lcd_locate(1,2); lcd_uint(param_ram.selectedPulseWidth);lcd_str_P(PSTR(&quot;        &quot;));<br />_delay_ms(2000);<br /><br />writeParamsToEem();<br />}<br /><br /><br />      }<br /><br />void readParamsFromEem( void ) {<br />eeprom_read_block( &amp;param_ram, &amp;param_eem, sizeof(param_ram) );<br />}<br /><br />void writeParamsToEem( void ) {<br />eeprom_write_block( &amp;param_ram, &amp;param_eem, sizeof(param_ram) );<br />}[/syntax]<br /><br />fragment kodu z linijki od 27 do 30 wyswietla prawidłowe wartości domyślne ze struktury param_def i otrzymuje w wyniku tego prawidłowe wartości {1, 0} zdefiniowane one sa w linijce 6 kodu.<br /><br />natomiast po przypisaniu zmiennej param_def do param_ram w linijce 32 i wyświetleniu zawartości zmiennych w strukturze param_ram w linijkach 36 do 39 otrzymuje nie wiedzieć czemu wartości {0, 12288}<br /><br />jeśli przepisania zmiennych pomiędzy param_ram i param _def wykonuje po sztuce (dokładnie w taki sposób jaki pokazują to zakomentowane linijki 33 i 34) to zmienne w drugim kroku debuga zwraca prawidłowe wartości.<br /><br />dodam ze problem nie występuje jeśli w definicji struktury zamiast uint8_t zastosuje uint16_t dla pierwszej zmiennej (czyli wtedy gdy wszystkie zmienne w strukturze są tego samego typu) <br /><br />Co robie nie tak ? Czy zapis <br />[syntax=c]param_ram = param_def;[/syntax]<br />jest nieprawidłowy ?<br />Nie wydaje mi się że sytuacja gdzie zmienne w strukturze są różnych typów to sytuacje niedopuszczalne ? Ale z AVR'ami dopiero zaczynam więc mogę mieć w wielu miejscach spore braki :/<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=9661">PROFOLIO</a> — 1 maja 2015, o 20:00</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2015-05-01T18:58:16+01:00</updated>
<published>2015-05-01T18:58:16+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11556&amp;p=128009#p128009</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11556&amp;p=128009#p128009"/>
<title type="html"><![CDATA[Re: Przepisywanie zmiennych pomiędzy strukturami]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11556&amp;p=128009#p128009"><![CDATA[
<div class="quotetitle">PROFOLIO napisał(a):</div><div class="quotecontent"><br />parametry pobrane na starcie z eeprom (param_tmp) są następujące 255 i 65535 czyli prawidłowo.<br />parametry domyślne zapisywane do param_ram (param_def) wynoszą 1 i 0 czyli również prawidłowo.<br />natomiast odczyt wartości z param_ram zaraz po ich zapisie wynoszą nie wiedzieć czemu 0 i 12288.<br /></div><br /><br />No skoro masz LCD do dyspozycji to jest o wiele łatwiej szukać babolka, pokaż ten fragment po którym rzekomo &quot;same&quot; się zmieniają wartości. Poza tym sam sobie też wyświetl na LCD wartość przed i wartość po.<br /><br />Wklej później ten fragment kodu tutaj<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 1 maja 2015, o 18:58</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[PROFOLIO]]></name></author>
<updated>2015-05-01T18:52:05+01:00</updated>
<published>2015-05-01T18:52:05+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11556&amp;p=128006#p128006</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11556&amp;p=128006#p128006"/>
<title type="html"><![CDATA[Re: Przepisywanie zmiennych pomiędzy strukturami]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11556&amp;p=128006#p128006"><![CDATA[
Nie wiem jak to prościej wyjaśnić, ale nie rozumiem dlaczego gdy w strukturze mam zmienne różnych typów i operuje na grupie wartości tego i samego typu (T_PARAMS) to po zapisie wartości param_def = {1,0} do param_ram i natychmiastowym odczytaniu wartości z param_ram mam zamiast wartości {1,0} mam {1,12288} <img src="https://forum.atnel.pl/images/smilies/icon_neutral.gif" alt=":|" title="Średnio zadowolony" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=9661">PROFOLIO</a> — 1 maja 2015, o 18:52</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2015-05-01T15:16:16+01:00</updated>
<published>2015-05-01T15:16:16+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11556&amp;p=127972#p127972</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11556&amp;p=127972#p127972"/>
<title type="html"><![CDATA[Re: Przepisywanie zmiennych pomiędzy strukturami]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11556&amp;p=127972#p127972"><![CDATA[
<div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"><br />z debuga otrzymuje infomracje że zapisuje wartości domyślne 1 i 0 ale po zapisie ich do ram (nawet jeszcze zanim zapiszuje je do eemem - co wynika z kodu) kolejny debug podaje mi ze w do ram nie zapisano 1 i 0 a 0 i 12288.<br /></div><br />Ja nie rozumiem o co tu chodzi <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 1 maja 2015, o 15:16</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[PROFOLIO]]></name></author>
<updated>2015-05-01T15:11:04+01:00</updated>
<published>2015-05-01T15:11:04+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11556&amp;p=127971#p127971</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11556&amp;p=127971#p127971"/>
<title type="html"><![CDATA[Re: Przepisywanie zmiennych pomiędzy strukturami]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11556&amp;p=127971#p127971"><![CDATA[
faktycznie dane z pamięci eeprom można przekazać bezpośrednio do zmiennej param_temp oszczedzając parę bajtów pamięci ram, ale by zyskać na czytelności kodu wyżej postanowiłem zostawić jeszcze jedna tymczasową wartość tak by w kodzie zwrot danych był wykonany w sposób jawny.<br />Niemniej mimo że wykorzystywany jest do odczytu &quot;potworek&quot; to ten fragment kodu działał bez zarzutu.<br /><br />Moje pytanie dotyczyło fragmentu kodu który generalnie nie ma później już nic wspólnego z odczytem i zapisem w pamięci EEPROM (bo problem pojawia się pomiędzy prawidłowym odczytem danych z eeprom a przed zapisem ich do pamięci).<br /><br />Na chwile obecną dokonałem zmiany swoich funkcji zapisu/odczytu do/z eem na &quot;książkowe&quot;<br /><br />[syntax=c]void readParamsFromEem( void ) {<br />eeprom_read_block( &amp;param_ram, &amp;param_eem, sizeof(param_ram) );<br />}<br /><br />void writeParamsToEem( void ) {<br />eeprom_write_block( &amp;param_ram, &amp;param_eem, sizeof(param_ram) );<br />}[/syntax]<br /><br />a wlasciwy fragment przywracający zmienne z eem wygląda tak:<br /><br />[syntax=c]//zapisanie zmiennych domyslnych do ram i reset i przelaczenie ich do wlasciwego zakresu jesli z jakiegosp owodu sa poza zakresem.<br />readParamsFromEem();<br />if (param_ram.eepromSet==1) {<br />if (param_ram.selectedPulseWidth&gt;pwmSteps) {<br />param_ram.selectedPulseWidth=pwmSteps;<br />writeParamsToEem();<br />}<br />}<br />else {<br /><br />lcd_locate(0,0); lcd_str_P(PSTR(&quot;DEF&quot;));<br />lcd_locate(0,4); lcd_uint(param_def.eepromSet);lcd_str_P(PSTR(&quot;        &quot;));<br />lcd_locate(1,2); lcd_uint(param_def.selectedPulseWidth);lcd_str_P(PSTR(&quot;        &quot;));<br />_delay_ms(2000);<br /><br />param_ram = param_def;<br /><br />lcd_locate(0,0); lcd_str_P(PSTR(&quot;RAM&quot;));<br />lcd_locate(0,4); lcd_uint(param_ram.eepromSet);lcd_str_P(PSTR(&quot;        &quot;));<br />lcd_locate(1,2); lcd_uint(param_ram.selectedPulseWidth);lcd_str_P(PSTR(&quot;        &quot;));<br />_delay_ms(2000);<br /><br />writeParamsToEem();<br />}[/syntax]<br /><br />oczywiście niezmiennie definicje:<br />[syntax=c]typedef struct {<br />uint8_t eepromSet; //weryfikowana wartosc jaka sprawdzamy czy pamiec eeprom zostala uzupelniona <br />uint16_t selectedPulseWidth; //wartosc wybrana na impulsatorze<br />} T_PARAMS;<br /><br /><br />T_PARAMS param_def PROGMEM = {1, 0};  // definicja domyslnych struktury we flash<br />T_PARAMS param_eem EEMEM;  // definicja struktury w eeprom<br />volatile T_PARAMS param_ram;  // definicja struktury w ram[/syntax]<br /><br />z debuga otrzymuje infomracje że zapisuje wartości domyślne 1 i 0 ale po zapisie ich do ram (nawet jeszcze zanim zapiszuje je do eemem - co wynika z kodu) kolejny debug podaje mi ze w do ram nie zapisano 1 i 0 a 0 i 12288.<br /><br />dodatkowo na książkowej metodzie otrzymuje obecnie warningi:<br /><br /><div class="codetitle"><b>Code:</b></div><div class="codecontent"><br />../main.c: In function 'readParamsFromEem':<br />../main.c:338: warning: passing argument 1 of '__eerd_block_m8' discards qualifiers from pointer target type<br />../main.c: In function 'writeParamsToEem':<br />../main.c:342: warning: passing argument 1 of '__eewr_block_m8' discards qualifiers from pointer target type<br /></div><br /><br />wskazują one odpowiednio na linijki:<br /><br />eeprom_read_block( &amp;param_ram, &amp;param_eem, sizeof(param_ram) );<br />oraz:<br />eeprom_write_block( &amp;param_ram, &amp;param_eem, sizeof(param_ram) );<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=9661">PROFOLIO</a> — 1 maja 2015, o 15:11</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2015-05-01T13:18:53+01:00</updated>
<published>2015-05-01T13:18:53+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11556&amp;p=127956#p127956</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11556&amp;p=127956#p127956"/>
<title type="html"><![CDATA[Re: Przepisywanie zmiennych pomiędzy strukturami]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11556&amp;p=127956#p127956"><![CDATA[
<div class="quotetitle">PROFOLIO napisał(a):</div><div class="quotecontent"><br />czyli jak mi się wydaje standardowy sposób zapisu i odczytu z i do eeprom.<br /></div><br />No niestety - tak jak zauważyłeś - &quot;wydaje&quot; ci się<br /><br />szczególnie to jest koszmarek <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" /><br /><br />[syntax=c]T_PARAMS ReadStructureFromEeprom(void)<br />        {<br />                T_PARAMS temp;<br />                eeprom_read_block((void*)&amp;temp, (const void*)&amp;param_eem, sizeof(T_PARAMS));<br />                return(temp);<br />        }[/syntax]<br /><br />Tak się nie robi, co to ma być return temp ? Przenosisz &quot;po stosie&quot; całe struktury może i tablice ? A w środku (o zgrozo ) jeszcze odwołanie się do zmiennej globalnej param_eem <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" /> - to można nazwać prawdziwym &quot;salto mortale&quot; i praktycznie pokazuje ten przykład jak NIE NALEŻY pisać funkcji.<br /><br />Zobacz można to było (zamiast tej twojej funkcji zrobić tak) <br /><br />[syntax=c]eeprom_read_block( &amp;param_temp, &amp;param_eem, sizeof(T_PARAMS) );[/syntax]<br /><br />i już byłoby dobrze, a ty powołujesz zmienną globalną param_temp, potem jeszcze w środku funkcji drugi raz temp (to samo) i jeszcze chcesz przekazywać rezultat (tą strukturę) przez wartość a nie przez wskaźnik .... <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" /><br /><br />jeśli funkcja to np:<br /><br />[syntax=c]void ReadStructureFromEeprom( T_PARAMS * tmp, T_PARAMS * eem ) {<br />        {<br />               <br />                eeprom_read_block( tmp, eem, sizeof(T_PARAMS) );<br />               <br />        }[/syntax]<br /><br />Tyle tylko - że to wychodzi takie troszkę masło maślane bo powtórzenie funkcji eeprom_read_block()<br /><br />No ale po wykonaniu jednej z tych dwóch wyżej podanych funkcji uzyskasz napełnienie swojej zmiennej globalnej param_temp danymi z eeprom<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 1 maja 2015, o 13:18</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[PROFOLIO]]></name></author>
<updated>2015-05-01T12:23:59+01:00</updated>
<published>2015-05-01T12:23:59+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11556&amp;p=127951#p127951</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11556&amp;p=127951#p127951"/>
<title type="html"><![CDATA[Re: Przepisywanie zmiennych pomiędzy strukturami]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11556&amp;p=127951#p127951"><![CDATA[
Tak czytałem to właśnie wczoraj łącznie z uważnym obejrzeniem filmu żeby sprawdzić czy czegoś nie przeoczyłem.<br /><br />Definicja tych funkcji jest następująca:<br /><br />[syntax=c]void WriteStructureToEeprom(T_PARAMS allparams)<br />{<br />eeprom_write_block((const void*)&amp;allparams, (void*)&amp;param_eem, sizeof(T_PARAMS));<br />}<br /><br />T_PARAMS ReadStructureFromEeprom(void)<br />{<br />T_PARAMS temp;<br />eeprom_read_block((void*)&amp;temp, (const void*)&amp;param_eem, sizeof(T_PARAMS));<br />return(temp);<br />}[/syntax]<br /><br />czyli jak mi się wydaje standardowy sposób zapisu i odczytu z i do eeprom.<br /><br />Jednak jak pisałem robiłem sobie debuga na wyświetlaczu LCD przed instrukcja:<br /><br />[syntax=c]param_ram = param_def;[/syntax]<br /><br />i stwietrdziłem że po podpięciu sobie takiego debuggera:<br /><br />[syntax=c]param_tmp = ReadStructureFromEeprom();<br /><br />if (param_tmp.eepromSet==1) {<br />param_ram = param_tmp;<br />//if (param_ram.selectedPulseWidth&gt;pwmSteps) {<br />//param_ram.selectedPulseWidth=pwmSteps;<br />//WriteStructureToEeprom(param_ram);<br />//}<br />}<br />else {<br /><br />lcd_locate(0,0); lcd_str_P(PSTR(&quot;TMP&quot;));<br />lcd_locate(0,4); lcd_uint(param_tmp.eepromSet);lcd_str_P(PSTR(&quot;        &quot;));<br />lcd_locate(1,2); lcd_uint(param_tmp.selectedPulseWidth);lcd_str_P(PSTR(&quot;        &quot;));<br />_delay_ms(2000);<br /><br />lcd_locate(0,0); lcd_str_P(PSTR(&quot;DEF&quot;));<br />lcd_locate(0,4); lcd_uint(param_def.eepromSet);lcd_str_P(PSTR(&quot;        &quot;));<br />lcd_locate(1,2); lcd_uint(param_def.selectedPulseWidth);lcd_str_P(PSTR(&quot;        &quot;));<br />_delay_ms(2000);<br /><br />param_ram = param_def;<br /><br />lcd_locate(0,0); lcd_str_P(PSTR(&quot;RAM&quot;));<br />lcd_locate(0,4); lcd_uint(param_ram.eepromSet);lcd_str_P(PSTR(&quot;        &quot;));<br />lcd_locate(1,2); lcd_uint(param_ram.selectedPulseWidth);lcd_str_P(PSTR(&quot;        &quot;));<br />_delay_ms(2000);<br /><br />//param_ram.eepromSet = param_def.eepromSet;<br />//param_ram.selectedPulseWidth = param_def.selectedPulseWidth;<br /><br />WriteStructureToEeprom(param_ram);<br />}[/syntax]<br /><br />parametry pobrane na starcie z eeprom (param_tmp) są następujące 255 i 65535 czyli prawidłowo.<br />parametry domyślne zapisywane do param_ram (param_def) wynoszą 1 i 0 czyli również prawidłowo.<br />natomiast odczyt wartości z param_ram zaraz po ich zapisie  wynoszą nie wiedzieć czemu 0 i 12288.<br /><br />definicja lcd_uint jest taka:<br /><br />[syntax=c]void lcd_uint(int val)<br />{<br />char bufor&#91;17&#93;;<br />lcd_str( utoa(val, bufor, 10) );<br />}[/syntax]<br /><br />i jest drobną modyfikacją funkcji lcd_int z Twojej biblioteki dołączonej do książki (jedyna różnica to zmiana sposobu konwersji zmiennej itoa() na utoa().<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=9661">PROFOLIO</a> — 1 maja 2015, o 12:23</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2015-05-01T12:07:38+01:00</updated>
<published>2015-05-01T12:07:38+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11556&amp;p=127949#p127949</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11556&amp;p=127949#p127949"/>
<title type="html"><![CDATA[Re: Przepisywanie zmiennych pomiędzy strukturami]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11556&amp;p=127949#p127949"><![CDATA[
A może wyjaśnij co to jest: ReadStructureFromEeprom()? u ciebie<br />bo ta konstrukcja <br /><br />param_tmp = ReadStructureFromEeprom();<br /><br />wygląda mega przedziwnie i to tu rodzą się pewnie same problemy. Przy okazji oglądałeś dokładnie to?<br /><!-- m --><a class="postlink" href="http://mirekk36.blogspot.com/2012/11/avr-eeprom-struktury-poradnik-do-ksiazek.html" >http://mirekk36.blogspot.com/2012/11/av ... iazek.html</a><!-- m --><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 1 maja 2015, o 12:07</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[PROFOLIO]]></name></author>
<updated>2015-05-01T10:39:09+01:00</updated>
<published>2015-05-01T10:39:09+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11556&amp;p=127936#p127936</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11556&amp;p=127936#p127936"/>
<title type="html"><![CDATA[Przepisywanie zmiennych pomiędzy strukturami]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11556&amp;p=127936#p127936"><![CDATA[
Ponieważ jest to mój pierwszy post tutaj witam wszystkich forumowiczów oraz Pana Mirka, dzięki któremu moja przygoda z mikrokontrolerami nabrała tempa.<br /><br />Piszę ponieważ borykam się z pewnym problemem i nie wiem jak sobie z nim poradzić, albo z czego on wynika.<br /><br />Otóż w programie mam zdefiniowaną banalną wręcz strukturę o takiej postaci:<br />[syntax=c]typedef struct {<br />uint8_t eepromSet; //weryfikowana wartosc jaka sprawdzamy czy pamiec eeprom zostala uzupelniona z wartosci domyslnych<br />uint16_t selectedPulseWidth; //wartosc wybrana na impulsatorze<br />} T_PARAMS;[/syntax]<br /><br />strukturę wykorzystuje ako formatkę do zapisywania danych w eeprom. Stąd takie definicje:<br />[syntax=c]T_PARAMS param_def PROGMEM = {1, 0};  // definicja domyslnych struktury we flash<br />T_PARAMS param_eem EEMEM;  // definicja struktury w eeprom<br />volatile T_PARAMS param_ram;  // definicja struktury w ram<br />T_PARAMS param_tmp;[/syntax]<br /><br />w momencie startu aplikacji dokonuje weryfikacji czy zawartość EEPPROm jest ustawiona i jeśli nie wczytuje wartości domyślne, dokonuje również weryfikacji poprawności zakresu <br />[syntax=c]param_tmp = ReadStructureFromEeprom();<br /><br />if (param_tmp.eepromSet==1) {<br />param_ram = param_tmp;<br />}<br />else {<br />param_ram = param_def;<br />WriteStructureToEeprom(param_ram);<br />}[/syntax]<br /><br />Po debugach jakie wykonałem, sam zapis danych ze struktury param_ram do pamięci EEPROM zachodzi prawidłowo.<br /><br />Problem jest natomiast z przepisaniem wartości param_ram = param_tmp;<br /><br />Niewiedzieć czemu gdy program wykryje, że pamięć eeprom nie jest ustawiona i dokonuje przypisania wartości domyślnych do zmiennych w ram (a później do eeprom) to struktura param_ram nie ma danych z param_temp tylko jakies z kosmosu.<br /><br />trochę eksperymentowałem i co ciekawe mogę ten problem wyeliminować na dwa sposoby, ale uważam je nie do końca za właściwe rozwiązanie, stad też mój post w tej sprawie.<br /><br />Pierwsze rozwiązanie to zastąpienie przypisania całkowitego struktury na takie cząstkowe, zmienna po zmiennej<br />[syntax=c]param_ram.eepromSet = param_def.eepromSet;<br />param_ram.selectedPulseWidth = param_def.selectedPulseWidth;[/syntax]<br /><br />ale wiadomo tracimy w ten sposób pełna elastyczność tego rozwiązania i gdy tyko dojdzie kolejną zmienną, to musimy ją w tym mechanizmie uwzględnić.<br /><br />Drugie rozwiązanie które w tym przypadku wyeliminowało problem to zamiana typu pierwszej zmiennej z uint8_t na uint_16t tak żeby wszystkie zmienne w strukturze miały ten sam typ:<br />[syntax=c]typedef struct {<br />uint16_t eepromSet; //weryfikowana wartosc jaka sprawdzamy czy pamiec eeprom zostala uzupelniona z wartosci domyslnych<br />uint16_t selectedPulseWidth; //wartosc wybrana na impulsatorze<br />} T_PARAMS;[/syntax]<br /><br />Ale oczywiście nie zawsze jest to możliwe do wykonania.<br /><br />Przypuszczam ze mechanizm miesza typy albo stosuje jakies dziwne rzutowanie przez co wartości w rejestrach są w jakiś nieprzewidywalny sposób mieszane ze sobą.<br /><br />Pytanie dlaczego?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=9661">PROFOLIO</a> — 1 maja 2015, o 10:39</p><hr />
]]></content>
</entry>
</feed>