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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2021-01-17T13:58:40+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=23545&amp;mode</id>
<entry>
<author><name><![CDATA[wolek14]]></name></author>
<updated>2021-01-17T13:58:40+01:00</updated>
<published>2021-01-17T13:58:40+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23545&amp;p=230626#p230626</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23545&amp;p=230626#p230626"/>
<title type="html"><![CDATA[Re: Błędnie obliczana moc wyjściowa - problem z mnożeniem li]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23545&amp;p=230626#p230626"><![CDATA[
<div class="quotetitle">anonimowy napisał(a):</div><div class="quotecontent"><br />https://atnel.pl/domyslna-promocja-do-typu-int.html<br /></div><br /><br />Bingo! Przejrzałem właśnie całego BB i nie znalazłem niczego na ten temat. Bardzo ci dziękuję.<br /><br /><div class="quotetitle">Makowka napisał(a):</div><div class="quotecontent"><br />Policzyłem to korzystając z windowsowego kalkulatora i mi również wyszło 8 <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> Dlaczego? Zobacz na linię 10. kodu twojej funkcji i zastanów się jak wykona się operacja dzielenia.<br /><br />Wykonujesz rzutowanie na typ 16 bitowy. Wcześniej, wynik (jak mówiłeś) wynosi 0100 0010 0000 1000 0000.<br /><br />Po wyrzuceniu 4 najbardziej znaczących bitów podziel 0b0010 0000 1000 0000 (0x2080) /  0b0011 1110 1000(0x3E8) i kalkulator pokaże 8 jak na zdjęciu poniżej.<br /><br /><a href="https://obrazkiforum.atnel.pl/10748/f092f1af056832a8996dd203b0f6674d.png"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/10748/f092f1af056832a8996dd203b0f6674d.png" alt="Obrazek" /></a><br /><br />Mam nadzieję, że się nie pomyliłem, ale proszę mnie poprawić jeżeli jednak to nie to <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /></div><br /><br />No właśnie według mojego rozumowania do zmiennej uint16_t powinien zostać zapisany <strong>wynik</strong> dzielenia zmiennej uint32_t przez 1000 a nie najpierw sama zmienna a później operacja dzielenia na niej. Z resztą w następnych wersjach funkcji wyeliminowałem ten problem jednak bez skutku. <br /><br />Ostatecznie działająca funkcja wygląda tak:<br /><br />[syntax=c]void disp_Pbatt (uint16_t ubatt, uint16_t ibatt, uint8_t posx, uint8_t posy){<br /><br />//uint16_t a = (ibatt + 3) * 2;//przelicznik na mA (50 = 500mA)<br />//uint16_t b = ubatt * 2;//przelicznik na napięcie x100 (15V = 1500)<br /><br />uint16_t a = ibatt;<br />uint16_t b = ubatt;<br /><br />uint16_t p = ( ( (uint32_t)a * (uint32_t)b) ) / 1000;<br />lcd_locate(posy,posx);<br />lcd_int(p);<br />}[/syntax]<br /><br />Problem leżał w tym że kompilator zapisywał wynik mnożenia a * b do jakiejśc zmiennej tymczasowej dwubajtowej pomimo iż wynik miał być zapisany do uint32_t. Wystarczyło potraktować zmienne a i b jako zmienne czterobajtowe i wynik jest już prawidłowy. <br /><br /><strong>Makowka</strong> w tej funkcji też zapisałem na próbę wszystko w jednej linii i problem nie występuje <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />Miłego dnia wszystkim!<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=7487">wolek14</a> — 17 sty 2021, o 13:58</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Makowka]]></name></author>
<updated>2021-01-17T12:52:18+01:00</updated>
<published>2021-01-17T12:52:18+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23545&amp;p=230625#p230625</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23545&amp;p=230625#p230625"/>
<title type="html"><![CDATA[Re: Błędnie obliczana moc wyjściowa - problem z mnożeniem li]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23545&amp;p=230625#p230625"><![CDATA[
Policzyłem to korzystając z windowsowego kalkulatora i mi również wyszło 8 <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> Dlaczego? Zobacz na linię 10. kodu twojej funkcji i zastanów się jak wykona się operacja dzielenia.<br /><br />Wykonujesz rzutowanie na typ 16 bitowy. Wcześniej, wynik (jak mówiłeś) wynosi 0100 0010 0000 1000 0000.<br /><br />Po wyrzuceniu 4 najbardziej znaczących bitów podziel 0b0010 0000 1000 0000 (0x2080) /  0b0011 1110 1000(0x3E8) i kalkulator pokaże 8 jak na zdjęciu poniżej.<br /><br /><a href="https://obrazkiforum.atnel.pl/10748/f092f1af056832a8996dd203b0f6674d.png"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/10748/f092f1af056832a8996dd203b0f6674d.png" alt="Obrazek" /></a><br /><br />Mam nadzieję, że się nie pomyliłem, ale proszę mnie poprawić jeżeli jednak to nie to <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=10748">Makowka</a> — 17 sty 2021, o 12:52</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[anonimowy]]></name></author>
<updated>2021-01-17T12:47:14+01:00</updated>
<published>2021-01-17T12:47:14+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23545&amp;p=230623#p230623</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23545&amp;p=230623#p230623"/>
<title type="html"><![CDATA[Re: Błędnie obliczana moc wyjściowa - problem z mnożeniem li]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23545&amp;p=230623#p230623"><![CDATA[
<!-- m --><a class="postlink" href="https://atnel.pl/domyslna-promocja-do-typu-int.html" >https://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=3542">anonimowy</a> — 17 sty 2021, o 12:47</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[wolek14]]></name></author>
<updated>2021-01-17T11:22:34+01:00</updated>
<published>2021-01-17T11:22:34+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23545&amp;p=230620#p230620</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23545&amp;p=230620#p230620"/>
<title type="html"><![CDATA[Błędnie obliczana moc wyjściowa - problem z mnożeniem liczb]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23545&amp;p=230620#p230620"><![CDATA[
Witajcie!<br /><br />Napisałem sobie funkcję służącą do obliczania mocy wyjściowej pewnego urządzenia i wyświetlania go na LCD (HD44780 4 x 20):<br />[syntax=c]void disp_Pbatt (uint16_t ubatt, uint16_t ibatt, uint8_t posx, uint8_t posy){<br /><br />//uint16_t a = (ibatt + 3) * 2;//przelicznik na mA (50 = 500mA)<br />//uint16_t b = ubatt * 2;//przelicznik na napięcie x100 (15V = 1500)<br /><br />uint16_t a = ibatt;<br />uint16_t b = ubatt;<br /><br />uint32_t p = (a * b);<br />uint16_t power = p/1000;<br />lcd_locate(posy,posx);<br />lcd_int(power);<br />}[/syntax]<br /><br />Na potrzeby testu wywołuję go z funkcji głównej programu stałymi wartościami:<br />[syntax=c]disp_Pbatt(1680, 200, 10, 0);[/syntax]<br /><br />Pomijam też przeliczanie surowej wartości z adc na fizyczne jednostki (są &quot;zakomentowane&quot;).<br /><br />Zgodnie z oczekiwaniami gdy wartości przekazywane do funkcji wynoszą odpowiednio 1680 i 200, wynikiem mnożenia jest liczba  336000. Ta powinna znajdować się w zmiennej p zapisana binarnie tak:<br /><br />[syntax=c]0101 0010 0000 1000 0000[/syntax]<br /><br />następnie w wyniku dzielenia do zmiennej power trafić powinna liczba 336 zapisana tak:<br /><br />[syntax=c]0001 0101 0000[/syntax]<br /><br />po czym zostać wyświetlona na lcd. <br /><br />Niestety jak bym nie próbował - na wyświetlaczu mam cyfrę 8...<br /><br />Spróbowałem wyświetlić zawartość zmiennej power bez dzielenia na 1000:<br /><br />[syntax=c]void disp_Pbatt (uint16_t ubatt, uint16_t ibatt, uint8_t posx, uint8_t posy){<br /><br />//uint16_t a = (ibatt + 3) * 2;//przelicznik na mA (50 = 500mA)<br />//uint16_t b = ubatt * 2;//przelicznik na napięcie x100 (15V = 1500)<br /><br />uint16_t a = ibatt;<br />uint16_t b = ubatt;<br /><br />uint32_t p = (a * b);<br />uint16_t power = p;<br />lcd_locate(posy,posx);<br />lcd_int(power);<br />}[/syntax]<br /><br />i otrzymuję wynik 8320, binarnie to będzie:<br /><br />[syntax=c]0010 0000 1000 0000[/syntax]<br /><br />Okazuje się, że jest to wynik mnożenia (336000) z którego znikają cztery najstarsze bity. Wszystko się zgadza. Czemu natomiast dzielenie przez tysiąc wykonywane jest już na obciętej wartości? Tzn dzielone jest 8320 a nie 336000? Próbowałem też zrobić tak:<br /><br />[syntax=c]void disp_Pbatt (uint16_t ubatt, uint16_t ibatt, uint8_t posx, uint8_t posy){<br /><br />//uint16_t a = (ibatt + 3) * 2;//przelicznik na mA (50 = 500mA)<br />//uint16_t b = ubatt * 2;//przelicznik na napięcie x100 (15V = 1500)<br /><br />uint16_t a = ibatt;<br />uint16_t b = ubatt;<br /><br />uint32_t p = (a * b) / 1000;<br />uint16_t power = p;<br />lcd_locate(posy,posx);<br />lcd_int(power);<br />}[/syntax]<br /><br />Niestety również wynikiem jest liczba 8.<br /><br />Dajcie proszę jakąś wskazówkę - nie mam już za bardzo pomysłu. Myślałem że ostatni przykład załatwi sprawę i do zmiennej uint32_t zostanie zapisany wynik 336000 i podzielony przez 1000, jednak tam również ucięte są cztery najstarsze bity.<br /><br />Mógłbym teoretycznie dzielić liczby przed mnożeniem ale:<br />- to jest ominięcie problemu a nie rozwiązanie + zerowa wartość edukacyjna<br />- nie uzyskam zakładanej dokładności<br /><br />Procesor to Atmega8 taktowana fcpu = 16MHZ.<br /><br />Proszę o wyrozumiałość - jestem amatorem hobbystą i dopiero się uczę <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />Łukasz<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=7487">wolek14</a> — 17 sty 2021, o 11:22</p><hr />
]]></content>
</entry>
</feed>