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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2016-04-27T10:40:14+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=50&amp;t=15194&amp;mode</id>
<entry>
<author><name><![CDATA[skiero]]></name></author>
<updated>2016-04-27T10:40:14+01:00</updated>
<published>2016-04-27T10:40:14+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=15194&amp;p=159445#p159445</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=15194&amp;p=159445#p159445"/>
<title type="html"><![CDATA[Re: Amperomierz na ADC]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=15194&amp;p=159445#p159445"><![CDATA[
Mówiąc, że przeliczę sobie jeszcze, miałem  na myśli, że prześledzę jak zmienia się rejestr ADMUX w programie, żeby znaleźć moment w którym się przestaje zgadzać.<br /><br /><div class="quotetitle">Sparrow-hawk napisał(a):</div><div class="quotecontent"><br />I jeszcze taka uwaga:<br /><div class="quotetitle"><b>Quote:</b></div><div class="quotecontent">Note:<br />1.   The differential input channels are not tested for devices in PDIP Package. This feature is only <br />guaranteed to work for devices in TQFP and QFN/MLF Packages.<br /></div></div><br />Tak wiem o tym, mam Atmegi32 w TQFP, ale na płytce prototypowej ciężko jest ją umieścić <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> chciałem jeszcze przećwiczyć zanim zrobię odpowiednią płytkę w Eaglu.<br /><br />Sarrow-hawk - dziękuję za pomoc.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=10505">skiero</a> — 27 kwi 2016, o 10:40</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Sparrow-hawk]]></name></author>
<updated>2016-04-27T07:37:11+01:00</updated>
<published>2016-04-27T07:37:11+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=15194&amp;p=159433#p159433</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=15194&amp;p=159433#p159433"/>
<title type="html"><![CDATA[Re: Amperomierz na ADC]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=15194&amp;p=159433#p159433"><![CDATA[
A co tu chcesz przeliczać? W tym przypadku należy wyzerować 5 najmniej znaczących bitów rejestru ADMUX, a następnie dodać logicznie numer kanału.<br />[syntax=c]ADMUX &amp;= 0xE0; //0b11100000;<br />ADMUX |= channel;[/syntax]<br />I jeszcze taka uwaga:<br /><div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"><br />Note:<br />1.   The differential input channels are not tested for devices in PDIP Package. This feature is only <br />guaranteed to work for devices in TQFP and QFN/MLF Packages.<br /></div><br />Polecam również obejrzeć: <a href="http://mirekk36.blogspot.com/2014/03/maskowanie-bajtow-z-przymruzeniem-oka.html"  class="postlink">http://mirekk36.blogspot.com/2014/03/maskowanie-bajtow-z-przymruzeniem-oka.html</a><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=10614">Sparrow-hawk</a> — 27 kwi 2016, o 07:37</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[skiero]]></name></author>
<updated>2016-04-26T22:44:45+01:00</updated>
<published>2016-04-26T22:44:45+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=15194&amp;p=159420#p159420</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=15194&amp;p=159420#p159420"/>
<title type="html"><![CDATA[Re: Amperomierz na ADC]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=15194&amp;p=159420#p159420"><![CDATA[
<div class="quotetitle">Sparrow-hawk napisał(a):</div><div class="quotecontent"><br />Jeżeli ustawiasz jakieś bity w rejestrze korzystając z zapisu: REG |= VALUE; to zadbaj też o wcześniejsze ich skasowanie.<br /><br />Dla przykładu:<br />[syntax=c]uint8_t val = 0;<br /><br />val |= 0xA5;<br />val |= 0x5A;[/syntax]<br />Jaką wartość będzie miała zmienna val?<br /><br />W obu funkcjach pomiar ustawiasz ADMUX, ale czy na pewno ma on taką wartość jakiej oczekujesz?<br /></div><br /><br />Odpowiedz:<br /><br />0xA5 = 1010 0101<br />0x5A = 0101 1010<br /><br />---|1010 0101<br />or-|0101 1010<br />----------------<br />---|1111 1111<br /><br />Teraz wpisałem na sztywno i rzeczywiście zaczęło działać:<br /><br />[syntax=cpp]uint32_t pomiar_i1()<br />{<br />ADMUX = 0b11001001;// Pomiar różnicowy na pinach ADC0 i ADC1, Wzmocnienie: x10 (ATmega32 - PA0 i PA1)<br />_delay_us( 250 );<br />ADCSRA |= (1&lt;&lt;ADSC);  // start konwersji<br />while( ADCSRA &amp; (1&lt;&lt;ADSC) );<br />return ADCW;<br />}<br />uint16_t pomiar( uint8_t kanal ) {<br /><br />ADMUX = 0b11000010 | kanal;<br />_delay_us( 250 );<br />ADCSRA |= (1&lt;&lt;ADSC);  // start konwersji<br />while( ADCSRA &amp; (1&lt;&lt;ADSC) );<br />return ADCW;<br />}[/syntax]<br /><br />...więc problem leży w w &quot;orowaniu&quot;.<br />Niestety dziś nie miałem wystarczająco czasu, żeby wystarczająco zgłębić temat, jutro postaram się przeliczyć wszystko dokładniej.<br /><br />Niemniej dziękuję, za nakreślenie miejsca, gdzie jest problem <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=10505">skiero</a> — 26 kwi 2016, o 22:44</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Sparrow-hawk]]></name></author>
<updated>2016-04-26T07:19:52+01:00</updated>
<published>2016-04-26T07:19:52+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=15194&amp;p=159340#p159340</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=15194&amp;p=159340#p159340"/>
<title type="html"><![CDATA[Re: Amperomierz na ADC]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=15194&amp;p=159340#p159340"><![CDATA[
Jeżeli ustawiasz jakieś bity w rejestrze korzystając z zapisu: REG |= VALUE; to zadbaj też o wcześniejsze ich skasowanie.<br /><br />Dla przykładu:<br />[syntax=c]uint8_t val = 0;<br /><br />val |= 0xA5;<br />val |= 0x5A;[/syntax]<br />Jaką wartość będzie miała zmienna val?<br /><br />W obu funkcjach pomiar ustawiasz ADMUX, ale czy na pewno ma on taką wartość jakiej oczekujesz?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=10614">Sparrow-hawk</a> — 26 kwi 2016, o 07:19</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[skiero]]></name></author>
<updated>2016-04-25T20:00:29+01:00</updated>
<published>2016-04-25T20:00:29+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=15194&amp;p=159307#p159307</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=15194&amp;p=159307#p159307"/>
<title type="html"><![CDATA[Re: Amperomierz na ADC]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=15194&amp;p=159307#p159307"><![CDATA[
Dziękuję wszystkim za pomoc, amperomierz działa tak jak powinien.<br /><div class="quotetitle">anshar napisał(a):</div><div class="quotecontent"><br />Proponuję zatem zapoznać się z tym tematem: <br /><!-- m --><a class="postlink" href="http://atnel.pl/domyslna-promocja-do-typu-int.html" >http://atnel.pl/domyslna-promocja-do-typu-int.html</a><!-- m --><br /></div><br />Fantastyczna podpowiedź!<br /><br />Dodatkowo jeszcze poprawiłem funkcję &quot;int_to_str&quot;, teraz nazywa się &quot;ulint_to_str&quot; (w kodzie poniżej) i pobieranie wartość ADC ułożyłem w funkcję &quot;pomiar_i1&quot;.<br /><br /><span style="font-size: 150%; line-height: normal"><strong>Niestety</strong></span> podsycony sukcesem zacząłem dalej kombinować i chciałem dołożyć pomiar napięcia metodą jak z filmów o ADC Pana Mirka. Niestety w pomiary w jakiś sposób na siebie wpływają i gdy tylko funkcja &quot;pomiar()&quot; jest wstawiona w kod to pomiar prądu nagle przestaje mieć sens, co widać na zdjęciach. Na wyświetlaczu od górnego wiersze w prawo idąc jest kolejno wartość ADC, potem wartość zmiennej średnia i na dole już sama wartość prądu.<br /><br /><a href="https://obrazkiforum.atnel.pl/10505/a1ef29f74c3812b6ef5310a86def81e0.JPG"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/10505/a1ef29f74c3812b6ef5310a86def81e0.JPG" alt="Obrazek" /></a><a href="https://obrazkiforum.atnel.pl/10505/7fb409a1f6fc702a8220931465f2c6d2.JPG"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/10505/7fb409a1f6fc702a8220931465f2c6d2.JPG" alt="Obrazek" /></a><br /><br />a poniżej kod, w którym część odpowiedzialna za pomiar napięcia jest wykreskowana, ponieważ w takiej konfiguracji nie działa:<br /><br />[syntax=cpp]#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br />#include &lt;stdlib.h&gt;<br />#include &lt;util/delay.h&gt;<br /><br />#include &quot;LCD/lcd44780.h&quot;<br /><br />#define REF_256 (1&lt;&lt;REFS1)|(1&lt;&lt;REFS0)<br />#define REF_VCC (1&lt;&lt;REFS0)<br /><br />typedef struct {<br />uint16_t adc_mid;// uśredniona wartość ADC<br />uint16_t ref_adc;// środkowy zakres wartości ADC odpowiadającej zmierzonemu niżej napięciu<br />uint16_t ref_v;// środkowy zakres napięcia * 100 (czyli np dla 6,5V ---&gt; 650)<br />char v1&#91;3&#93;;<br />char v2&#91;3&#93;;<br />} TVOL;<br /><br />TVOL accu1_vol;<br /><br />char *ulint_to_str(unsigned long int val, char *str, int8_t fw, char znak_wiodacy);<br />uint32_t pomiar_i1();<br />uint16_t pomiar( uint8_t kanal );<br />void get_vol( uint16_t adc, TVOL * voltage );<br /><br />char liczba&#91;10&#93;;<br /><br />int main (void)<br />{<br /><br />lcd_init();<br /><br />ADCSRA |= (1&lt;&lt;ADEN); // włącz ADC<br />ADCSRA |= (1&lt;&lt;ADPS2)|(1&lt;&lt;ADPS1)|(1&lt;&lt;ADPS0); // preskaler = 128<br />ADMUX |= REF_256;// ustawiamy wewn. źr odn. 2,56V<br /><br />lcd_locate(0,0);<br />lcd_str(&quot;Test LCD&quot;);<br />_delay_ms( 500 );<br />lcd_cls();<br /><br />accu1_vol.ref_adc = 450;// zmierzona wartość ADC dla środkowego mierzonego napięcia<br />accu1_vol.ref_v = 225;<br /><br />uint32_t fil = 300;<br />uint32_t value = 0;<br />uint16_t czas = 60;<br />uint32_t srednia;<br />uint32_t wynik;<br />div_t divmod;<br />    uint32_t v1, v2;<br /><br />sei();<br />while(1)<br />{<br />value = pomiar_i1();<br /><br />if(value &lt; 5 || value &gt; 511) value = 0;<br /><br />srednia = srednia * fil;<br />srednia = srednia + (256 * value * 100)/(2 * 1024) * 1400; //Wartośc prądu pomnożona przez milion<br />srednia = srednia / ( fil + 1 );<br /><br />if(!czas)<br />{<br />lcd_locate(0, 0);<br />lcd_int(value);<br />lcd_str(&quot;  &quot;);<br /><br />lcd_locate(0, 4);<br />lcd_lint(srednia);<br />lcd_str(&quot;  &quot;);<br /><br />lcd_locate(1, 0);<br />lcd_str(&quot;I = &quot;);<br />v1 = srednia / 1000000;<br /><br />divmod = div(srednia / 10000, 100);//UWAGA, jeśli chcemy zmienic fw = 2 na inną liczbę trzeba też zmienic dzielenie w divmod.rem; jeśeli fw = 3, to divmod = div(srednia / 1000, 1000);<br />v2 = divmod.rem;<br />lcd_str( ulint_to_str(v1, liczba, 1, ' '));<br />lcd_char('.');<br />lcd_str( ulint_to_str(v2, liczba, 2, ' '));//UWAGA, jeśli chcemy zmienic fw = 2 na inną liczbę trzeba też zmienic dzielenie w divmod.rem; jeśeli fw = 3, to divmod = div(srednia / 1000, 1000);<br />lcd_str( &quot; A&quot;);<br /><br />_delay_ms(100);<br /><br />czas = 420;<br />} else<br />{<br />czas--;<br />_delay_ms(1);<br />}<br />//wynik = pomiar(PA2);<br />//<br />//get_vol( wynik, &amp;accu1_vol );<br />//<br />//lcd_locate(0,0);<br />//lcd_str(&quot;U = &quot;);<br />//lcd_str( accu1_vol.v1 );<br />//lcd_str(&quot;.&quot;);<br />//lcd_str( accu1_vol.v2 );<br />//lcd_str(&quot; V&quot;);<br />}<br /><br />}<br /><br />char *ulint_to_str(unsigned long int val, char *str, int8_t fw, char znak_wiodacy) {<br />char *strp = str;<br />uint8_t subzero = 0;<br /><br />if(val&lt;0) {// jeśli liczba jest ujemna<br />val = ~val+1;// zaneguj i koryguj<br />subzero=1;// ustaw znacznik na 1<br />fw--;<br />}<br /><br />   do{<br />      div_t divmod = div(val, 10);   // opracja dzielenia oraz modulo - wynik do struktury ldiv_t<br /><br />      if((val == 0) &amp;&amp; (strp != str)) {<br />         *strp++ = znak_wiodacy;<br />      } else {<br />         *strp++ = divmod.rem + '0';<br />      }<br /><br />      val = divmod.quot;            // wartość zmniejsza się o jednostki, dziesiątki, setki itd<br />      fw--;                     // zmniejszenie licznika szerokości formatowanego pola<br />      // wykonuj pętlę do momentu sprawdzenia ostatniej cyfry znaczącej lub zajętości całego pola<br />   } while ( (fw&gt;0)  );<br /><br />   if(subzero) *strp++ = '-';// jeśli była to liczba ujemna, wstaw znak minus<br />   *strp = 0;                     // zakończ łańcuch zerem<br /><br />   // w związku z tym, że w łańcuchu jest odwrócona kolejność cyfr<br />   // wykonaj ich zamianę<br />   strrev(str);<br /><br />   // zwróć wskaźnik do początku łańucha z liczbą<br />   return str;<br />}<br /><br />uint32_t pomiar_i1()<br />{<br />ADMUX |= 0b11001001;// Pomiar różnicowy na pinach ADC0 i ADC1, Wzmocnienie: x10  (ATmega32 - PA0 i PA1)<br />_delay_us( 250 );<br />ADCSRA |= (1&lt;&lt;ADSC);  // start konwersji<br />while( ADCSRA &amp; (1&lt;&lt;ADSC) );<br />return ADCW;<br />}<br />uint16_t pomiar( uint8_t kanal ) {<br /><br />ADMUX |= kanal;<br />ADCSRA |= (1&lt;&lt;ADSC);  // start konwersji<br />while( ADCSRA &amp; (1&lt;&lt;ADSC) );<br />return ADCW;<br />}<br />void get_vol( uint16_t adc, TVOL * voltage )<br />{<br />uint16_t wynik = ( adc * (uint32_t)voltage-&gt;ref_v ) / voltage-&gt;ref_adc;<br /><br />div_t divmod = div(wynik, 100);<br />itoa( divmod.quot, voltage-&gt;v1, 10 );// Wskaźniki w Strukturach są oznaczane poprzez &quot;-&gt;&quot;, gdyby było to znykłe odniesienie (nie przez wskaźnik) byloby voltage.v1<br />itoa( divmod.rem, voltage-&gt;v2, 10);// Wskaźniki w Strukturach są oznaczane poprzez &quot;-&gt;&quot;, gdyby było to znykłe odniesienie (nie przez wskaźnik) byloby voltage.v2<br />if( divmod.rem &lt; 10 ) {<br />voltage-&gt;v2&#91;0&#93;='0';<br />voltage-&gt;v2&#91;1&#93;=divmod.rem+'0';<br /><br />}<br />voltage-&gt;v1&#91;2&#93;=0;<br />voltage-&gt;v2&#91;2&#93;=0;<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=10505">skiero</a> — 25 kwi 2016, o 20:00</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[anshar]]></name></author>
<updated>2016-04-25T11:14:29+01:00</updated>
<published>2016-04-25T11:14:29+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=15194&amp;p=159251#p159251</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=15194&amp;p=159251#p159251"/>
<title type="html"><![CDATA[Re: Amperomierz na ADC]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=15194&amp;p=159251#p159251"><![CDATA[
Proponuję zatem zapoznać się z tym tematem: <br /><!-- m --><a class="postlink" href="http://atnel.pl/domyslna-promocja-do-typu-int.html" >http://atnel.pl/domyslna-promocja-do-typu-int.html</a><!-- m --><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=7157">anshar</a> — 25 kwi 2016, o 11:14</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[skiero]]></name></author>
<updated>2016-04-25T09:45:16+01:00</updated>
<published>2016-04-25T09:45:16+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=15194&amp;p=159239#p159239</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=15194&amp;p=159239#p159239"/>
<title type="html"><![CDATA[Re: Amperomierz na ADC]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=15194&amp;p=159239#p159239"><![CDATA[
<div class="quotetitle">Sparrow-hawk napisał(a):</div><div class="quotecontent"><br />A skąd to równanie wyprowadziłeś:<br />[syntax=c](((256 * value * 100) / 100) * 3555 );[/syntax]<br /></div><br /><br />Jest to wartość ADC pomnożona przez milion (ponieważ dalej jest ona przez ten milion dzielona, żeby uzyskać wartość całkowitą i tą po przecinku). Działałem na podstawie wzoru z &quot;blubuka&quot;, tylko nie ma do niego wystarczająco jasnych wyjaśnień.<br />Pierwotna wartość z książki, czyli:<br />[syntax=cpp]srednia = srednia + (((256 * value * 100) / ( 2 * 1024) * 450 );[/syntax]<br />jest to wartość tak naprawdę prądu (zmienna &quot;srednia&quot; przyjmuje w powyższym wyrażeniu wartość od 5626 do 5 501 250 ponieważ &quot;value&quot; przyjmuje wartość od 1 do 978. Po podzieleniu tego przez milion dale to wartość od 0,005 do 5, 5 [A])<br /><br />W moim równaniu:<br />[syntax=cpp]srednia = srednia + (((256 * value * 100) / 100) * 3555 );[/syntax]<br /><br />wartość &quot;srednia&quot; przyjmuje wartość od 910 080 do 512 557 056, dla wartości &quot;value&quot; od 1 do 512...<br />Już widzę błąd.<br /><br />Dalej jednak nie wiem, dlaczego obliczenia w zakresie prądów od 0 do 0,3 [A] były ok a reszta nie... Wrócę do domu, podłączę i dam znać jak poszło.<br /><br />P.S. Dziękuję za pytanie, dużo wprowadziło do moich rozważań <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=10505">skiero</a> — 25 kwi 2016, o 09:45</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Sparrow-hawk]]></name></author>
<updated>2016-04-25T08:33:03+01:00</updated>
<published>2016-04-25T08:33:03+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=15194&amp;p=159231#p159231</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=15194&amp;p=159231#p159231"/>
<title type="html"><![CDATA[Re: Amperomierz na ADC]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=15194&amp;p=159231#p159231"><![CDATA[
A skąd to równanie wyprowadziłeś:<br />[syntax=c](((256 * value * 100) / 100) * 3555 );[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=10614">Sparrow-hawk</a> — 25 kwi 2016, o 08:33</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[skiero]]></name></author>
<updated>2016-04-25T08:05:01+01:00</updated>
<published>2016-04-25T08:05:01+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=15194&amp;p=159224#p159224</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=15194&amp;p=159224#p159224"/>
<title type="html"><![CDATA[Re: Amperomierz na ADC]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=15194&amp;p=159224#p159224"><![CDATA[
<div class="quotetitle">Jaglarz napisał(a):</div><div class="quotecontent"><br />Kod źle wstawiony.<br /></div><br />Już poprawiłem.<br /><br /><div class="quotetitle">anshar napisał(a):</div><div class="quotecontent"><br /><div class="quotetitle">skiero napisał(a):</div><div class="quotecontent">nową zmienną &quot;uint64_t srednia2 = 100000;&quot; i gdy wyświetliłem jej wartość funkcją &quot;lcd_int()<br /></div><br />Zwróć uwagę na funkcję lcd_int(), a w niej użytą itoa(). Przecież ona nie będzie prawidłowo wyświetlać liczb większych od int, prawda?<br />Napisz sobie blizniaczą funkcję, z tym, że zamiast itoa(), użyj ltoa() lub nawet lepiej ultoa().</div><br /><br />Słuszna uwaga, poprawię to (jak tylko wrócę do domu). Natomiast obawiam się, że nie rozwiąże to problemu całkowicie, ponieważ do obliczeń nie brane są zmienne sczytywane z wyświetlacza, więc w obliczeniach prowadzonych przez mikrokontroler nie powinno być tego problemu.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=10505">skiero</a> — 25 kwi 2016, o 08:05</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[anshar]]></name></author>
<updated>2016-04-23T19:21:29+01:00</updated>
<published>2016-04-23T19:21:29+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=15194&amp;p=159069#p159069</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=15194&amp;p=159069#p159069"/>
<title type="html"><![CDATA[Re: Amperomierz na ADC]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=15194&amp;p=159069#p159069"><![CDATA[
<div class="quotetitle">skiero napisał(a):</div><div class="quotecontent"><br />nową zmienną &quot;uint64_t srednia2 = 100000;&quot; i gdy wyświetliłem jej wartość funkcją &quot;lcd_int()<br /></div><br />Zwróć uwagę na funkcję lcd_int(), a w niej użytą itoa(). Przecież ona nie będzie prawidłowo wyświetlać liczb większych od int, prawda?<br />Napisz sobie blizniaczą funkcję, z tym, że zamiast itoa(), użyj ltoa() lub nawet lepiej ultoa().<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=7157">anshar</a> — 23 kwi 2016, o 19:21</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Jaglarz]]></name></author>
<updated>2016-04-23T18:23:26+01:00</updated>
<published>2016-04-23T18:23:26+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=15194&amp;p=159061#p159061</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=15194&amp;p=159061#p159061"/>
<title type="html"><![CDATA[Re: Amperomierz na ADC]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=15194&amp;p=159061#p159061"><![CDATA[
Kod źle wstawiony.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=471">Jaglarz</a> — 23 kwi 2016, o 18:23</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[skiero]]></name></author>
<updated>2016-04-25T08:01:11+01:00</updated>
<published>2016-04-23T18:17:21+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=15194&amp;p=159060#p159060</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=15194&amp;p=159060#p159060"/>
<title type="html"><![CDATA[Amperomierz na ADC]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=15194&amp;p=159060#p159060"><![CDATA[
Witam szanownych forumowiczów!<br /><br />Mam problem z wyświetlaniem wartości natężenie prądu. Korzystałem z zagadnienia poruszonego w &quot;Blubuku&quot; jednak na potrzeby zmieniłem trochę program pod ATmegę32, ponieważ nie posiadam ATtiny26. Zmiana została dokonana w linijce w której wylicza się średnią ( zmienna -&gt; srednia):<br /><br />zamiast:<br />[syntax=cpp]srednia = srednia * fil;<br />srednia = srednia + (((256 * value * 100) / ( 2 * 1024) * 450 ); //Wartośc prądu pomnożona przez milion<br />srednia = srednia / ( fil + 1 );[/syntax]<br />mamy:<br />[syntax=cpp]srednia = srednia * fil;<br />srednia = srednia + (((256 * value * 100) / 100) * 3555 );         //Wartośc prądu pomnożona przez milion<br />srednia = srednia / ( fil + 1 );[/syntax]<br /><br />żeby wyświetlane wartości pokrywały się z prawdą (zrobiłem do tego arkusz w excelu taki jak w rozdziale 4.8.2. Różnicowy pomiar napięcia). Zmieniłem również rejestr ADCSR który występuje w ATtiny26 na ADCSRA z ATmegi32.<br />Przepisałem elegancko cały kod do Eclipsa, skompilowałem i niestety wartość prądu na wyświetlaczu nie nie dla każdej wartości ADC odzwierciedla realną wartość prądu (sprawdzane multimetrem). Maksymalna wartość jaką udało mi się wyświetlić i się pokrywała z wcześniejszymi wyliczeniami to 0,5 [A], potem nie wyświetlało wyższych wartości.<br />Dodatkowo wyświetliłem wartość ADC, na podstawie której była wyliczana wartość prądu i tu akurat wartość była zgodna z tą wyliczoną z Excela dla całego zakresu. zacząłem więc wyświetlać obok wartości ADC wartość &quot;srednia&quot;, żeby zobaczyć jakie wartości pokaże. Były to wartości z zakresu zmiennej typu int16_t (-32k do 32k) mimo, że typ zmiennej zmieniałem wielokrotnie, na te mogące pomieścić większe liczby. Ponadto dodałem dla sprawdzenia nową zmienną &quot;uint64_t srednia2 = 100000;&quot; i gdy wyświetliłem jej wartość funkcją &quot;lcd_int();&quot;<br />pokazała się wartość &quot;-31072&quot;, tak jakby przewijało cały czas wartość int16_t. Nie mam pojęcia na czy polega mój błąd. Załączam kod programu, bliźniaczo podobny do tego z książki z rozdziału 4.8.2. .<br /><br />[syntax=cpp]#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br />#include &lt;stdlib.h&gt;<br />#include &lt;util/delay.h&gt;<br /><br />#include &quot;LCD/lcd44780.h&quot;<br /><br />#define REF_256 (1&lt;&lt;REFS1)|(1&lt;&lt;REFS0)<br />#define REF_VCC (1&lt;&lt;REFS0)<br /><br />char *int_to_str(int val, char *str, int8_t fw, char znak_wiodacy);<br /><br />char liczba&#91;10&#93;;<br /><br />int main (void)<br />{<br /><br />lcd_init();<br /><br />ADCSRA |= (1&lt;&lt;ADEN); // włącz ADC<br />ADCSRA |= (1&lt;&lt;ADPS2)|(1&lt;&lt;ADPS1)|(1&lt;&lt;ADPS0); // preskaler = 128<br />ADMUX |= REF_256;// ustawiamy wewn. źr odn. 2,56V<br /><br />lcd_locate(0,0);<br />lcd_str(&quot;Test LCD&quot;);<br />_delay_ms( 500 );<br />lcd_cls();<br /><br />uint16_t fil = 300;<br />uint16_t value = 0, czas = 60;<br />uint32_t srednia = 0;<br />div_t divmod;<br />    uint16_t v1, v2;<br /><br />sei();<br />while(1)<br />{<br />ADMUX = 0b11001001;<br />_delay_us( 250 );<br />ADCSRA |= (1&lt;&lt;ADSC);  // start konwersji<br />while( ADCSRA &amp; (1&lt;&lt;ADSC) );<br />value = ADCW;<br />if(value &lt; 5 || value &gt; 511) value = 0;<br /><br />srednia = srednia * fil;<br />srednia = srednia + (((256 * value * 100) / 100) * 3555 ); //Wartośc prądu pomnożona przez milion<br />srednia = srednia / ( fil + 1 );<br /><br />if(!czas)<br />{<br />lcd_locate(0, 0);<br />lcd_int(value);<br />lcd_str(&quot;  &quot;);<br />_delay_ms(150);<br /><br />lcd_locate(0, 4);<br />lcd_int(srednia);<br />lcd_str(&quot;  &quot;);<br /><br />lcd_locate(1, 0);<br />lcd_str(&quot;I = &quot;);<br />v1 = srednia / 1000000;<br />divmod = div(srednia / 1000, 1000);<br />v2 = divmod.rem;<br /><br />lcd_str( int_to_str(v1, liczba, 1, ' '));<br />lcd_char('.');<br />lcd_str( int_to_str(v2, liczba, 2, ' '));<br />lcd_str( &quot; A&quot;);<br /><br />czas = 320;<br />} else<br />{<br />czas--;<br />_delay_ms(1);<br />}<br /><br />}<br /><br />}<br /><br />char *int_to_str(int val, char *str, int8_t fw, char znak_wiodacy) {<br />char *strp = str;<br />uint8_t subzero = 0;<br /><br />if(val&lt;0) {// jeśli liczba jest ujemna<br />val = ~val+1;// zaneguj i koryguj<br />subzero=1;// ustaw znacznik na 1<br />fw--;<br />}<br /><br />   do{<br />      div_t divmod = div(val, 10);   // opracja dzielenia oraz modulo - wynik do struktury ldiv_t<br /><br />      if((val == 0) &amp;&amp; (strp != str)) {<br />         *strp++ = znak_wiodacy;<br />      } else {<br />         *strp++ = divmod.rem + '0';<br />      }<br /><br />      val = divmod.quot;            // wartość zmniejsza się o jednostki, dziesiątki, setki itd<br />      fw--;                     // zmniejszenie licznika szerokości formatowanego pola<br />      // wykonuj pętlę do momentu sprawdzenia ostatniej cyfry znaczącej lub zajętości całego pola<br />   } while ( (fw&gt;0)  );<br /><br />   if(subzero) *strp++ = '-';// jeśli była to liczba ujemna, wstaw znak minus<br />   *strp = 0;                     // zakończ łańcuch zerem<br /><br />   // w związku z tym, że w łańcuchu jest odwrócona kolejność cyfr<br />   // wykonaj ich zamianę<br />   strrev(str);<br /><br />   // zwróć wskaźnik do początku łańcucha z liczbą<br />   return str;<br />}[/syntax]<br /><br />P.S. Jeśli to ważne, to oglądałem serię filmików o ADC ponad dwa razy.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=10505">skiero</a> — 23 kwi 2016, o 18:17</p><hr />
]]></content>
</entry>
</feed>