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

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

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=11088&amp;mode</id>
<entry>
<author><name><![CDATA[marcin w]]></name></author>
<updated>2015-03-18T16:06:43+01:00</updated>
<published>2015-03-18T16:06:43+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11088&amp;p=123817#p123817</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11088&amp;p=123817#p123817"/>
<title type="html"><![CDATA[Re: Poroblem z obliczeniem zmiennej]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11088&amp;p=123817#p123817"><![CDATA[
Dzięki za cenną sugestię, która okazała się rozwiązaniem problemu.<br />Sam próbowałem dokonywać jawnego rzutowania, jednak wykonałem to rzutując na tym uint64_t cały iloczyn dT * dT. Nie przyniosło to żądanego skutku.<br />Z drugiej strony liczyłem że kompilator zadba o właściwe obliczenie wartości zmiennej TEMP2.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3936">marcin w</a> — 18 mar 2015, o 16:06</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Krauser]]></name></author>
<updated>2015-03-17T21:11:44+01:00</updated>
<published>2015-03-17T21:11:44+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11088&amp;p=123765#p123765</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11088&amp;p=123765#p123765"/>
<title type="html"><![CDATA[Re: Poroblem z obliczeniem zmiennej]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11088&amp;p=123765#p123765"><![CDATA[
Spróbuj tak:<br />[syntax=c]TEMP2 = ((uint64_t)dT * dT) / 2147483648UL;[/syntax]<br /><br />PS. volatile jest niepotrzebne<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=465">Krauser</a> — 17 mar 2015, o 21:11</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[marcin w]]></name></author>
<updated>2015-03-17T17:45:22+01:00</updated>
<published>2015-03-17T17:45:22+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11088&amp;p=123744#p123744</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11088&amp;p=123744#p123744"/>
<title type="html"><![CDATA[Poroblem z obliczeniem zmiennej]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11088&amp;p=123744#p123744"><![CDATA[
Witam<br /><br />Mam pewien problem z czujnikiem MS5611, a dokładniej z obliczeniem temperatury. W pętli co 1sek wywołuję funkcję pobierającą dane z czujnika MS5611 i kalkulującą temperaturę. Ma ona postać<br /><br />[syntax=c]double MS5611_GetTemp(void)<br />{<br />volatile uint32_t D2 = MS5611_Raw_Temperature();<br />int32_t dT = D2 - (uint32_t)cal_data&#91;4&#93; * 256;<br />int32_t TEMP =2000 + ((int64_t) dT * cal_data&#91;5&#93;) / 8388608;<br /><br />int32_t TEMP2;<br /><br />if (TEMP &lt; 2000)<br />{<br />TEMP2 = (dT * dT) / (2147483648);<br />}<br /><br />TEMP = TEMP - TEMP2;<br />return ((double)TEMP/100);<br />}[/syntax]<br /><br />Gdzie D2 to dane odczytywane z przetwornika ADC sensora a cal_data[] to sześć stałych dla danego czujnika odczytanych z układu służące do obliczenia temperatury.<br /><br />Po pierwszym wywołaniu funkcji otrzymuję prawidłową temperaturę, ok 20-21 stopni co by się zgadzało z rzeczywistą temperaturą. Ale drugie i każde kolejne wywołanie funkcji zwraca wartość około -167768. Po wielu próbach zwracając zamiast TEMP/100 innych zmiennych funkcji doszedłem do tego że problem leży w linii<br /><br /><span style="color: #0000FF"><em>TEMP2 = (dT * dT) / (2147483648);</em></span><br /><br />To TEMP2 w drugim i każdym kolejnym wywołaniu funkcji przybiera jakąś dziwną wartość o kilka rzędów większą niż powinna. Deklarując zmienną int32_t TEMP2; przed warunkiem nadałem jej wartość 0 (int32_t TEMP2 = 0;) niestety ale w tym przypadku każde obliczenie w warunku nie powodowało żadnej zmiany wartości TEMP2, wartość ta zawsze wynosiła 0.<br /><br />Fragment kodu do obliczenia temperatury zaczerpnięty jest z biblioteki do arduino <!-- m --><a class="postlink" href="https://github.com/jarzebski/Arduino-MS5611/blob/master/MS5611.cpp" >https://github.com/jarzebski/Arduino-MS ... MS5611.cpp</a><!-- m --><br /><br />Ma ktoś jakiś sensowny pomysł co się dzieje ?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3936">marcin w</a> — 17 mar 2015, o 17:45</p><hr />
]]></content>
</entry>
</feed>