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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2016-10-09T22:49:55+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=15994&amp;mode</id>
<entry>
<author><name><![CDATA[Mellanogaster]]></name></author>
<updated>2016-10-09T22:49:55+01:00</updated>
<published>2016-10-09T22:49:55+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=15994&amp;p=171087#p171087</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=15994&amp;p=171087#p171087"/>
<title type="html"><![CDATA[Re: HTU21D, wyznaczanie CRC.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=15994&amp;p=171087#p171087"><![CDATA[
<div class="quotetitle">dawid75_75 napisał(a):</div><div class="quotecontent"><br />Znaczy to, że mamy jak mamy jakiś wielomian n-tego stopnia to binarnie jedynkę mamy tam, gdzie występuje niezerowy współczynnik? <br />Np.: wielomian X^5+X^3+X^1 binarnie będzie wyglądał tak: 0b101010.<br />I przy okazji - jak mam rozumieć binarne zapisanie wielomianu? Jak ma się jedno do drugiego? <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /></div><br />Dokładnie tak. Ja ten zapis wielomianowy traktuję jako zapis bajtów klucza w sposób skrócony. Bo ile trzeba by napisać gdyby wyraz pierwszy był wyższego rzędu niż. 5?<br /><br />CRC-32<br />0x04C11DB7 (tu już zapis hex jest długawy, a wyobraź sobie zapis binarny)<br />x32 + x26 + x23 + x22 + x16 + x12 + x11 + x10 + x8 + x7 + x5 + x4 + x2 + x1 + 1<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2911">Mellanogaster</a> — 9 paź 2016, o 22:49</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[dawid75_75]]></name></author>
<updated>2016-10-08T20:18:45+01:00</updated>
<published>2016-10-08T20:18:45+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=15994&amp;p=170885#p170885</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=15994&amp;p=170885#p170885"/>
<title type="html"><![CDATA[Re: HTU21D, wyznaczanie CRC.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=15994&amp;p=170885#p170885"><![CDATA[
Widzisz, od razu mi jest jaśniej <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> Samą procedurę obliczania CRC już rozumiem.<br /><br />Mam jeszcze pytanie do wielomianów:<br /><div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"><br />Wielomian postaci: X^8+X^5+X^4+X^0 co daje binarnie: 0b100110001<br /></div><br />Znaczy to, że mamy jak mamy jakiś wielomian n-tego stopnia to binarnie jedynkę mamy tam, gdzie występuje niezerowy współczynnik? <br />Np.: wielomian X^5+X^3+X^1 binarnie będzie wyglądał tak: 0b101010.<br />I przy okazji - jak mam rozumieć binarne zapisanie wielomianu? Jak ma się jedno do drugiego? <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=11277">dawid75_75</a> — 8 paź 2016, o 20:18</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Mellanogaster]]></name></author>
<updated>2016-10-06T11:08:05+01:00</updated>
<published>2016-10-06T11:08:05+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=15994&amp;p=170627#p170627</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=15994&amp;p=170627#p170627"/>
<title type="html"><![CDATA[Re: HTU21D, wyznaczanie CRC.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=15994&amp;p=170627#p170627"><![CDATA[
To może na początek coś na rozruszanie mózgu  <img src="https://forum.atnel.pl/images/smilies/icon_idea.gif" alt=":idea:" title="Pomysł" /> <br /><br />Postanowiłem, że napiszę sobie najprostszą funkcję do obliczania CRC dla mojego przypadku.<br /><br /><strong>Założenia były następujące:</strong><br /><br />- Wielomian postaci: <span style="color: #008040">X^8+X^5+X^4+X^0</span>            co daje binarnie: 0b<strong><span style="text-decoration: underline">1</span></strong>00110001 - długość 9 bitów!!!! - to jest bardzo ważne, 9 <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br />- Obrabiane <span style="color: #0040BF">dane </span>mieszczą się w typie <span style="text-decoration: underline">uint16_t</span> - jeśli więcej to trzeba zmodyfikować kod.<br /><br />A działanie przedstawia się następująco:<br /><br />- do zmiennej <span style="color: #FF8000">roboczej </span>wsuwamy najstarszy bit zmiennej <span style="color: #0040BF">dane</span><br />- za pomocą odpowiedniej maski (0b00000001 00000000) sprawdzamy czy przypadkiem już w zmiennej <span style="color: #FF8000">roboczej </span> na pozycji <strong><span style="text-decoration: underline">9</span></strong> nie pojawila się jedynka<br />- jeśli nie to wsuwamy następny bit i ponownie sprawdzamy warunek<br /><br />- pojawiła się w końcu jedynka... więc zmienną <span style="color: #FF8000">roboczą </span> XORujemy wartością naszego wielomianu <img src="https://forum.atnel.pl/images/smilies/icon_exclaim.gif" alt=":!:" title="Wykrzyknik" /> (0b100110001)<br /><br />- ... i znowu wsuwamy bit, i znowu sprawdzamy czy na pozycji 9...<br /><br />jak długo? odpowiedź: tyle ile jest bitów w naszej zmiennej <span style="color: #0040BF">dane </span> plus długość naszego wielomianu (9bitów) <span style="text-decoration: underline">minus jeden</span>        co daje łącznie 24 przesunięcia <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br />rzecz jasna ostatnie 8 bitów jakie się wsuną to będą same zera.<br /><br /><br />po tej 24 operacji przesunięcia sprawdzamy co znajduje się aktualnie w naszej zmiennej <span style="color: #FF8000">roboczej </span>.<br /><br />Powinna to być właśnie suma kontrolna identyczna z tą nadesłaną przez czujnik <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br />podsyłam na szybko prosty kod przedstawiający metodę w akcji .<br />Był przygotowany w oparciu o zestaw ATB z atmega32A na pokładzie i bibliotekę do obsługi uart z BlueBook'a<br /><br />[syntax=c]/*<br /> * main.c<br /> *<br /> * AUTHOR: Mellanogaster<br /> * <br /> * www.forum.atnel.pl<br /> *<br /> * 15 wrz 2016<br /> * 17:29:26<br /> *<br /> */<br /><br />#include &lt;avr/io.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;stdlib.h&gt;<br /><br />#include &quot;I2C_TWI/i2c_twi.h&quot;<br />#include &quot;MK_USART/mkuart.h&quot;<br /><br />#include &quot;crc8.h&quot;<br /><br />uint16_t liczba = 0x4E85; // liczba z przykładu z dokumentacji<br />uint8_t crcWynik;<br /><br /><br />int main(void){<br /><br />USART_Init( __UBRR );// inicjalizacja UART<br /><br />sei();<br /><br />uart_puts(&quot;\r\nLiczba: 0x&quot;);<br />uart_putint(liczba, 16);<br />uart_puts(&quot;\r\nto binarnie: &quot;);<br /><br />uart_puts(&quot;\r\n0b&quot;);<br />uart_putint(liczba, 2);<br />uart_puts(&quot;\r\n&quot;);<br /><br />crcWynik = crc8(liczba);<br /><br />uart_puts(&quot;\r\nObliczone crc: 0x&quot;);<br />uart_putint(crcWynik, 16);<br /><br />uart_puts(&quot;\r\n\r\n&quot;);<br /><br /><br /><br />}[/syntax]<br /><br />a tutaj jest jest biblioteka do funkcji crc8:<br />[syntax=c]/************************************************************************/<br />/* Mellanogaster<br /> *<br /> * www.forum.atnel.pl<br /> */<br />/*<br /> */<br /><br /><br /><br /><br />#include &lt;inttypes.h&gt;<br />#include &quot;MK_USART/mkuart.h&quot;<br /><br />#include &quot;crc8.h&quot;<br /><br />uint8_tcrc8 ( uint16_t data_in )<br />{<br />uint16_t liczba = 0;<br />uint8_t bitCnt = 24; // liczba bitów w zmiennej obrabianej + liczba bitow w wielomianie -1 (16 + 9 - 1)<br />uint16_t  reszta = 0;<br /><br />liczba = data_in;<br /><br />do {<br /><br /><br /><br /><br />if((liczba &amp; 0x8000)){<br />liczba = (liczba&lt;&lt;1);<br />reszta = (reszta&lt;&lt;1);<br />reszta |= (0x1);<br />}<br />else{<br />liczba = (liczba&lt;&lt;1);<br />reszta = (reszta&lt;&lt;1);<br />}<br /><br />uart_puts(&quot;\r\n&quot;);<br />uart_putint(reszta, 2);<br /><br />if(reszta &amp; MASKA){<br />uart_puts(&quot;\r\nprzed XOR: &quot;);<br />uart_putint(reszta, 2);<br />uart_puts(&quot;\r\n&quot;);<br />reszta = reszta ^ CRC8POLY;<br />uart_putint(CRC8POLY, 2);<br />uart_puts(&quot;\r\n&quot;);<br />uart_puts(&quot;po XOR: &quot;);<br />uart_putint(reszta, 2);<br /><br />}<br /><br /><br /><br />bitCnt--;<br />} while (bitCnt &gt; 0);<br /><br /><br />return reszta;<br />}[/syntax]<br /><br />i plik nagłówkowy<br />[syntax=c]#ifndef CRC8_H_<br />#define CRC8_H_<br /><br />#include &lt;inttypes.h&gt;<br /><br />#define MASKA0x100 // 0b100110001<br />#define CRC8POLY0b100110001              // X^8+X^5+X^4+X^0<br /><br />uint8_tcrc8 (uint16_t data_in);<br /><br />#endif[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2911">Mellanogaster</a> — 6 paź 2016, o 11:08</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[dawid75_75]]></name></author>
<updated>2016-10-05T14:47:22+01:00</updated>
<published>2016-10-05T14:47:22+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=15994&amp;p=170522#p170522</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=15994&amp;p=170522#p170522"/>
<title type="html"><![CDATA[Re: HTU21D, wyznaczanie CRC.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=15994&amp;p=170522#p170522"><![CDATA[
No pewnie <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=11277">dawid75_75</a> — 5 paź 2016, o 14:47</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Mellanogaster]]></name></author>
<updated>2016-10-04T16:10:39+01:00</updated>
<published>2016-10-04T16:10:39+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=15994&amp;p=170407#p170407</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=15994&amp;p=170407#p170407"/>
<title type="html"><![CDATA[Re: HTU21D, wyznaczanie CRC.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=15994&amp;p=170407#p170407"><![CDATA[
Na podstawie dokumentacji napisałem własną obsługę tego czujnika. Właśnie skończyłem CRC. Zainteresowany?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2911">Mellanogaster</a> — 4 paź 2016, o 16:10</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[dawid75_75]]></name></author>
<updated>2016-08-14T10:10:56+01:00</updated>
<published>2016-08-14T10:10:56+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=15994&amp;p=166009#p166009</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=15994&amp;p=166009#p166009"/>
<title type="html"><![CDATA[HTU21D, wyznaczanie CRC.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=15994&amp;p=166009#p166009"><![CDATA[
Szanowni Forumowicze,<br />Zagłębiając się w temat znalazłem funkcję liczącą CRC w bibliotece na arduino do tego czujnika. Dowiedziałem się też, że jest biblioteka o nazwie <strong>crc16.h</strong> w katalogu <strong>util</strong>. Pierwotnie chciałem z niej korzystać, ale wymaga argumentów 8-bitowych, a z tego, co zrozumiałem z datasheet'a czujnika i patrząc na funkcję z biblioteki arduino muszę zlepić ze sobą dane pomiarowe z czujnika, czyli otrzymam 16-bitową liczbę. Postać funckji z <strong>crc16.h</strong>:<br />[syntax=c]static __inline__ uint8_t  _crc_ibutton_update (uint8_t __crc, uint8_t __data)[/syntax]<br /><br />Funkcja z biblioteki arduino:<br />[syntax=c]#define SHIFTED_DIVISOR 0x988000 //This is the 0x0131 polynomial shifted to farthest left of three bytes<br />uint8_t check_crc(uint16_t message_from_sensor, uint8_t check_value_from_sensor)<br />{<br />//Test cases from datasheet:<br />//message = 0xDC, checkvalue is 0x79<br />//message = 0x683A, checkvalue is 0x7C<br />//message = 0x4E85, checkvalue is 0x6B<br /><br />uint32_t remainder = (uint32_t)message_from_sensor &lt;&lt; 8; //Pad with 8 bits because we have to add in the check value<br />remainder |= check_value_from_sensor; //Add on the check value<br /><br />uint32_t divsor = (uint32_t)SHIFTED_DIVISOR;<br /><br />for (int i = 0 ; i &lt; 16 ; i++) //Operate on only 16 positions of max 24. The remaining 8 are our remainder and should be zero when we're done.<br />{<br /><br />if( remainder &amp; (uint32_t)1&lt;&lt;(23 - i) ) //Check if there is a one in the left position<br />remainder ^= divsor;<br /><br />divsor &gt;&gt;= 1; //Rotate the divsor max 16 times so that we have 8 bits left of a remainder<br />}<br /><br />return (uint8_t)remainder;<br />}[/syntax]<br /><br />Użycie w programie:<br />[syntax=c]&#91;...&#93;<br />                uint8_t byte0 = twiMaster.readData&#91;0&#93;;<br />uint8_t byte1 = twiMaster.readData&#91;1&#93;;<br />uint8_t byte2 = twiMaster.readData&#91;2&#93;;<br /><br />printf(&quot;Kontrola strumienia.\n\n\r&quot;);<br />printf(&quot;Wartosci odebranych bajtow: &quot;);<br />printf(&quot; %d %d\n\r&quot;, byte0, byte1);<br />itoa(byte2, binBuffer, 2);<br />printf(&quot;Checksum: %s\n\r&quot;, binBuffer);<br />uint16_t data = 0;<br />data = (byte0 &lt;&lt; 8) | byte1;<br />uint8_t crc = check_crc(data, byte2);<br />printf(&quot;CRC: %d\n\r&quot;, crc);&#91;...&#93;[/syntax]<br /><br />Starałem się analizować to co piszą w DS do czujnika jednocześnie czytając kod funkcji. I mam problem z tym, że nie do końca rozumiem początek:<br /><div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"><br />calculation<br />To compute an n-bit binary CRC, line the bits representing the input in a row, and position the (n+1)-bit pattern<br />representing the CRC's divisor (called a &quot;polynomial&quot;) underneath the left-hand end of the row.<br />This is first padded with zeroes corresponding to the bit length n of the CRC.<br />If the input bit above the leftmost divisor bit is 0, do nothing. If the input bit above the<br /></div><br />Podejrzewam, że tu ma uzasadnienie to:<br />[syntax=c]#define SHIFTED_DIVISOR 0x988000 //This is the 0x0131 polynomial shifted to farthest left of three bytes[/syntax]<br />W bibliotece arduino jest odnośnik do wiki: <!-- m --><a class="postlink" href="http://en.wikipedia.org/wiki/Computation_of_cyclic_redundancy_checks" >http://en.wikipedia.org/wiki/Computatio ... ncy_checks</a><!-- m --><br />ale dalej nie wiem skąd SHIFTED_DIVISOR. Widzę, że 0x988 to przesunięcie w prawo o trzy 0x0131 z dopisanymi 12ma zerami z prawej, ale skąd u diabła akurat takie wartości? Ma to związek z wielomianem X^8 + X^5 + X^4 + 1, który jest podany w DS czujnika?<br /><br />Proszę uprzejmie o wskazówki i pozdrawiam,<br />Dawid.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=11277">dawid75_75</a> — 14 sie 2016, o 10:10</p><hr />
]]></content>
</entry>
</feed>