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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2018-02-12T12:32:16+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=56&amp;t=3556&amp;mode</id>
<entry>
<author><name><![CDATA[mes mariusz]]></name></author>
<updated>2016-01-30T20:42:51+01:00</updated>
<published>2016-01-30T20:42:51+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3556&amp;p=152151#p152151</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3556&amp;p=152151#p152151"/>
<title type="html"><![CDATA[Re: Jak CRC  wykrywa błędy transmisji? cz.2]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3556&amp;p=152151#p152151"><![CDATA[
&quot;Pierwsze czytanie&quot; mam już za sobą. Tekstów kolegi <strong>mg101</strong> naprzemiennie z pierwowzorem z EP.<br /><br />Przyznam, że temat (generalnie) wygląda obszernie. Stąd naszła mnie chęć, by może zacząć od... praktyki, a za teorię zabrać się w międzyczasie.<br />Biorąc pod uwagę najprostsze środowisko, jakie (nieprzyzwoicie) przychodzi mi do głowy mamy coś takiego:<br /><br /><!-- m --><a class="postlink" href="http://avrhelp.mcselec.com/index.html?crc32.htm" >http://avrhelp.mcselec.com/index.html?crc32.htm</a><!-- m --><br /><br />Z tego co wylicza zaimplementowana, gotowa do użycia procedura, wynika, że suma CRC32 dla tablicy [1, 2, 3] wynosi 494976085.<br /><br />Tyle potrafię zrobić z palca po stronie uC, choćby i w tej chwili.<br /><br />Teraz najchętniej uruchomiłbym CodeBlocks (C++) i wypróbował jakąś gotową bibliotekę do liczenia crc32, tworząc taką samą tablicę [1, 2, 3] w celu sprawdzenia, czy obliczona zostanie taka sama suma kontrolna.<br /><br />Zdaje się, że coś gotowego znalazłem:<br /><!-- m --><a class="postlink" href="https://fossies.org/dox/codeblocks_13.12-1/plugins_2contrib_2devpak__plugin_2crc32_8cpp.html" >https://fossies.org/dox/codeblocks_13.1 ... _8cpp.html</a><!-- m --><br /><!-- m --><a class="postlink" href="https://fossies.org/dox/codeblocks_13.12-1/plugins_2contrib_2devpak__plugin_2crc32_8cpp_source.html" >https://fossies.org/dox/codeblocks_13.1 ... ource.html</a><!-- m --><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=7975">mes mariusz</a> — 30 sty 2016, o 20:42</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mg101]]></name></author>
<updated>2016-01-30T19:55:53+01:00</updated>
<published>2016-01-30T19:55:53+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3556&amp;p=152148#p152148</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3556&amp;p=152148#p152148"/>
<title type="html"><![CDATA[Re: Jak CRC  wykrywa błędy transmisji? cz.2]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3556&amp;p=152148#p152148"><![CDATA[
Przepraszam <br />To miało być na PW<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=683">mg101</a> — 30 sty 2016, o 19:55</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mes mariusz]]></name></author>
<updated>2016-01-30T14:38:55+01:00</updated>
<published>2016-01-30T14:38:55+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3556&amp;p=152123#p152123</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3556&amp;p=152123#p152123"/>
<title type="html"><![CDATA[Re: Jak CRC  wykrywa błędy transmisji? cz.2]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3556&amp;p=152123#p152123"><![CDATA[
Zakładam, że znalezione błędy zostały poprawione (właśnie zabieram się za czytanie <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";-)" title="Puszcza oko" />. <br /><br />Ogarnąłem teorię programowania flash AVR z poziomu bootloadera (umiem to zrobić) ale przed sensownym użyciem pozostaje implementacja CRC. <br />Być może będę przepychał do uC całą, pojedynczą stronę kodu maszynowego (generując wcześniej CRC) a następnie sprawdzał blok po stronie uC (bootloadera) i podejmował decyzję o sapisie strony lub nie. Być może z lektury tekstu wyniknie, czy warto sprawdzać cały blok (128 słów = 256 bajtów) czy może warto podzielić strony na mniejsze bloki. <br /><br />Znikam czytać i pozdrawiam.<br />Mariusz<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=7975">mes mariusz</a> — 30 sty 2016, o 14:38</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2014-11-06T15:09:28+01:00</updated>
<published>2014-11-06T15:09:28+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3556&amp;p=102621#p102621</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3556&amp;p=102621#p102621"/>
<title type="html"><![CDATA[Re: Jak CRC  wykrywa błędy transmisji? cz.2]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3556&amp;p=102621#p102621"><![CDATA[
Dokładnie jak mówisz, więc to się nazywa po prostu pomoc a nie krytyka <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> — 6 lis 2014, o 15:09</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[hexen2k]]></name></author>
<updated>2014-11-06T15:08:09+01:00</updated>
<published>2014-11-06T15:08:09+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3556&amp;p=102620#p102620</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3556&amp;p=102620#p102620"/>
<title type="html"><![CDATA[Re: Jak CRC  wykrywa błędy transmisji? cz.2]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3556&amp;p=102620#p102620"><![CDATA[
Dlatego tak istotny jest feedback od czytelników <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br />Konstruktywna krytyka pozytywnie wpływa na udoskonalanie produktów - w tym przypadku tego poradnika. Pozwoli innym uniknąć cennych godzin spędzonych na poszukiwaniach błędu.<br /><br />Pozdrowienia<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=6027">hexen2k</a> — 6 lis 2014, o 15:08</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2014-11-06T15:02:31+01:00</updated>
<published>2014-11-06T15:02:31+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3556&amp;p=102614#p102614</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3556&amp;p=102614#p102614"/>
<title type="html"><![CDATA[Re: Jak CRC  wykrywa błędy transmisji? cz.2]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3556&amp;p=102614#p102614"><![CDATA[
Dziękuję w imieniu autora za cenne uwagi, pewnie jeśli autor to zobaczy to się odniesie i wprowadzi poprawki. Trzeba jednak mieć na uwadze że w tak obszernym materiale każdemu może się ręka omsknąć <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br />przy okazji fajny blog kolega polecił.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 6 lis 2014, o 15:02</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[hexen2k]]></name></author>
<updated>2014-11-06T14:04:36+01:00</updated>
<published>2014-11-06T14:04:36+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3556&amp;p=102610#p102610</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3556&amp;p=102610#p102610"/>
<title type="html"><![CDATA[Re: Jak CRC  wykrywa błędy transmisji? cz.2]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3556&amp;p=102610#p102610"><![CDATA[
Słowa uznania i pochwały dla autora za niemały wkład pracy włożony w opracowanie zagadnienia na tak wysokim poziomie merytorycznym!<br /><br />Dziwi jednak fakt, iż pomimo blisko 16-to miesięcznego okresu od publikacji nikt nie zwrócił uwagi na istotne błędy występujące w poradniku.<br /><br />Pomijając drobne błędy w postaci nieprawidłowych odnośników do obrazków czy czeskich błędów np. pod rys. 34:<br />4 - tablica zawiera 256 wierszy po 8 bajtów (po 32 bity) (256 = FF) - oczywiście zawiera 256 wierszy po 4 bajty (32bity).<br /><br />W artykule od rozdziału 14 są bardzo poważne blędy! <br />Wartość generatora/dzielnika dla CRC32 wynosi 0x04C11DB7, natomiast autor podaje (1) 04 A1 1D B7 - zamiast watrtości A ma być C. Wykorzystanie tego generatora daje nieprawidłowe wyniki w dalszych obliczeniach.<br /><br />Rys. 36 kombinacja dla bajtu sterującego 21 jest nieprawidłowo obliczona (ta nieprawidłowa wartość wykorzystywana jest też wcześniej). Poza tym zdaje się przedstawia tworzenie bajtu dla algorytmu tablicowego nieodwróconego - pamiętajmy o tym podczas analiz, podczas transmisji danych często wykorzystuje się algorytm tablicowy odwrócony ze względu na inną kolejność przesyłania poszczególnych bitów (najpierw LSB).<br /> <br /><br />Jako uzupełnienie i można powiedzieć 3 część tego opracowania polecam lekturę:<br /><!-- m --><a class="postlink" href="http://uhex.blogspot.com/2014/11/tworzenie-tablic-dla-odwroconego.html" >http://uhex.blogspot.com/2014/11/tworze ... onego.html</a><!-- m --><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=6027">hexen2k</a> — 6 lis 2014, o 14:04</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[atmel]]></name></author>
<updated>2013-07-17T08:39:57+01:00</updated>
<published>2013-07-17T08:39:57+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3556&amp;p=42139#p42139</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3556&amp;p=42139#p42139"/>
<title type="html"><![CDATA[Re: Jak CRC  wykrywa błędy transmisji? cz.2]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3556&amp;p=42139#p42139"><![CDATA[
Może dodam swoją funkcję do obliczania 8-mio bitowego CRC, którego używam od jakiegoś czasu:<br /><br />[syntax=c]uint8_t crc8(uint64_t Value)<br />{<br />uint64_t Divisor = 0b110000110;<br />int8_t i = 0;<br />while (Value&gt;&gt;++i);<br />Value &lt;&lt;= 8;<br />for (i--; i &gt;= 0; i--)<br />if (Value&gt;&gt;i&gt;&gt;8)<br />Value ^= Divisor&lt;&lt;i;<br />return Value;<br />}[/syntax]<br />Typ uint64_t może się okazać za duży, dlatego można go zmieniać w zależności od wielkości danych wejściowych.<br /><br />Użycie dla kilku bajtów danych:<br /><br />[syntax=c]uint8_t CrcValue = crc8(Data3&lt;&lt;16 | Data2&lt;&lt;8 | Data1);[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1183">atmel</a> — 17 lip 2013, o 08:39</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2013-07-17T06:34:21+01:00</updated>
<published>2013-07-17T06:34:21+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3556&amp;p=42132#p42132</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3556&amp;p=42132#p42132"/>
<title type="html"><![CDATA[Re: Jak CRC  wykrywa błędy transmisji? cz.2]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3556&amp;p=42132#p42132"><![CDATA[
Nie mogłem się doczekać i rano wstałem żeby chociaż kawałek poczytać sobie na spokojnie. Na razie zdążyłem przeczytać prawie 50% części pierwszej i już mi się hmm rozjaśniło o co chodzi <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> wcześniej miałem zatyczkę w głowie na etapie startu obliczania sumy z przesyłanej liczby - chodzi mi o zasadę - a tu ??? .... no w końcu ktoś pokazał to bez ...<br /><br /><div class="quotetitle">mg101 napisał(a):</div><div class="quotecontent"><br />Odpuściłem sobie opracowania z dużą ilością teorii. Jakieś algebry wielomianów, ciała Galois, lematy, twierdzenia i inne bajadery.<br /></div><br /><br />BRAWO !  - bo okazuje się , że metodą tzw łopatologiczną można prościej a zrozumie to praktycznie każdy .... <br /><br />Dobra lecę do roboty - resztę wrażeń i ocen artykułu opiszę później <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> .... ale znowu dodam - KAWAŁ DOBREJ ROBOTY kolega mg101 wykonał.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 17 lip 2013, o 06:34</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2013-07-16T21:53:47+01:00</updated>
<published>2013-07-16T21:53:47+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3556&amp;p=42117#p42117</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3556&amp;p=42117#p42117"/>
<title type="html"><![CDATA[Re: Jak CRC  wykrywa błędy transmisji? cz.2]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3556&amp;p=42117#p42117"><![CDATA[
<div class="quotetitle">Antystatyczny napisał(a):</div><div class="quotecontent"><br />A ja się zastanawiałem, czy słusznie czynię przenosząc to do ogłoszeń <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" />  Stwierdziłem jednak, że to wiedza fundamentalna i musi być lepiej widoczna <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /></div><br /><br />Tak Anty ale mamy dwie części - poza tym jak się daje do ogłoszeń a na górze jest jakiś za duży obrazek to strasznie deformuje się pierwsza strona portalu<br /><br />dlatego na razie robię porządek z obrazkami i już pierwsza część wisi GLOBALNIE jak widzisz na stronie portalu - dzięki niej można będzie łatwo trafić do drugiej - zaraz na końcu zorganizuję LINK jeszcze - no i całą grafikę wraz z Jagim zaczęliśmy przenosić z kociego imageshacka na nasz serwer - a ja kończę i jeszcze robię tło wodne naszego forum na obrazkach<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 16 lip 2013, o 21:53</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2013-07-16T21:05:37+01:00</updated>
<published>2013-07-16T21:05:37+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3556&amp;p=42107#p42107</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3556&amp;p=42107#p42107"/>
<title type="html"><![CDATA[Re: Jak CRC  wykrywa błędy transmisji? cz.2]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3556&amp;p=42107#p42107"><![CDATA[
<div class="quotetitle">Jaglarz napisał(a):</div><div class="quotecontent"><br />Dobra Mirku, przeniosę, w ramach czynu społecznego ZSMP.<br /></div><br /><br />aha ok bo ja już pierwszy rysunek przeniosłem z pierwszej części ale też troszkę uporządkowałem startowe rysunki żeby główna strona portalu się nie rozjeżdżała<br /><br />ale zaraz Jagi poczekaj<br /><br />wiesz co ? może ja przeniosę - a że poradnik jest świetny to dodam znak wodny naszego forum na rysunki - będzie troszkę roboty ale zrobię to z przyjemnością ok<br /><br />nie obrazisz się?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 16 lip 2013, o 21:05</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Jaglarz]]></name></author>
<updated>2013-07-16T21:03:12+01:00</updated>
<published>2013-07-16T21:03:12+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3556&amp;p=42106#p42106</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3556&amp;p=42106#p42106"/>
<title type="html"><![CDATA[Re: Jak CRC  wykrywa błędy transmisji? cz.2]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3556&amp;p=42106#p42106"><![CDATA[
Dobra Mirku, przeniosę, w ramach czynu społecznego ZSMP.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=471">Jaglarz</a> — 16 lip 2013, o 21:03</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2013-07-16T20:49:43+01:00</updated>
<published>2013-07-16T20:49:43+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3556&amp;p=42100#p42100</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3556&amp;p=42100#p42100"/>
<title type="html"><![CDATA[Re: Jak CRC  wykrywa błędy transmisji? cz.2]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3556&amp;p=42100#p42100"><![CDATA[
Ja też zacząłem czytać - i już z niecierpliwości po prostu najpierw rzuciłem szybko okiem na całość i na rysunki ....<br /><br />szczęki jeszcze zbieram z podłogi ... <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> pełną ocenę dam po przeczytaniu całości .... ale już sam wstęp o kowalskim co to pożyczył kasę ... nieeee ... no zapowiada się mega-zaje-fajnie <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br />a miałem teraz wieczorkiem co innego porobić - za to będę czytał i czytał <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> — 16 lip 2013, o 20:49</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[PawelGaj]]></name></author>
<updated>2013-07-16T20:06:51+01:00</updated>
<published>2013-07-16T20:06:51+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3556&amp;p=42091#p42091</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3556&amp;p=42091#p42091"/>
<title type="html"><![CDATA[Re: Jak CRC  wykrywa błędy transmisji? cz.2]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3556&amp;p=42091#p42091"><![CDATA[
FENOMENALNY tutorial ! Wielkie dzięki za to. Na razie tylko pobieżnie rzuciłem okiem, &quot;przerzucie&quot; tej wiedzy z pewnością zajmie mi trochę czasu i na pewno przyda mi się to <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" />. I jeszcze raz wielkie dzięki <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=784">PawelGaj</a> — 16 lip 2013, o 20:06</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mg101]]></name></author>
<updated>2018-02-12T12:32:16+01:00</updated>
<published>2013-07-16T19:22:45+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3556&amp;p=42078#p42078</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3556&amp;p=42078#p42078"/>
<title type="html"><![CDATA[Jak CRC  wykrywa błędy transmisji? cz.2]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3556&amp;p=42078#p42078"><![CDATA[
<strong>Uwaga<br />Lepsza wersja! </strong><br /><!-- m --><a class="postlink" href="http://jaktodziala.eu/" >http://jaktodziala.eu/</a><!-- m --><br /><img src="http://forum.atnel.pl/_obrazki/o/54/24a06b48734780854be5a5d019a32d65.jpg" alt="Obrazek" /><br /><span style="font-size: 150%; line-height: normal"><strong>Rozdz. 8 Ostateczna wersja rejestru CRC</strong></span><br /><br />Pod rejestrem <strong>CRC</strong> są &quot;fotografie&quot; 9 stanów rejestru <strong>CRC</strong> i <strong>Dzielna + 3 zera</strong> dla dzielnej <strong>100011</strong>. Jest to powtórzony rys. 14.2 z <strong>części 1</strong> artykułu.<br />Zrób schemat rejestru <strong>CRC </strong> w/g poniższego przepisu  &quot;na małpę&quot;, a układ na pewno obliczy resztę z wprowadzonej <strong>dzielnej</strong> ( oczywiście z 3 dodatkowymi zerami) przez dzielnik <strong>1011</strong>. Słowo harcerza.<br /><strong>1 - Napisz</strong> dzielnik<br /><strong>2 - Wstaw</strong> między bity dzielnika przerzutniki typu <strong>D (D2, D1, D0)</strong><br /><strong>3 - Dokończ </strong> schemat, tak jak na rys. 15<br /><img src="http://forum.atnel.pl/_obrazki/o/54/206136b0a8b055a9b90bb5f126a1843b.jpg" alt="Obrazek" /><br /><strong>Rys. 15 Rejestr CRC</strong><br />Analogicznie możesz zbudować <strong>CRC</strong> dla dowolnego dzielnika. np <strong>1011011000010101</strong>. Ważne tylko, żeby dzielnik zaczynał i kończył się <strong>jedynką</strong>.<br />Pierwsze pytanie. A gdzie <strong>ROM</strong> dzielnika? Odpowiedź- Jest ujęty w sprzężeniu zwrotnym zawierającym (lub nie) <strong>xor</strong>-y. Super. Z układu znika <strong>ROM</strong>. <br /><strong>Gdy &quot;małpa&quot; wystarczy </strong> - przejdź do rozdziału <strong>9</strong>. <br /><strong>Gdy nie</strong> - dokończ rozdz. <strong>8</strong>.<br /><strong>Najpierw o samym D</strong><br /><img src="http://forum.atnel.pl/_obrazki/o/54/7202ee11ef519c8577b06516681d9b2c.png" alt="Obrazek" /><br /><strong>Rys.15.1 Przerzutnik typu D </strong><br /><strong>Narastające</strong> zbocze zegara (czerwone) zapamiętuje wejście <strong>x</strong> gdzieś wewnątrz przerzutnika<strong>. Opadające</strong> zbocze zegara (zielone) odtwarza ten stan na wyjściu <strong>D</strong> przerzutnika. Czyli wyjście przerzutnika odtwarza stan wejścia z opóźnieniem impulsu zegarowego.    Opóźnienie umożliwia realizację takich układów, jak np. rys. 15, w których na wejście mogą wchodzić sygnały zależne (tu pośrednio) od wyjścia. Możliwy jest nawet pojedynczy przerzutnik typu <strong>D</strong>, którego wyjście (ale w stanie <strong>następnym</strong>), zależy od tego wyjścia <strong>D</strong> (ale w stanie <strong>aktualnym</strong>) i od wejścia <strong>x</strong> przerzutnika (też w stanie <strong>aktualnym</strong>). Przykład tego znajdziesz dalej na  rys. 23.<br />Analiza układu na rys. 15, gdy <strong>dzielną + 3 zera</strong> jest <strong>100011<span style="color: #FF0000">000</span></strong>. <br /><strong>Gdy wyjście D2=0</strong> to <strong>D1</strong> i <strong>D0</strong> oraz <strong>D0</strong> i <strong>komunikat</strong> będą miały bezpośrednie połączenie. Takie same jak <strong>D2</strong> i <strong>D1</strong>. Dlatego że <strong>0</strong> <strong>XOR</strong> <strong>x</strong> = <strong>x</strong>. Patrz rozdz. 5 cz. 1. Czyli w następnym okresie <strong>CRC</strong> będzie zachowywał się jak zwykły rejestr przesuwny. <br />W stanie <strong>0</strong> D2=<strong>0</strong>. Czyli następny stan <strong>1</strong> to przesunięte bity D1, D0 i najstarszy bit komunikatu <strong>1</strong>, czyli <strong>001</strong><br />W stanie <strong>1</strong> D2=<strong>0</strong>. Czyli następny stan <strong>2</strong> to przesunięte bity D1, D0 i najstarszy bit komunikatu <strong>1</strong>, czyli <strong>010</strong><br />W stanie <strong>2</strong> D2=<strong>0</strong>. Czyli następny stan <strong>3</strong> to przesunięte bity D1, D0 i najstarszy bit komunikatu <strong>1</strong>, czyli <strong>100</strong> <br />W stanie <strong>3</strong> D2=<strong>1</strong>. Czyli następny stan <strong>4</strong> to....??? No właśnie jaki będzie ten stan <strong>4</strong>?<br /><strong>Teraz:</strong> <br />na <strong>wejście D2</strong> wchodzi <strong>D0</strong> (bezpośrednie połączenie)<br />na <strong>wejście D1</strong> wchodzi <strong>1</strong> XOR <strong>D0</strong> czyli <strong>Negacja</strong> <strong>D0</strong><br />na <strong>wejście D0</strong> wchodzi <strong>1</strong> XOR <strong>komunikat</strong> czyli <strong>Negacja</strong> <strong>komunikat</strong><br />Dokończmy więc przerwane wyżej zdanie.<br />W stanie <strong>3</strong> D2=<strong>1</strong>. Czyli następny stan <strong>4</strong> to <strong>011</strong> <br /><strong>Wyjaśnienie dla stanu 4</strong><br />D2=<strong>0</strong> bo w poprzednim stanie<strong>3</strong> D1=<strong>0</strong> a między D2 i D1 jest zwykłe połączenie <br />D1=<strong>1</strong> bo w poprzednim stanie<strong>3</strong> D0=<strong>0</strong> a na D1 wchodzi <strong>Negacja</strong> (<strong>D0=0</strong>), czyli <strong>1</strong><br />D0= <strong>1</strong>  bo w poprzednim stanie<strong>3</strong> komunikat=<strong>0</strong> a na D0 wchodzi <strong>Negacja</strong> (<strong>komunikat=0</strong>), czyli <strong>1</strong><br />Jedziemy dalej: <br />W stanie <strong>4</strong> D2=<strong>0</strong>. Czyli następny stan <strong>5</strong> to przesunięte bity D1, D0 i najstarszy bit komunikatu <strong>1</strong>, czyli <strong>111</strong> <br />....<br />W ten sposób dojdziemy do stanu końcowego<br /><strong>CRC</strong> = <strong>111</strong> <br />Czyli <strong>111</strong> jest resztą z dzielenia <strong>100011</strong> przez <strong>1011</strong><br />Może to było mętne. W każdym bądź razie starałem się przekonać,że układ z rys. 15 oblicza resztę z dzielenia.<br /><br /><span style="font-size: 150%; line-height: normal"> Rozdz. 9 Nadajnik-Odbiornik z CRC </span>. <br /><strong>Wstęp</strong><br />Przedstawione niżej rys. <strong>17...21</strong> zawierają wszystkie stany <strong>Nadajnika</strong> wysyłającego do <strong>Odbiornika</strong> komunikat <strong>100011</strong> wykorzystując dzielnik <strong>1011</strong> do wykrywania błędów. Przypomnę tylko, że dzielnik ten jest ujęty w strukturze rejestru <strong>CRC-N</strong> nadajnika i w <strong>CRC-O</strong> odbiornika--&gt; <strong>rys. 16</strong>.Rysunek ten przedstawia schemat dokładny i uproszczony. Dalej będą używane tylko schematy uproszczone <strong> CRC </strong> (<strong>CRC-N</strong> dla Nadajnika i <strong>CRC-O</strong> dla Odbiornika). Gdy na torze między nadajnikiem i odbiornikiem (np w kablu) nie wystąpiły przekłamania, to <strong>w każdym stanie wartości rejestrów CRC-N i CRC-O  są takie same</strong>, co łatwo zauważyć. Stany <strong>0...9</strong> odpowiadają stanom<strong> 0...9</strong> z <strong>rys. 15</strong>. W stanie <strong>9</strong> w rejestrach tych będzie ta sama wartość, reszta z dzielenia <strong>100011:1101</strong> równa <strong>111</strong>. Następnie w stanach <strong>10,11,12</strong> wartość z <strong>CRC-N</strong> wprowadzana jest do <strong>CRC-O</strong>, w celu ich porównania. <br />W stanie <strong>12</strong> wartość <strong>CRC-O = 000</strong>, co oznacza, że nie wystąpiły błędy transmisji. Puste bity na rysunkach, oznaczają że nic do nich nie zostało jeszcze wpisane, albo że nie mają już żadnego znaczenia. Gdybym wpisał tam np. zera, to trudniej  byłoby zauważyć,  jak<strong> &quot;bity przesuwają się&quot;</strong> w każdym stanie.<br />Rysunki <strong>17...21</strong> są podobne do rys. <strong>1,2</strong> lub<strong> 3,4</strong>. z części 1. Drobne różnice wynikają z tego, że na rys. <strong>1,2</strong> lub <strong>3,4</strong> obowiązuje reszta <strong>zwykłego</strong> dzielenia, a na rys. <strong>17...21</strong> obowiązuje reszta z dzielenia <strong>xor</strong>-owego. <br /><br /><img src="http://forum.atnel.pl/_obrazki/o/54/203fbbfd63a31b184b69a9e1eab0fb88.png" alt="Obrazek" /><br /><strong>Rys.16 Rejestr CRC schemat dokładny i uproszczony</strong><br /><br /><img src="http://forum.atnel.pl/_obrazki/o/54/6554699411a52087df33630fbd69267f.png" alt="Obrazek" /><br /><strong>Rys. 17 Nadajnik-Odbiornik stany 0,1,2</strong><br /><strong>Stan 0</strong> Rejestr Nadajnika <strong>RN</strong> zawiera komunikat do wysłania <span style="color: #FF0000">+3 zera</span> tj. <strong>110101<span style="color: #FF0000">000</span></strong>. Rejestry <strong>RN</strong> i <strong>RO</strong> są zawsze rejestrami przesuwnymi.<br />W stanach<strong> 0,1,2 </strong>rejestry <strong>CRC-N</strong> i <strong>CRC-O</strong>zachowują się bardzo miło. A to dlatego że jedynka nie dotarła jeszcze do najstarszego bitu. Ponieważ w najstarszym bicie jest <strong>0</strong>, to zgodnie z algorytmem (rys. 15) w następnym stanie bity w rejestrach będą tylko przesunięte. W stanie <strong>3</strong> jedynka co prawda już dotarła do najstarszego bitu <strong>CRC-N</strong> i <strong>CRC-O</strong>. Ale dopiero w następnym stanie <strong>4</strong>, zgodnie z algorytmem, po przesunięciu , nastąpi <strong>xor</strong>-owanie odpowiednich bitów. Dlatego rejestry <strong>CRC-N</strong> i <strong>CRC-O</strong> do końca stanu <strong>3</strong>,  zachowują się jak zwykłe rejestry przesuwne. Stan wszystkich rejestrów zależy też od położeń przełączników <strong>K1 i K2</strong>. Dotyczy to wszystkich rysunków <strong>17...21</strong>.<br /><strong>stan 1</strong> - jako następny po <strong>stanie 0</strong> --&gt; rys. 15<br /><strong>stan 2</strong> - jako następny po <strong>stanie 1</strong> --&gt; rys. 15<br /><strong>stan 3</strong> - jako następny po <strong>stanie 2</strong> --&gt; rys. 15<br /><br /><img src="http://forum.atnel.pl/_obrazki/o/54/9a37a59864a317118c1688bf0b7d3eaf.png" alt="Obrazek" /><br /><strong>Rys. 18 Nadajnik-Odbiornik stany 3,4,5</strong><br />Od tej pory rejestry mogą być tylko przesunięte lub przesunięte i <strong>xor</strong>-owane  . Już nie jest tak miło jak w stanach <strong>0,1,2</strong>.<br /><strong>stan 3</strong> - jako następny po <strong>stanie 2</strong> --&gt; rys. 15<br /><strong>stan 4</strong> - jako następny po <strong>stanie 3</strong> --&gt; rys. 15<br /><strong>stan 5</strong> - jako następny po <strong>stanie 4</strong> --&gt; rys. 15<br /><br /><img src="http://forum.atnel.pl/_obrazki/o/54/7757d87dc36ab6610d6303a048fc067f.png" alt="Obrazek" /><br /><strong>Rys. 19 Nadajnik-Odbiornik stany 6,7,8</strong><br /><strong>stan 6</strong> - jako następny po <strong>stanie 5</strong> --&gt; rys. 15 <br />Cały komunikat <strong>100011</strong> został już przesłany do <strong>RO</strong>. Nie ma sensu przesyłania <span style="color: #FF0000">000</span>. Dlatego pod koniec tego stanu zmieni się położenie przełącznika <strong>K1</strong>. Do końca transmisji zawartość <strong>RO</strong> nie ulegnie zmianie. Następnie będą modyfikowane tylko <strong>CRC-N</strong> i <strong>CRC-O</strong>. Będą też &quot;znikać&quot; zera w <strong>RN</strong>.<br /><strong>stan 7</strong> - jako następny po <strong>stanie 6</strong> --&gt; rys. 15 (widać zmienione <strong>K1</strong>) <br /><strong>stan 8</strong> - jako następny po <strong>stanie 7</strong> --&gt; rys. 15  <br /><br /><img src="http://forum.atnel.pl/_obrazki/o/54/41e0799d51097b4be27ddcd3a7206991.png" alt="Obrazek" /><br /><strong>Rys. 20 Nadajnik-Odbiornik stany 9,10,11 </strong><br /><strong>stan 9</strong>.. - jako następny po <strong>stanie 8</strong> --&gt; rys. 15 <br />W <strong>CRC-N</strong> i <strong>CRC-O</strong> jest już ostatecznie obliczona ta sama reszta z dzielenia <strong>111</strong>. <strong>Ta sama</strong>-tzn. że na kablu <strong>Nadajnik</strong>-<strong>Odbiornik</strong> nie było zakłóceń. W następnych stanach <strong>10,11,12</strong> <strong>Odbiornik</strong> będzie sprawdzał, czy rzeczywiście są takie same. Dane z <strong>CRC-N</strong> w <strong>Nadajniku</strong> będą więc wprowadzane do <strong>CRC-O</strong> w <strong>Odbiorniku</strong> i porównywane <strong>bit po bicie</strong>.Pod koniec stanu <strong>9</strong> zmieni się położenie <strong>K2</strong>. W następnych stanach <strong>10,11,12</strong> najstarszy bit <strong>CRC-N</strong> będzie wprowadzany do najmłodszego bitu <strong>CRC-O</strong><br /><br /><strong>stan 10</strong> - jako następny po <strong>stanie 9</strong> <br />Widać zmienione położenie <strong>K2</strong>. Pojawił się też dodatkowy niebieski bit, do którego będzie wprowadzany najstarszy bit z <strong>CRC-O</strong>. Jednocześnie do najmłodszego  bitu <strong>CRC-O</strong> będzie wprowadzony najstarszy bit z <strong>CRC-N</strong> i <strong>natychmiast</strong> porównany z bitem niebieskim. Czyli będą porównane 2 najstarsze bity z <strong>CRC-N</strong> i <strong>CRC-O</strong> ze stanu poprzedniego. <strong>Porównanie </strong> czyli <strong>xor</strong>-owanie. Ponieważ były takie same, to w najmłodszym bicie <strong>CRC-O</strong> będzie <strong>0</strong>.<br /><br /><strong>stan 11</strong> - jako następny po <strong>stanie 10</strong>. <br />Porównane będą 2 następne bity z <strong>CRC-N</strong> i <strong>CRC-O</strong>. Wynik (<strong>0</strong>) wpisany będzie do najmłodszego bitu <strong>CRC-O</strong>.<br /><br /><img src="http://forum.atnel.pl/_obrazki/o/54/3c1d83c24418270fb9f6928614203c2c.png" alt="Obrazek" /><br /><strong>Rys. 21 Nadajnik-Odbiornik stany 12 - ostatni</strong><br /><strong>stan 12 - ostatni</strong> - jako następny po <strong>stanie 11</strong> <br />Porównane będą 2 następne bity z <strong>CRC-N</strong> i <strong>CRC-O</strong>. Wynik (<strong>0</strong>) wpisany będzie do najmłodszego bitu <strong>CRC-O</strong>.<strong>KONIEC!!!--ZWYCIĘSTWO</strong>. Rejestr  <strong>CRC-O</strong> = <strong>000</strong> oznacza, że <strong>(z pewnym prawdopodobieństwem!)</strong> nie było błędów transmisji. Dlaczego <strong>z pewnym prawdopodobieństwem?</strong> Mogło tak się zdarzyć, że były zakłócenia na linii, ale przypadkowo &quot;zakłócona&quot; liczba (inna niż nadana!) dała taką samą resztę  resztę jak liczba nadana. <br /><strong>Podsumowanie:</strong><br />Każdorazowemu wprowadzeniu bitu z <strong>RN</strong> do <strong>RO</strong> towarzyszą  aktualizacje rejestrów <strong>CRC-N</strong> w nadajniku i <strong>CRC-O</strong> w odbiorniku. Jeżeli na kablu <strong>Nadajnik-Odbiornik</strong> nie było zakłóceń, to w każdej chwili <strong>CRC-N</strong> = <strong>CRC-O</strong> . Gdy cały komunikat znajdzie się w <strong>RO</strong> to <strong>CRC-N</strong> = <strong>CRC-O</strong> = <strong>111</strong>. W 3 następnych krokach porównujemy zawartości tych rejestrów. Końcowy stan <strong>CRC-O = 000</strong> oznacza, że nie było błędów. <br /><br /><strong>Można zaproponować pewna modyfikację wyżej opisanej metody</strong><br />Wróć na chwilę do rys. <strong>14.3 w rozdz. 8</strong>. Gdybyśmy jakimś cudem w stanie <strong>0</strong> znali <strong>resztę = 111</strong> i wstawili ją jako <span style="color: #FF0000">111</span> , zamiast<span style="color: #FF0000"> 000,</span> to w stanie <strong>9</strong> będzie <strong>CRC = 000</strong>. Można teraz zaproponować 2 wersje zmodyfikowanej metody.<br /><strong>Metoda nr 1</strong> Prymitywna. Są 2 cykle. W pierwszym cyklu obliczymy resztę <strong>111</strong>. Drugi cykl, to powtórzony pierwszy tylko zamiast <span style="color: #FF0000">000</span> damy resztę <span style="color: #FF0000">111</span>. Obliczona w 2 cyklu reszta = <strong>000</strong>, oznacza że nie było błędów. Podstawowa wada, to 2 razy wydłużony czas transmisji.<br /><strong>Metoda nr 2</strong> Zauważmy, że<strong> CRC</strong> w stanach  0...6 na rys. <strong>14.2 i 14.3</strong> nie różnią się. Jest to oczywiste, bo 3 ostatnie bity <span style="color: #FF0000">000</span> lub <span style="color: #FF0000">111</span> jeszcze nie dotarły do <strong>CRC</strong>. Zapamiętajmy więc stan <strong>CRC </strong> w stanie <strong>6</strong> w jakimś rejestrze pomocniczym. Potem w 3 krokach dojdziemy do staniu <strong>9</strong>, w którym mamy obliczoną resztę <strong>CRC=111</strong>. Teraz wprowadźmy z rejestru pomocniczego do <strong>CRC</strong> ten zapamiętany stan <strong>6 </strong> (<strong>CRC=100</strong>). Czyli sztucznie wróciliśmy do stanu <strong>6</strong>. Zaś do rejestru <strong>Dzielna + 3 zera</strong> wprowadzimy resztę <strong>111</strong> (którą już znamy!).  Dojdziemy do stanu końcowego<strong> CRC = 000</strong>. Oznacza ,że transmisja była bezbłędna! I zrobiliśmy to tylko w <strong>jednym</strong> cyklu. Co prawda, wydłużonym o 3 dodatkowe kroki. Nie będę analizował elektroniki dla zmodyfikowanej metody a ściślej dla metody nr 2 .Chyba jest trochę bardziej skomplikowana niż na rys. <strong>17...21</strong><br /><img src="http://forum.atnel.pl/_obrazki/o/54/8efe194a0a74962d64749f6ba3e88223.png" alt="Obrazek" /><br /><strong>Rys. 22 Metoda zmodyfikowana </strong><br /><br /><strong><span style="font-size: 150%; line-height: normal">Rozdz. 10 Takie sobie rozważania o dzielnej, dzielniku i rejestrze CRC</span></strong><br />Często słyszymy coś takiego. Komunikat ma 10 000 bitów. Wystąpiły przekłamania tylko na 2 pozycjach bitowych tego komunikatu. <strong>Dany algorytm ze 100% pewnością wykrywa te przekłamania</strong>. Tu powinna się zapalić czerwona lampka. Przecież nie ma rzeczy w 100 % pewnych. Nie mam przecież 100% pewności, że jutro nie zapuka do mnie Jej Wysokość Królowa Elżbieta II i powie &quot;hello&quot;. Prawdopodobieństwo że takie zdarzenie zajdzie (tzn. jutro ta pani nie zapuka) to jest 99,99999999999...%. Ale nie 100%. Dlatego zdanie o tych 2 przekłamaniach powinno brzmieć.  <strong>Dany algorytm ze 100% pewnością wykrywa te przekłamania  <span style="color: #FF0000">powstałe na torze sygnałowym między Nadajnikiem i Odbiornikiem</span></strong>. Czyli milcząco zakładamy, że elektronika nadajnika i odbiornika realizuje ze 100% pewnością dany algorytm. Elektronika jak żona Cezara, jest poza wszelkimi podejrzeniami.<br />Poważni ludzie zamiast słowa <strong>dzielna</strong>  używają <strong>komunikat</strong> lub <strong>wiadomość</strong> lub <strong>message</strong>. Tak samo zamiast <strong>dzielnik</strong> mówią <strong>wielomian generujący</strong> lub <strong>generator</strong>. Nie znalazłem innych nazw dla rejestru <strong>CRC</strong>, w którym będzie wynik <strong>reszta</strong> z dzielenia. Tu liczę na pomoc czytelników. <strong>Dzielnik</strong> może być przedstawiony, tak jak dotychczas, tzn. jako liczba binarna np. <strong>Dzielnik</strong> = <strong>1011</strong>. Symbol <strong>1011</strong> to skrócony zapis <strong>1</strong>x<strong>2</strong>^<strong>3</strong> + <strong>1</strong>x<strong>2</strong>^<strong>1</strong> + <strong>1</strong>x<strong>2</strong>^<strong>0</strong>, gdzie <strong>3</strong> to nr najstarszego bitu, a <strong>0</strong> to nr najmłodszego.  Nie powinienem tego pisać na szacownym forum, ale tak tylko sobie powiem, że <strong>2</strong>^<strong>0</strong> = <strong>1</strong>. Jest też inna forma przedstawiania dzielnika. Zamiast <strong>Dzielnik</strong> = <strong>1011</strong>, można napisać <strong>Wielomian generujący</strong> = <strong>x</strong>^<strong>3</strong> + <strong>x</strong>^<strong>1</strong> + <strong>1</strong>. Zauważ, że dla <strong>x</strong>=<strong>2</strong>  wartość tego wielomianu odpowiada dokładnie <strong>1011=9</strong>.  <br /><strong>Porozmawiajmy</strong> teraz o samym <strong>dzielniku</strong> ( inaczej, <strong>wielomianie generującym </strong> lub <strong>generatorze</strong>). Jak go dobierać, jaka powinna być jego długość ...itp. Powinien zaczynać i kończyć się na <strong>1</strong>. Czyli może to być np. <strong>11</strong>, <strong>101</strong> lub <strong>100001</strong>. Odpada za to  <strong>001</strong> lub <strong>00110100</strong>. Dlaczego? Chyba dlatego, że zera z lewej i prawej strony nie zawierają informacji ważnej dla obliczania reszty z dzielenia.<br /><strong>Zaczniemy</strong> od najprostszego <strong>dzielnika</strong>=<strong>11</strong> lub inaczej <strong>wielomian generujący</strong> = <strong>x</strong>^<strong>1</strong> + <strong>x</strong>^<strong>0</strong> = <strong>x</strong> +<strong>1</strong>. Odpowiada mu 1-bitowy rejestr <strong>CRC</strong>.<br /><img src="http://forum.atnel.pl/_obrazki/o/54/3c7c6a2e19a0211e64fac89a436e948d.png" alt="Obrazek" /> <br /><strong>Rys. 23 CRC dla dzielnika 11</strong><br />Rejestr <strong>CRC</strong> został zrealizowany zgodnie z rys. 15. Nowy stan przerzutnika <strong>D0</strong> jest <strong>xor</strong>-em z wejścia i poprzedniego stanu <strong>D0</strong>. Gdy na wejściu jest <strong>0</strong> to stan się nie zmieni (jak było <strong>0</strong> to będzie <strong>0</strong>, jak <strong>1 </strong> to też <strong>1</strong>). Gdy na wejściu jest <strong>1</strong>, to stan zmieni się na przeciwny. W technice cyfrowej <strong>toto</strong> nazywa się <strong>dwójka licząca</strong> lub <strong>przerzutnik typu T</strong>. Analizę pozostawiam Czytelnikowi. <strong>To jest klasyczny układ z bitem parzystości!</strong> Rzeczywiście, zakładając że stanem początkowym jest <strong>D0=0</strong>, to jeżeli nie było przekłamań to bit ten pozostanie też <strong>0</strong>. Gdy nie ma błędów, to <strong>(jednobitowe!)</strong> rejestry<strong> CRC-N</strong> i <strong>CRC-0</strong>, są zawsze takie same. Niestety, tu nie mamy pewności, że  błędy nie wystąpiły. Po każdej parzystej liczbie błędów rejestry <strong>CRC-N</strong> i <strong>CRC-O</strong> też będą takie same. Czasami jednak korzystamy z takich układów. Np. gdy komunikaty są krótkie, lub wiemy z doświadczenia że układ jest pewny i rzadko występują przekłamania. Jeżeli już, to bardzo rzadko pojedyncze przekłamanie, a podwójne to &quot;prawie nigdy&quot;.<br /><img src="http://img14.imageshack.us/img14/2134/35439640.png" alt="Obrazek" /><br /><strong>Rys. 24 Przerywnik żartobliwy trochę  - Inna realizacji dzielnika 11</strong><br />Żeby było jasne. Na górze widzisz paluszki projektanta. Tak wyglądał przerzutnik lampowy komputera z 1958 r. Taki mały, a przechowuje <strong>cały</strong> jeden bit. Z wikipedii.<br /><br /><strong>Dlaczego CRC mimo wszystko przepuszcza błędy?</strong> Odpowiedź jest prosta. Przecież <strong>CRC</strong> oblicza resztę z dzielenia <strong>komunikatu</strong> przez <strong>wielomian generacyjny</strong>. Do znudzenia wałkowaliśmy przykład obliczania <strong>reszty</strong> z dzielenia liczby <strong>100011</strong> przez <strong>1011</strong>. Pamiętamy że reszta to <strong>111</strong>. Jest to co prawda reszta z dzielenia <strong>xor</strong>-owego, ale jest pełna analogia do dzielenia zwykłego. Np <strong>327</strong> : <strong>13</strong> = <strong>25</strong> reszta <strong>2</strong>. Zauważ, że taką  samą resztę otrzymamy gdy wykonamy <strong>314</strong> : <strong>13</strong> = <strong>24</strong> reszta <strong>2</strong>, lub <strong>301</strong> :<strong>13</strong> = <strong>23</strong> reszta <strong>2</strong> itd. Gdyby więc na kablu <strong>Nadajnik</strong> - <strong>Odbiornik</strong> jakiś złośliwy chochlik podmienił wysyłane z <strong>Nadajnika</strong> <strong>327</strong> na <strong>314</strong> lub <strong>301</strong> , to w <strong>CRC-N</strong> nadajnika i w <strong>CRC-O</strong> odbiornika byłyby takie same reszty <strong>2</strong>. A ponieważ w <strong>CRC-O</strong> występuje odjęcie tych wartości (patrz stany <strong>10...12</strong> w rozdz. <strong>10</strong>), to nadajnik na podstawie <strong>CRC-O = 000</strong>, wyciągnie fałszywy wniosek, że nie było błędów. <br /><strong>Jaki powinien być dzielnik, żeby przepuszczał najmniej błędów?</strong><br />Odpowiedź jest trudna. Z tego robi się doktoraty lub prace habilitacyjne. Tu pytanie do znawców tematu. Czy w ogóle ma ono sens?  <strong>Jaki wielomian generujący o danej ilości bajtów-1,2,3 lub 4, zapewnia najmniejszą liczbę błędów transmisj?</strong>. Byłem prawie pewien, że dla współczesnej matematyki to sprawa  zamknięta. Jak twierdzenie Pitagorasa. Z internetu odniosłem jednak wrażenie, że temat stale się rozwija. Trafiłem na dyskusję z 2006 r gdzie bardzo poważni panowie, kłócili się czy ten wielomian jest lepszy czy inny. Z niecierpliwością czekam na jakiś komentarz, np biegłego magistranta.   To teraz jako maluczki powiem to co wiem o <strong>dzielniku</strong>, albo się domyślam. <br /><strong>1</strong>- Powinien zaczynać i kończyć się <strong>jedynką</strong> - była o tym mowa wczęśniej<br /><strong>2</strong>- Im większy dzielnik tym mniej przepuszcza błędów. Wcześniej stwierdziliśmy, że dla np <strong>327</strong> : <strong>13</strong> resztą jest<strong>2</strong>. Ta sama reszta <strong>2</strong> będzie też dla dzielnej <strong>314</strong>, <strong>301</strong> i innych. Wystarczy więc zwiększyć ...<strong>dzielnik</strong> np na <strong>47</strong>, żeby dzielnych, które dają tę samą resztę (tu dla <strong>327</strong> : <strong>47</strong> = <strong>6 </strong>reszta <strong>45</strong>), <strong>było mniej</strong>.<br />...<strong>Wniosek</strong> - Większy dzielnik--&gt;mniej błędów. W przypadku dzielenia <strong>xor</strong>-owego jest jeszcze prościej. Więcej bitów ma dzielnik--&gt;mniej błędów. To jest chyba pewne.<br /><strong>3</strong> -  Chociaż komunikat wysyłany jest <strong>bit po bicie</strong>, to wiadomo że bity te zorganizowane w bajty. Dlatego dzielnik też będzie miał strukturę bajtową + 1 bit najstarszy. Dzięki temu nasz rejestr <strong>CRC</strong> będzie miał pełne bajty. W praktyce 1,2 3 lub 4.<br /><strong>4-</strong> To teraz pytanie na deser. Jaki <strong>dzielnik</strong> &quot;4-bajtowy + 1 bit&quot; (inaczej <strong>wielomian generujący</strong> lub <strong>generator</strong>) przepuszcza najmniej <strong>dzielnych</strong> (komunikatów) które dają tę samą resztę. Inaczej - przepuszcza najmniej błędów. <strong>Odpowiedź jest banalnie prosta</strong>. Jest to liczba <strong>1.0000.0100.1010.0001.0001.1101.1011.0111</strong>. Dlaczego? Chyba każdy to widzi. <strong>Oczywiście to żart!</strong>. Ale zastanawiam się jak ludzie do tego doszli? Przecież tu jest chyba ponad 4 miliardy kombinacji. Czy poprzez twierdzenia algebry wyższej? A może symulacje. Sprawdzamy wszystkie możliwe 33 bitowe kombinacje, przy wszystkich kombinacjach komunikatów o długości np. 1024 bajty. Może wystarczą krótsze np. 128 bajtów?  I wybierzemy taką, która daje najmniej reszt. Może to jest właśnie ta w/w liczba? Może ktoś rozwinie ten temat? Tak przy okazji. Używasz tego <strong>dzielnika </strong> codziennie jako wielomian używany w standarcie ETHERNET tzw CRC-32.<br /><strong>Postać wielomianowa </strong>dzielnika <strong>CRC-32 = x^32 + x^26 +x^22 + x^16 + x^12 + x^11 + x^10 + x^8 +x^7 ++ x^5+ x^4 + x^2 + x + 1</strong>. Aby zbudować rejestr <strong>CRC</strong> dla tego wielomianu wystarczy oczywiście skorzystać z rys. 15. Tu już nie żartuję. <br /><strong>Podam</strong> jeszcze 2 często używane wielomiany generujące<br /><strong>Wielomian</strong> używany przez protokoł HDLC     <strong>CRC-16 = x^16 + x^15 + x^2 + 1</strong><br /><strong>Standart CCITT </strong>  <strong> CRC-CCITT = x^16 + x^12 + x^5 + 1</strong><br /><br />Nie jestem tego pewien, ale <strong> CRC</strong> na rys. 23 to realizacja wielomianu <strong>CRC-2 = x+1 </strong>. Mądrych ludzi proszę o potwierdzenie. Jeżeli takowego nie ma, to zdanie to traktuj z przymrużeniem oka!<br /><br /><strong>NAJWAŻNIEJSZE - JAKA JEST SKUTECZNOŚĆ WYKRYWANIA BŁĘDÓW!!!!</strong><br />Znalazłem coś takiego dla <strong>CRC-16</strong><br /><strong>Metodą CRC-16 można wykryć </strong>:<br />- wszystkie <strong>pojedyncze</strong> błędy transmisji (błędy tylko w jednym bicie) - <strong>komentarz</strong> - Nic wielkiego,to robi głupi przerzutnik na rys. 23!<br />- wszystkie <strong>podwójne</strong> błędy - <strong>komentarz</strong> - Nie rzuca na kolana, ale może być<br />- wszystkie błędy <strong>w nieparzystej</strong> ilości bitów <br />- wszystkie błędy w bloku do 16 bitów<br />- <strong>99,9984%</strong> pozostałych błędów transmisji. <strong>I to jest samo miodzio - bardzo ważna informacja</strong>. Nie wiem czy mam rację, ale podejrzewam że 0,0016% błędów wiąże się &quot;z tymi samymi resztami&quot; omówionymi wcześniej.<br /><br />Nie znalazłem danych dotyczących<strong> CRC-32</strong>. Podejrzewam, że jako metoda używająca 2 razy większego <strong>dzielnika</strong> będzie dużo lepsza od <strong> CRC-16</strong>. <br /><br /><strong>Jeszcze taki mały paradoks.</strong> Zauważ że<strong> CRC-16</strong> wykrywa w 100% błędy transmisji, które &quot;tylko trochę&quot; zniekształcają informację wyjściową np. w 1 bicie lub kilku. Jest to oczywiste. Przypominam że w <strong>CRC</strong> siedzi reszta z dzielenia <strong>komunikatu</strong> (liczby którą Nadajnik wysyła do Odbiornika) przez jakiś <strong>dzielnik</strong>. Nie jest to zwykłe dzielenie, ale <strong>xor</strong>-owe. Nie mniej jednak efekty tych <strong>dzieleń</strong> (<strong>&quot;zwykłych&quot;</strong> i <strong>xor</strong>-owych) są podobne. Wiadomo że np. reszta z dzielenia np. <strong>578:19</strong> to <strong>8</strong>. (578=19x30 + <strong>8</strong>). Zauważ jednak że ta sama reszta = <strong>8</strong>, będzie też przy wysyłanym komunikacie <strong>559</strong>, <strong>540</strong>, <strong>521</strong>...<strong>46</strong>, <strong>27</strong> i <strong>8</strong>. Czyli gdyby komunikat został &quot;zniekształcony&quot; do w/w liczb to byłaby ta sama reszta <strong>8</strong> i Odbiornik potraktujemy odebrany komunikat jako bezbłędny. To gdzie ten paradoks? No właśnie. Gdy zniekształcenie jest małe, np Odbiornik odebrał liczbę <strong>576</strong> (zamiast <strong>578</strong>, to na 100% błąd ten będzie wykryty, bo na 100% będzie inna reszta. Gdy zniekształcenie jest duże (w krańcowym wypadku zupełnie przypadkowa liczba) to odbiornik wykryje ten błąd, ale z prawdopodobieństwem np. <strong>99,99%</strong>, a nie <strong>100%</strong>. To <strong>0,01%</strong> to wtedy, gdy przypadkowo reszta będzie taka sama, chociaż komunikat będzie zupełnie inny.<br />Gdyby te reguła obowiązywał w życiu codziennym, to na 100% odróżnimy strongmana Pudzianowskiego od jego podobnego brata bliźniaka (gdyby miał takowego), ale tylko na 99,99% od jakiegoś przedszkolaka.<br /><br /><span style="font-size: 150%; line-height: normal"><strong>Rozdz. 11 Prawdziwy Nadajnik-Odbiornik z CRC</strong></span><br /><strong>Rys. 25</strong> jest uogólnieniem <strong>rys.17...21</strong> z <strong>rozdz. 10</strong><br /><strong>Różnice</strong> są następujące<br /><strong>Rys. 17...21</strong> - 1 komórka oznacza <strong>1 bit</strong><br /><strong>Rys. 25</strong> - 1 komórka oznacza <strong>1 bajt</strong> (oprócz komórki &quot;niebieskiej&quot; w stanach <strong>10...12</strong>, która jest <strong>bitem</strong>)<br /><br /><strong>Rys. 17...21</strong> - <strong>RN</strong> dla komunikatu <strong>6-bitowego</strong> + <span style="color: #FF0000">3 zera</span><br /><strong>Rys. 25</strong> - <strong>RN</strong> dla komunikatu <strong>1020-bajtowego</strong> + <span style="color: #FF0000">4 bajtowe zera</span> (czyli 8160 bitów + <span style="color: #FF0000">32 zera</span>)<br /><br /><strong>Rys. 17...21</strong> - <strong>RO</strong> dla komunikatu <strong>6-bitowego</strong> <br /><strong>Rys. 25</strong> - <strong>RO</strong> dla komunikatu <strong>1020-bajtowego</strong> + (czyli 8160 bitów) <br /><br /><strong>Rys. 17...21</strong> <strong> CRC-N</strong> i <strong>CRC-O</strong>  3-bitowe realizujące dzielnik = <strong>1011</strong><br /><strong>Rys. 25</strong> <strong> CRC-N</strong> i <strong>CRC-O</strong> 4-bajtowe (32-bitowe) realizujące dzielnik <strong>CRC-32</strong> = <strong>1.0000.0100.1010.0001.0001.1101.1011.0111</strong><br /><br /><strong>Wspólnymi cechami dla rys. 17...21 i 25 są:</strong><br />- transmisje między rejestrami są takie same <strong>tzn. po jednym bicie!</strong><br />- &quot;niebieska&quot; <strong>jednobitowa</strong> komórka jako przedłużenie rejestru <strong>CRC-O</strong><br />- <strong>gdy na kablu Nadajnik-Odbiornik nie ma zakłóceń, to w każdym stanie w rejestrach CRC-N i CRC-O są takie same wartości!</strong><br /><br /><img src="http://forum.atnel.pl/_obrazki/o/54/6079594d1cf97a9bdca093541b46c52e.png" alt="Obrazek" /><br /><strong>rys. 25 Nadajnik-Odbiornik z 4-bajtowym CRC i z 1020-bajtowym komunikatem</strong><br /><strong>Rys. 17...21</strong> odnoszą się do sytuacji &quot;dydaktycznej&quot;, gdzie komunikat miał tylko 6 bitów. Dlatego bez problemu można było przedstawić &quot;fotografie&quot; wszystkich 12 stanów. <strong>Rys. 25</strong> dotyczy komunikatu o długości 8160 bitów nie mówiąc już o 32 zerach. Trudno byłoby przestawić 8192 &quot;fotografii&quot; dla wszystkich stanów. Okazuje się, że można to zrobić na 3 &quot;fotografiach&quot;, jak na <strong>rys. 25</strong>. Każdej fotografii przyporządkowany jest symbol <strong>0...6</strong>, <strong>7...9</strong> lub <strong>10...12</strong>.<br />Stanom <strong>0...6</strong> na<strong> rys. 25</strong> odpowiadają te stany na <strong>rys. 17...19</strong><br />Stanom <strong>7...9</strong> na <strong>rys. 25</strong> odpowiadają te stany na <strong>rys. 19...20</strong><br />Stanom <strong>10...12</strong> na <strong>rys. 25</strong> odpowiadają te stany na <strong>rys. 20...21</strong><br /><br /><strong>Opis poszczególnych stanów na rys. 25</strong> Uwaga - komórki to<strong> bajty</strong> a nie <strong>bity</strong> (oprócz &quot;niebieskiej&quot;, która jest bitem)<br /><br /><span style="font-size: 150%; line-height: normal"><span style="color: #FF0000">Stany 0...6 </span></span> - Przesuwanie komunikatu z <strong>RN</strong> do <strong>RO</strong>. Aktualizacje <strong>CRC-N i CRC-O</strong>.<br /><strong>Stan 0</strong> <br /><strong>RN</strong> komórki 0...3 - <span style="color: #FF0000">4 x zero</span> (czyli <span style="color: #FF0000">32 zerowe bity</span>) <br /><strong>RN</strong> komórki 4...1019  - <strong>komunikat</strong> <br /><strong>CRC-N i CRC-O</strong> - wyzerowane<br /><strong>Stany 1...5</strong><br />W tych stanach komórki będą stopniowo wprowadzane z <strong>RN</strong> do <strong>RO</strong>, <strong>CRC-N</strong> i <strong>CRC-O</strong>. W każdym kroku będą odpowiednio modyfikowane rejestry <strong>CRC-N</strong> i <strong>CRC-O</strong>. Rejestr <strong>RO</strong> będzie się &quot;wydłużał&quot; do lewej strony a rejestr <strong>RN</strong> będzie się skracał z prawej strony. <br /><strong>Stan 6</strong> <br /><strong>RN</strong> - tylko 4 najstarsze komórki - <span style="color: #FF0000">4 x zero</span> (czyli <span style="color: #FF0000">32 zerowe bity</span>), pozostałe nieistotne<br /><strong>RO</strong>  - <strong>Komunikat</strong> zajmuje cały rejestr. Ze względu na stan przełącznika w stanach 7...12,tak będzie już do końca.<br /><strong>CRC-N i CRC-O</strong> - takie same wartości.<br /><br /><span style="font-size: 150%; line-height: normal"><span style="color: #FF0000">Stany 7...9 </span></span> - Komunikat w <strong>RO</strong> ustalony. Tylko aktualizacje <strong>CRC-N i CRC-O</strong>.<br />W stanie <strong>9</strong> w <strong>CRC-N i CRC-O</strong> są już <strong>te same</strong>, ostatecznie obliczone wartości <strong>reszt</strong>. <br /><br /><span style="font-size: 150%; line-height: normal"><span style="color: #FF0000">Stany 10...12 </span></span> - Komunikat w <strong>RO</strong> ustalony. Porównywanie wartości w <strong>CRC-N i CRC-O</strong>.<br />&quot;Niebieski&quot; bit  pełni dokładnie taką samą rolę w porównywaniu, jak na <strong>rys. 20, 21</strong> w stanach <strong>10...12</strong><br /><strong>W stanie końcowym</strong><br /><strong>RN</strong> - &quot;pusty&quot; (zera albo nieistotne)<br /><strong>R0</strong> - komunikat<br /><strong>CRC-N</strong> - &quot;pusty&quot; (zera albo nieistotne)<br /><strong>CRC-O</strong> - gdy nie było błędów --&gt; <strong>wyzerowany</strong><br />........-  gdy były--&gt;wartość <strong>niezerowa</strong><br />Gdy <strong>Odbiornik</strong> na podstawie <strong>CRC-O</strong> stwierdzi, że były błędy, to może zażądać od <strong>Nadajnika</strong> ponownego przesłania komunikatu.<br /><br /><span style="font-size: 150%; line-height: normal"><strong>Rozdz. 12 Programowe obliczanie reszty CRC - metoda SIMPLE (1-bitowa)</strong></span><br />Do tej pory reszta była obliczana w <strong>CRC</strong>  metodą bit po bicie. Przy okazji proszę zwrócić uwagę jak prosty jest ten hardware (rys. 15). Nawet gdyby realizowany był wielomian <strong>CRC-32</strong>. Rysunek miałby wtedy 32 przerzutniki D i inną konfigurację <strong>xor</strong>-ów. Też byłby to w miarę prosty układ, który jednak potrafi obliczyć resztę z dzielenia np. liczby 1000 bajtowej przez 4 bajtową. I to prawie nie opóźniając transmisji. A co zrobić gdy nasz mikrokontroler nie ma wbudowanego mechanizmu <strong>CRC</strong>? Jedyne wyjście to metody <strong>programowe</strong>. Zaczniemy od metody <strong>SIMPLE</strong>. Jest to bezpośrednia realizacja programowa algorytmu &quot;rejestrowego&quot;. Jedynego jakiego znamy do tej pory. Niestety, program bardzo zmniejsza prędkość transmisji, ponieważ realizowany jest metodą &quot;bit po bicie&quot;.<br /><img src="http://forum.atnel.pl/_obrazki/o/54/7a542442a073673fffc285e4f82fb1ea.png" alt="Obrazek" /><br /><strong>Rys. 26 Jakie będzie CRC po wprowadzeniu 1 bitu?</strong><br /><br /><strong>Rys. 26a - bit sterujący 0</strong><br /><strong>Lewa strona -wersja &quot;rejestrowa&quot; algorytmu</strong><br />Dzielnik 1<span style="color: #FF0000">011011</span>. (Najstarszy bit zawsze 1, lecz tylko &quot;czerwone&quot; bity wpływają na algorytm)<br />Aktualny stan <strong>CRC=011001</strong> widoczny w górnym wierszu prostokąta (1 &quot;czeka&quot; na wejściu)<br />Bit sterujący (najstarszy) <strong>CRC=0</strong>, dlatego bity będą tylko przesunięte w lewo. <br /><strong>Prawa strona - wersja &quot;xor-owania pisemnego z 2 kreskami&quot;</strong><br />Czyli inna wersja algorytmu dająca ten sam wynik.<br />Pod dolną kreską <strong>0110011</strong> CRC+&quot;czekająca&quot; jedynka. Nazwijmy to dzielną.<br />Bit sterujący <strong>CRC=0</strong>, dlatego dzielną należy <strong>xor</strong>-ować z przesuniętymi <span style="color: #FF0000">000000</span> o 1 bit w prawo. Wynik widoczny nad górną kreską. Taki sam jak w dolnym wierszu prostokąta.<br /><br /><strong>Rys. 26b - bit sterujący 1</strong><br /><strong>Lewa strona -wersja &quot;rejestrowa&quot; algorytmu</strong><br />Aktualny stan <strong>CRC=111001</strong> widoczny w górnym wierszu prostokąta (1 &quot;czeka&quot; na wejściu)<br />Bit sterujący (najstarszy) <strong>CRC=1</strong>, dlatego bity będą <br />- przesunięte w lewo (jak w dolnym wierszu prostokąta z lewej strony) a potem<br />- <strong>xor-</strong>owane z czerwonymi bitami <span style="color: #FF0000">011011</span> dzielnika (jak w dolnym wierszu prostokąta &quot;środkowego&quot;)<br /><strong>Prawa strona - wersja &quot;xor-owania pisemnego z 2 kreskami&quot;</strong><br />Pod dolną kreską <strong>0110011</strong> CRC+&quot;czekająca&quot; jedynka. Nazwijmy to dzielną.<br />Bit sterujący <strong>CRC=1</strong>, dlatego dzielną należy <strong>xor</strong>-ować z przesuniętymi czerwonymi bitami <span style="color: #FF0000">011011</span> dzielnika. Wynik widoczny nad górną kreską. Taki sam jak w dolnym wierszu prostokąta środkowego.<br /><strong>Uwaga</strong> Nazwa <strong>&quot;sterujący&quot;</strong> najstarszego bitu <strong>CRC</strong> jest chyba oczywista. Gdy <strong>0</strong> to tylko przesunięcie. Gdy <strong>1</strong> to przesunięcie + <strong>xor</strong>-owanie z &quot;czerwonymi&quot; bitami dzielnika. <br /><br /><strong>Rys. 26c - wersja &quot;tablicowa&quot; algoryrmu</strong><br />Jest odpowiednikiem &quot;<strong>xor</strong>-owania pisemnego z 2 kreskami&quot;<br /><strong>Lewa strona</strong><br />W czarnym prostokącie jest aktualny stan <strong>CRC=111001</strong>. Z prawej strony &quot;czekająca&quot; jedynka<br />Pod rejestrem tablica z wierszami o adresach 0 i 1<br />- wiersz o adresie 0 zawiera <span style="color: #FF0000">000000</span><br />- wiersz o adresie 1 zawiera <span style="color: #FF0000">011011</span> (czerwone jedynki dzielnika)<br /><strong>Środek strony</strong><br />Bity w czarnym prostokącie + lewa jedynka są przesunięte w lewo. Tu sterujący bit <strong>1</strong> (najstarszy) <strong>CRC</strong> został &quot;wypchnięty&quot; w lewo. Ponieważ bit sterujący = <strong>1</strong>, to rejestr <strong>CRC</strong> będzie <strong>xor</strong>-owany z wierszem o adresie też <strong>1</strong>. Wynik tego <strong>xor</strong>-owania będzie widoczny na prawej stronie.<br /><strong>Prawa strona</strong><br />Ostateczny wynik operacji. <strong>CRC = 001000</strong><br />Uwaga. Gdyby na początku (lewa strona) było <strong>CRC=011001</strong> , to bitem sterującym będzie <strong>0</strong>. Wtedy po przesunięciu <strong>CRC</strong> będzie <strong>xor</strong>-owane z zawartością wiersza o adresie  <strong>0</strong>. Czyli wynikiem będzie <strong>110011</strong>.<br /><br /><strong>Zarys programu obliczającego resztę CRC</strong><br />Niniejszy program będzie obliczał resztę tak jak na rys. 15. <br />Tzn. Przesyłaną wiadomością jest <strong>100011</strong><br />Dzielnikiem jest <strong>1011</strong><br />Program w C-podobnym języku <strong>bunga-bunga</strong> powinien policzyć resztę z dzielenia <strong>100011:1011</strong><br /><br /><span style="color: #FF0000"><strong>Wyzeruj </strong>rejestr CRC</span> (3 bity)<br /><span style="color: #FF0000"><strong>Dopisz</strong> do wiadomości 3 zera</span> - stan 0 na rys. 15<br /><span style="color: #FF0000"><strong>WHILE</strong>(jeszcze nie jest wprowadzona cała wiadomość z zerami)</span><br /><span style="color: #FF0000"><strong>{</strong></span><br />...<span style="color: #FF0000"><strong>PRZESUŃ</strong> CRC o jeden bit w lewo i wprowadź najstarszy bit wiadomości z zerami do CRC</span><br />...<span style="color: #FF0000"><strong>IF</strong>(wychodzący bit jest 1) <strong>(XOR</strong>-uj CRC z 011)</span><br /><span style="color: #FF0000"><strong>}</strong></span><br />Przetestuj ten program pomagając sobie rys.15, a przekonasz się że na końcu <strong>CRC=111</strong><br /><br /><span style="font-size: 150%; line-height: normal"><strong>Rozdz. 13 Programowe obliczanie reszty CRC - metoda tablicowa ĆWIERĆBAJTOWA (2-bitowa)</strong></span><br />Od razu zastrzegam, że metoda ta nie jest (chyba?) stosowana w praktyce. Potraktujmy ją jako wstęp dla metody &quot; prawdziwej&quot; tj <strong>tablicowej &quot;BAJTOWEJ&quot;</strong>. <br />Z załączonego na końcu poprzedniego programu wynika, że wysłanie jednego bitu wymaga 2 instrukcji w języku wyższego poziomu niż assembler (np. <strong>C</strong>). Odpowiadać to może, tu strzelę np. 10 instrukcjom maszynowym. Może trochę upraszczam, ale zakładając że transmisja jednego bitu odpowiada jednej instrukcji maszynowej, to od razu rzuca sie w oczy jak program może opóźniać transmisję! Jak zwiększyć &quot;szybkość&quot; programu? Nie trzeba być Eugeniuszem żeby zaproponować wprowadzanie dwóch bitów (ćwierćbajtu) jednocześnie do rejestru <strong>CRC</strong>.<br /><br />Przy wprowadzaniu do CRC 1 bitu  tablica zawiera tylko 2 wiersze (rys. 26c). Pierwszy o adresie 0 gdy bitem sterującym jest 0 i drugi o adresie 1, gdy bitem sterującym jest 1.<br />Przy wprowadzaniu do CRC 2 bitów, będą odpowiednio 4 kombinacje bitów sterujących, czyli najstarszych 2 bitów rejestru CRC - 00, 01, 10 i 11. Czyli tablica będzie 4 wierszowa. W zależności od tych bitów, rejestr będzie odpowiednio przesuwał i (ewentualnie) <strong>xor</strong>-ował swoje bity. Rozpatrzmy więc te 4 kombinacje. <br /><br /><span style="font-size: 150%; line-height: normal"><strong>Pierwsza kombinacja - bity sterujące 00</strong></span><br /><img src="http://forum.atnel.pl/_obrazki/o/54/31830e34764bd9130df0877d58fae178.png" alt="Obrazek" /><br /><strong>Rys. 27 Jakie będzie CRC po wprowadzeniu &quot;ćwierćbajtu&quot; (2 bitów)? - bity sterujące 00</strong><br /><br /><strong>Rys. 27a - wersja algorytmu &quot;rejestrowa&quot; </strong><br />Dzielnik 1<span style="color: #FF0000">011011</span>. (Najstarszy bit zawsze 1, lecz tylko &quot;czerwone&quot; bity wpływają na algorytm)<br />Aktualny stan <strong>CRC=001001</strong> widoczny w górnym wierszu prostokąta (<strong>01</strong> &quot;czeka&quot; na wejściu). Bit sterujący (najstarszy) <strong>CRC=0</strong>, dlatego bity będą tylko przesunięte w lewo.Efekt <strong>010010</strong> widać w środkowym wierszu. Tu znowu bit sterujący  <strong>CRC=0</strong>. Bity ponownie będą tylko przesunięte w lewo. Efekt <strong>100101</strong> widać w dolnym wierszu.<br />Akurat w powyższym przykładzie 2 pierwsze bity to <strong>00</strong>. Dlatego zmiany w <strong>CRC</strong> to tylko 2 przesunięcia bez <strong>xor</strong>-owania.<br /><br /><strong>Rys. 27b - Wstępna wersja algorytmu &quot;xor-owania pisemnego z 2 kreskami&quot; </strong><br />Aktualny stan + 2 bity &quot;czekające&quot; <strong>CRC=00100101</strong> pod dolną kreską.<br />bity <span style="color: #FF0000">000000</span> nad kreską odpowiadają pierwszemu przesunięciu. Następne <span style="color: #FF0000">000000</span> drugiemu. Po <strong>xor</strong>-owaniu ostatnich 6 bitów (pod dolną kreską) z 2 wierszami, nad górną kreską otrzymamy <strong>100101</strong> - to samo co w dolnym wierszu prostokąta z rys. 27a.<br /><br /><strong>Rys. 27c - Ostateczna wersja algorytmu &quot;xor-owania pisemnego z 2 kreskami&quot; </strong><br />Bity <span style="color: #FF0000">000000</span> są wynikiem sumowania 2 wierszy <span style="color: #FF0000">000000</span> na rys. 27b. Czyli <strong>100101</strong> nad górną kreską jest <strong>xor</strong>-em z <strong>100101</strong> i <span style="color: #FF0000">000000</span>. Wynik oczywiście taki sam jak na rys. 27a.<br /><br /><strong>Rys. 27d Wersja tablicowa algorytmu dla bitów sterujących 00 - stan początkowy</strong><br />W czarnym prostokącie jest początkowy stan rejestru <strong>CRC=001001</strong> + 2 bity &quot;czekające&quot; <strong>01</strong>. Z bitami sterującymi <strong>00</strong> związany jest wiersz o adresie też 00, zawierający <span style="color: #FF0000">000000</span><br /><br /><strong>Rys. 27e Wersja tablicowa algorytmu dla bitów sterujących 00 - stan pośredni</strong><br />Bity w rejestrze należy przesunąć o 2 pozycję w lewo. Następnie rejestr <strong>xor</strong>-ujemy z wierszem tablicy o adresie 00. czyli  z <span style="color: #FF0000">000000</span>. Wynik tego działania będzie widoczny na rys. 27f<br /><br /><strong>Rys. 27f Wersja tablicowa algorytmu dla bitów sterujących 00 - stan końcowy</strong><br />Taki sam wynik jak na rys. 27a.<br /><br /><span style="font-size: 150%; line-height: normal"><strong>Druga kombinacja - bity sterujące 01</strong></span><br /><img src="http://forum.atnel.pl/_obrazki/o/54/068930b8741e50ae5b74a0f5e0f38c54.png" alt="Obrazek" /><br /><strong>Rys. 28 Jakie będzie CRC po wprowadzeniu &quot;ćwierćbajtu&quot; (2 bitów)? - bity sterujące 01</strong><br /><br /><strong>Rys. 28a - wersja algorytmu &quot;rejestrowa&quot; </strong><br />Dzielnik 1<span style="color: #FF0000">011011</span>.<br />Aktualny stan <strong>CRC=011001</strong> widoczny w górnym wierszu prostokąta (<strong>01</strong> &quot;czeka&quot; na wejściu). Bit sterujący (najstarszy) <strong>CRC=0</strong>, dlatego bity będą tylko przesunięte w lewo.Efekt 110010 widać w środkowym wierszu. Ale teraz bit sterujący  <strong>CRC=1</strong>. Bity ponownie będą przesunięte w lewo a potem <strong>xor</strong>-owane przez <span style="color: #FF0000">011011</span>. Efekt <strong>111110</strong> widać w dolnym wierszu.<br /><br /><strong>Rys. 28b - Wstępna wersja algorytmu &quot;xor-owania pisemnego z 2 kreskami&quot; </strong><br />Aktualny stan + 2 bity &quot;czekające&quot; <strong>CRC=01100101</strong> pod dolną kreską. Bity <span style="color: #FF0000">000000</span> nad kreską odpowiadają pierwszemu przesunięciu. Następne - przesunięciu i <strong>xor</strong>-owaniu przez <span style="color: #FF0000">011011</span>. Po <strong>xor</strong>-owaniu ostatnich 6 bitów (pod dolną kreską) z 2 wierszami, nad górną kreską otrzymamy <strong>111110</strong> - to samo co w dolnym wierszu prostokąta z rys. 28a.<br /><br /><strong>Rys. 28c - Ostateczna wersja algorytmu &quot;xor-owania pisemnego z 2 kreskami&quot; </strong><br />Bity <span style="color: #FF0000">011011</span> są wynikiem <strong>xor</strong>-owania wierszy <span style="color: #FF0000">000000</span> i <span style="color: #FF0000">011011</span> na rys. 28b. Czyli <strong>111110</strong> nad górną kreską jest <strong>xor</strong>-em z <strong>100101</strong> i <span style="color: #FF0000">011011</span>. Wynik oczywiście taki sam jak na rys. 28a.<br /><br /><strong>Rys. 28d Wersja tablicowa algorytmu dla bitów sterujących 01 - stan początkowy</strong><br />W czarnym prostokącie jest początkowy stan rejestru <strong>CRC=011001</strong> + 2 bity &quot;czekające&quot; <strong>01</strong>. Z bitami sterującymi <strong>01</strong> związany jest wiersz o adresie też 01, zawierający <span style="color: #FF0000">011011</span>.<br /><br /><strong>Rys. 28e Wersja tablicowa algorytmu dla bitów sterujących 01 - stan pośredni</strong><br />Bity w rejestrze należy przesunąć o 2 pozycję w lewo. Następnie rejestr <strong>xor</strong>-ujemy z wierszem tablicy o adresie 01. Wynik tego działania będzie widoczny na rys. 28f<br /><br /><strong>Rys. 28f Wersja tablicowa algorytmu dla bitów sterujących 01 - stan końcowy</strong><br />Taki sam wynik jak na rys. 28a.<br /><br /><span style="font-size: 150%; line-height: normal"><strong>Trzecia kombinacja - bity sterujące 10</strong></span><br /><img src="http://forum.atnel.pl/_obrazki/o/54/f7875afbebea1b694fda314c33a24f99.PNG" alt="Obrazek" /><br /><strong>Rys. 29 Jakie będzie CRC po wprowadzeniu &quot;ćwierćbajtu&quot; (2 bitów)? - bity sterujące 10</strong><br /><br /><strong>Rys. 29a - wersja algorytmu &quot;rejestrowa&quot; </strong><br />Dzielnik 1<span style="color: #FF0000">011011</span>.<br />Aktualny stan <strong>CRC=101001</strong> widoczny w górnym wierszu prostokąta (<strong>01</strong> &quot;czeka&quot; na wejściu).Bit sterujący  <strong>CRC=1</strong>. Bity będą przesunięte w lewo, a potem <strong>xor</strong>-owane przez <span style="color: #FF0000">011011</span>. Efekt 001001 widać w środkowym wierszu. Ale teraz bit sterujący (najstarszy) <strong>CRC=0</strong>, dlatego bity będą tylko przesunięte w lewo.Efekt <strong>010011</strong> widać w dolnym wierszu. <br /><br /><strong>Rys. 29b - Wstępna wersja algorytmu &quot;xor-owania pisemnego z 2 kreskami&quot; </strong><br />Aktualny stan + 2 bity &quot;czekające&quot; <strong>CRC=01100101</strong> pod dolną kreską. Bity <span style="color: #FF0000">011011</span> nad kreską odpowiadają pierwszemu przesunięciu i <strong>xor</strong>-owaniu przez <span style="color: #FF0000">011011</span>. Następne <span style="color: #FF0000">000000</span> - tylko przesunięciu. Po <strong>xor</strong>-owaniu ostatnich 6 bitów (pod dolną kreską) z 2 wierszami, nad górną kreską otrzymamy <strong>010011</strong> (to samo co w dolnym wierszu prostokąta z rys. 29a).<br /><br /><strong>Rys. 29c - Ostateczna wersja algorytmu &quot;xor-owania pisemnego z 2 kreskami&quot; </strong><br />Bity <span style="color: #FF0000">011011</span> są wynikiem <strong>xor</strong>-owania wierszy <span style="color: #FF0000">011011</span> i <span style="color: #FF0000">0000000</span> na rys. 29b. Czyli <strong>010011</strong>nad górną kreską jest <strong>xor</strong>-em z <strong>100101</strong> i <span style="color: #FF0000">110110</span>. Wynik oczywiście taki sam jak na rys. 29a.<br /><br /><strong>Rys. 29d Wersja tablicowa algorytmu dla bitów sterujących 10 - stan początkowy</strong><br />W czarnym prostokącie jest początkowy stan rejestru <strong>CRC=101001</strong> + 2 bity &quot;czekające&quot; <strong>01</strong>. Z bitami sterującymi <strong>10</strong> związany jest wiersz o adresie też 10, zawierający <span style="color: #FF0000">110110</span>.<br /><br /><strong>Rys. 29e Wersja tablicowa algorytmu dla bitów sterujących 10 - stan pośredni</strong><br />Bity w rejestrze należy przesunąć o 2 pozycję w lewo. Następnie rejestr <strong>xor</strong>-ujemy z wierszem tablicy o adresie 10. Wynik tego działania będzie widoczny na rys. 29f<br /><br /><strong>Rys. 29f Wersja tablicowa algorytmu dla bitów sterujących 10 - stan końcowy</strong><br />Taki sam wynik jak na rys. 29a.<br /><br /><span style="font-size: 150%; line-height: normal"><strong>Czwarta kombinacja - bity sterujące 11</strong></span><br /><img src="http://forum.atnel.pl/_obrazki/o/54/ab324947431849bc81d43651e9e25b11.png" alt="Obrazek" /><br /><strong>Rys. 30 Jakie będzie CRC po wprowadzeniu &quot;ćwierćbajtu&quot; (2 bitów)? - bity sterujące 11</strong><br /><br /><strong>Rys. 30a - wersja algorytmu &quot;rejestrowa&quot; </strong><br />Dzielnik 1<span style="color: #FF0000">011011</span>.<br />Aktualny stan <strong>CRC=111001</strong> widoczny w górnym wierszu prostokąta (<strong>01</strong> &quot;czeka&quot; na wejściu). Bit sterujący (najstarszy) <strong>CRC=1</strong>, dlatego bity będą przesunięte w lewo a potem <strong>xor</strong>-owane przez <span style="color: #FF0000">011011</span>. Efekt 101001 widać w środkowym wierszu. Teraz bit sterujący znowu  <strong>CRC=1</strong>. Bity ponownie będą przesunięte w lewo a potem <strong>xor</strong>-owane przez <span style="color: #FF0000">011011</span>. Efekt <strong>001000</strong> widać w dolnym wierszu.<br /><br /><strong>Rys. 30b - Wstępna wersja algorytmu &quot;xor-owania pisemnego z 2 kreskami&quot; </strong><br />Aktualny stan + 2 bity &quot;czekające&quot; <strong>CRC=11100101</strong> pod dolną kreską. Bity <span style="color: #FF0000">011011</span> nad kreską odpowiadają pierwszemu przesunięciu  i <strong>xor</strong>-owaniu przez <span style="color: #FF0000">011011</span>. Następne - drugiemu przesunięciu i <strong>xor</strong>-owaniu . Po <strong>xor</strong>-owaniu ostatnich 6 bitów (pod dolną kreską) z 2 wierszami, nad górną kreską otrzymamy <strong>001000</strong> - to samo co w dolnym wierszu prostokąta z rys. 30a.<br /><br /><strong>Rys. 30c - Ostateczna wersja algorytmu &quot;xor-owania pisemnego z 2 kreskami&quot; </strong><br />Bity <span style="color: #FF0000">101101</span> są wynikiem <strong>xor</strong>-owania 2 wierszy <span style="color: #FF0000">011011</span> na rys. 30b. Czyli <strong>001000</strong>nad górną kreską jest <strong>xor</strong>-em z <strong>100101</strong> i <span style="color: #FF0000">101101</span>. Wynik oczywiście taki sam jak na rys. 30a.<br /><br /><strong>Rys. 30d Wersja tablicowa algorytmu dla bitów sterujących 11 - stan początkowy</strong><br />W czarnym prostokącie jest początkowy stan rejestru <strong>CRC=111001</strong> + 2 bity &quot;czekające&quot; <strong>01</strong>. Z bitami sterującymi <strong>11</strong> związany jest wiersz o adresie też 11, zawierający <span style="color: #FF0000">101101</span>.<br /><br /><strong>Rys. 30e Wersja tablicowa algorytmu dla bitów sterujących 11 - stan pośredni</strong><br />Bity w rejestrze należy przesunąć o 2 pozycję w lewo. Następnie rejestr <strong>xor</strong>-ujemy z wierszem tablicy o adresie 11. Wynik tego działania będzie widoczny na rys. 30f<br /><br /><strong>Rys. 30f Wersja tablicowa algorytmu dla bitów sterujących 11 - stan końcowy</strong><br />Taki sam wynik jak na rys. 30a.<br /><br /><span style="font-size: 150%; line-height: normal"><strong>Metoda tablicowa ćwierćbajtowa</strong></span><br />Metoda pozwala na szybkie obliczenie następnego stanu <strong>CRC</strong> po wprowadzeniu do niego &quot;ćwierćbajtu&quot; (2 bitów)<br /><br /><img src="http://forum.atnel.pl/_obrazki/o/54/3de27b8941121b606d3093be3cd69cc4.png" alt="Obrazek" /><br /><strong>Rys. 31 Jaki będzie następny stan po wprowadzeniu &quot;ćwierćbajtu&quot; 01?</strong><br />Na początku w <strong>CRC</strong> było <strong>101001</strong> <strong>01</strong> czeka na wejściu. Metoda pozwoli na szybkie (&quot;w jednym ruchu&quot;) obliczenie następnego stanu <strong>010011</strong>. Milcząco zakładamy oczywiście, że znany jest dzielnik 1<span style="color: #FF0000">011011</span>. Następny rysunek pokazuje jak to zrobić.<br /><br />Rysunek 32 jest &quot;złożeniem do kupy&quot; rysunków 27,28,29 i 30 w części dotyczącej metody tablicowej (d,e,f)<br /><img src="http://forum.atnel.pl/_obrazki/o/54/d00c5382d2e30d2bd8a23bf63d99107a.png" alt="Obrazek" /><br /><strong>Rys.32 Przykład metody tablicowej &quot;ćwierćbajtowej&quot;</strong><br /><br /><strong>Rys. 32a</strong> przedstawia stan początkowy. <strong>CRC = 101001</strong>. Na wejściu &quot;czeka&quot; <strong>01</strong>. Pod rejestrem <strong>CRC</strong> jest tablica 4 wierszowa, która &quot;powstała&quot; z rysunków 27d, 28d, 29d i 30d. Adres 3 wiersza <strong>10</strong> jest wytłuszczony, dlatego że &quot;ćwierćbajt&quot; sterujący (2 najstarsze bity <strong>CRC</strong>), też jest <strong>10</strong>.<br /><br /><strong>Rys. 32b</strong> przedstawia <strong>CRC</strong> z bitami przesuniętymi o 2 pozycje w lewo. &quot;Ćwierćbajt&quot; sterujący wyjdzie na zewnątrz, a do rejestru wprowadzony będzie &quot;czekający ćwierćbaj&quot; <strong>01</strong>. Teraz program będzie <strong>xor</strong>-ował <strong>CRC</strong> z wierszem o adresie wskazanym przez &quot;wypchnięty&quot; ćwierćbajt&quot; sterujący -<strong>10</strong>. Wynik <strong>xor</strong>-owania na rys. 32c.<br /><br /><strong>Rys. 32c</strong> - Wynik końcowy <strong>CRC=010011</strong><br />Widzimy że metoda tablicowa &quot;ćwierćbajtowa&quot; pozwala na dwukrotne przyspieszenie obliczania następnego stanu <strong>CRC</strong>. Nic za darmo. Kosztem jest tablica. Czyli zapotrzebowanie na pamięć. Akurat w poważniejsszych mikrokontrolerach nie jest to problemem.<br /><br /><span style="font-size: 150%; line-height: normal"><strong>Zarys programu obliczającego resztę CRC</strong></span><br />Niniejszy program będzie obliczał resztę <strong>CRC</strong>, tak obliczając następny stan <strong>CRC</strong> jak na rys. 32. <br />Założenia. <br />Dzielnikiem jest <strong>1<span style="color: #FF0000">011011</span></strong><br />Z powyższego wynika że <strong>CRC</strong> jest 6-bitowe ( bo dzielnik 7-bitowy)<br />Przesyłaną wiadomością dowolna liczba (więcej niż 6 bitowa oczywiście).<br />Program w C-podobnym języku powinien policzyć resztę z dzielenia <strong>wiadomość:1<span style="color: #FF0000">011011</span></strong><br />Wcześniej w dyrektywach program założy tablice 4x6 (4 wiersze po 6 bitów) tak jak na rys. 32. Ten kawałek nie jest pokazany w poniższym programie. <br /><span style="color: #FF0000"><strong>Wyzeruj </strong>rejestr CRC</span> (6 bitów)<br /><span style="color: #FF0000"><strong>Dopisz</strong> do wiadomości 000000 </span><br /><span style="color: #FF0000"><strong>WHILE</strong>(jeszcze nie jest wprowadzona cała wiadomość z zerami)</span><br /><span style="color: #FF0000"><strong>{</strong></span><br />...<span style="color: #FF0000"><strong> Zapamiętaj</strong>&quot;ćwierćbajt&quot; sterujący</span><br />...<span style="color: #FF0000"><strong>PRZESUŃ</strong> CRC o 2 bity w lewo i wprowadź 2 najstarsze bit wiadomości z zerami do CRC</span><br />...<span style="color: #FF0000"><strong>XOR</strong>-uj CRC z wierszem tablicy wskazanym przez &quot;ćwierćbajt&quot; sterujący </span><br /><span style="color: #FF0000"><strong>}</strong></span><br />Gdy cała wiadomość z dołączonymi 6 zerami zostanie wprowadzona do CRC, to program wyjdzie z pętli <span style="color: #FF0000"><strong>WHILE {</strong>...<strong>}</strong></span>. <br />W <strong>CRC </strong> będzie reszta z dzielenia <strong>wiadomość:1<span style="color: #FF0000">011011</span></strong><br /><br /><span style="font-size: 150%; line-height: normal"><strong>Rozdz. 14 Programowe obliczanie reszty CRC - metoda tablicowa BAJTOWA (8-bitowa)</strong></span><br /><br /><span style="font-size: 150%; line-height: normal"><strong>Porównanie metody ćwierćbajtowej i bajtowej rys.33 i 34</strong></span><br /><img src="http://forum.atnel.pl/_obrazki/o/54/5f0729964c85a7bdcd729a57310402fc.png" alt="Obrazek" /><br /><strong>Rys.33 Metoda tablicowa ćwierćbajtowa</strong><br />Krótkie przypomnienie poprzedniego rozdziału.<br />1 - wprowadzany jest jeden ćwierćbajt (2 bity)                    <br />2 - dzielnik 7 bitowy (1bit + 3 ćwierćbajty)                           <br />3 - rejestr <strong>CRC</strong> 3 ćwierćbajty (6 bitów)                       <br />4 - tablica zawiera 4 wiersze po 3 ćwierćbajty (po 6 bitów)    <br /><br /><strong>Rys 33a </strong><br />Stan początkowy rejestru <strong>CRC</strong> - ćwierćbajt <strong>01</strong> z prawej strony &quot;czeka&quot; na wprowadzenie<strong><br /><br />Rys 33b </strong><br />Stan  końcowy rejestru <strong>CRC</strong> - po wprowadzeniu ćwierćbajtu<br /><br />Rysunki<strong> c, d, e</strong> przedstawiają dokładnie jak  realizowana jest modyfikacja rejestru <strong>CRC</strong> po wprowadzeniu ćwierćbajtu.<br /><strong>Rys. 33c </strong><br />Stan początkowy rejestru <strong>CRC</strong> z tablicą - ćwierćbajt <strong>01</strong> z prawej strony &quot;czeka&quot; na wprowadzenie<br /><br /><strong>Rys. 33d </strong><br />Stan pośredni rejestru <strong>CRC</strong> z tablicą <br />- przesunięcie rejestru o 2 bity w lewo ( w tym wprowadzenie ćwierćbajtu <strong>01</strong> i &quot;wypchnięcie&quot; ćwierćbajtu sterującego <strong>10</strong>) <br />- adresowanie wiersza wskazanego przez &quot;wypchnięty&quot; ćwierćbajt sterujący (<strong>10</strong>)<br />- <strong>xor</strong>-owanie <strong>CRC</strong> przez adresowany wiersz <span style="color: #FF0000">11 01 10</span>. Wynik operacji na rys. 33e<br /><br /><strong>Rys. 33e </strong><br />- Wynik operacji<br />Metoda ćwierćbajtowa nie jest raczej stosowana w praktyce. Ma tylko znaczenie dydaktyczne. Tablica jest tylko 4-wierszowa ponieważ są tylko 2 bity sterujące, Dlatego możliwa jest jeszcze dokładna analiza działania rejestru dla wszystkich 4 kombinacji bitów sterujących. Natomiast rządzą te same mechanizmy jak w metodzie bajtowej.<br /><br /><img src="http://forum.atnel.pl/_obrazki/o/54/78aa28bdd55b002f2a6d69021fac1d6e.png" alt="Obrazek" /><br /><strong>Rys.34 Metoda tablicowa bajtowa</strong><br />Jest to już metoda stosowana w praktyce. Tu akurat realizowany jest wielomian <strong>CRC-32</strong> stosowany w internecie. Czyli jak czytasz ten tekst, coś tam kliknąłeś, to jakiś chochlik przy pomocy tablicy majstruje w <strong>CRC</strong>.<br />W odróżnieniu od metody ćwierćbajtowej<br />1 - wprowadzany jest jeden bajt (8 bitów)<br />2 - dzielnik 33 bitowy (1bit + 4 bajty) <br />3 - rejestr <strong>CRC</strong> 4 bajty (32 bity)<br />4 - tablica zawiera 256 wierszy po 8 bajtów (po 32 bity) (256 = FF)<br />Podkreślam, że na rys. 33 komórki są <strong>bitowe</strong>, na rys.34 <strong>bajtowe</strong>. Zawartość każdego bajtu przedstawiona jest tu w kodzie hexa. Metoda tablicowa <strong>bajtowa</strong> jest rozwinięciem metody ćwierćbajtowej z poprzedniego rozdziału. Różnice są tylko &quot;ilościowe&quot;.<br /><br /><strong>Rys 34a </strong><br />Stan początkowy rejestru <strong>CRC</strong> - bajt <strong>2D</strong> z prawej strony &quot;czeka&quot; na wprowadzenie. Liczba <span style="color: #FF0000">1 04 A1 1D B7</span> odpowiada wielomianowi <strong>CRC-32</strong>. Bajtem sterującym jest <strong>21=00100001</strong>. <br /><br /><strong>Rys 34b </strong><br />Stan  końcowy rejestru <strong>CRC</strong> - po wprowadzeniu bajtu<br /><br />Rysunki<strong> c, d, e</strong> przedstawiają dokładnie jak  realizowana jest modyfikacja rejestru <strong>CRC</strong> po wprowadzeniu bajtu <strong>2D</strong>.<br /><br /><strong>Rys. 34c </strong><br />Stan początkowy rejestru <strong>CRC</strong> z tablicą - bajt <strong>2D</strong> z prawej strony &quot;czeka&quot; na wprowadzenie.<br /><br /><strong>Rys. 34d </strong><br />Stan pośredni rejestru <strong>CRC</strong> z tablicą <br />- przesunięcie rejestru o bajt w lewo (w tym wprowadzenie bajtu <strong>2D</strong> i &quot;wypchnięcie&quot; bajtu sterującego<strong>21</strong>) <br />- adresowanie wiersza wskazanego przez &quot;wypchnięty&quot; bajt sterujący (<strong>21</strong>)<br />- <strong>xor</strong>-owanie <strong>CRC</strong> przez adresowany wiersz <span style="color: #FF0000">14 23 B6 E0</span>. Wynik operacji na rys. 34e<br /><br /><strong>Rys. 34e </strong><br />- Wynik operacji<br /><br /><strong>Tablice dla metody bajtowej</strong> są tworzone w sposób analogiczny jak dla metody ćwierćbajtowej i właściwie na tym można byłoby zakończyć artykuł. Dla czystego sumienia pokaże jednak jak to się robi.<br />Bajt sterujący ma 8 bitów. Odpowiada to 256 różnym kombinacjom --&gt; tablica będzie miała 256 wierszy 4 bajtowych. Wg tej samej zasady na rys. 33 tablica ma 4 wiersze 3 razy po ćwierć bajtu, ponieważ 2 bity sterujące dają 4 kombinacje. Oczywiście nie będę tworzył 256 4-bajtowych wierszy! Po prostu nie mam zdrowia. Dla przykładu stworzę tylko wiersz o adresie <strong>00</strong> i <strong>21</strong>. <strong>Dlatego pozostałe wiersze tablic na rysunkach 34c, 34d i 34e wypełniłem przypadkowymi liczbami!</strong>. <br /><br /><span style="font-size: 150%; line-height: normal"><strong>Kombinacja - bajt sterujący 00</strong></span><br /><img src="http://forum.atnel.pl/_obrazki/o/54/bea2b65c309d4fb4496f4b6020f667f8.png" alt="Obrazek" /><br /><strong>Rys. 35 Jakie będzie CRC po wprowadzeniu bajtu ? - bajt sterujący 00</strong><br />Rys. 35 jest odpowiednikiem rys. 27. Różnice między rys. 27 i 35 są tylko ilościowe. Zasady są takie same.<br /><strong>Rys. 27</strong><br />- CRC 3 x ćwierćbajtowe (6 bitowe)<br />- 2 bity sterujące czyli prostokąt ma wysokość 3=2+1 wierszy (rys. 27a)<br />- szerokość prostokąta 3 ćwierćbajty - 6  bitów  (rys. 27a)<br />- 2 wiersze &quot;zerowe&quot; między kreskami (rys. 27b)<br /><strong>Rys. 35</strong><br />- CRC  4 x bajt (32 bity)<br />- 8 bitów sterujących czyli prostokąt ma wysokość 9=8+1 wierszy (rys. 35a)<br />- szerokość prostokąta ma 4 bajty - 32  bity  (rys. 35a)<br />- 8 wierszy &quot;zerowych&quot; między kreskami (35b)<br /><br /><strong>Rys. 35a - wersja algorytmu &quot;rejestrowa&quot; </strong><br />Na rys. 35a, 35b i 35c dane przedstawione są w kodzie binarnym, bo liczby te łatwo się  <strong>xor</strong>-uje. W opisach natomiast przedstawione będą w kodzie hexa ze względu na ich &quot;zwięzłość&quot;. <br />Dzielnik 1 <span style="color: #FF0000">04 A1 1D B7</span> (Najstarszy bit zawsze 1, lecz tylko &quot;czerwone&quot; bity wpływają na algorytm)<br />Aktualny stan <strong>CRC=00 72 B9 72</strong> widoczny w górnym wierszu prostokąta <strong>(2D</strong> &quot;czeka&quot; na wejściu). Bit sterujący (najstarszy) <strong>CRC=0</strong>, dlatego bity będą tylko przesunięte w lewo. Tu znowu bit sterujący <strong>CRC=0</strong> itd...Bity ponownie będą tylko przesunięte w lewo. <br />W ten sposób wszystkie bity będą przesunięte w lewo o 1 bajt (8 bitów) i nowy stan <strong>CRC </strong>(9 &quot;wytłuszczony&quot; wiersz prostokąta) to <strong>CRC=72 B9 72 2D</strong>.<br /><br /><strong>Rys. 35b - Wstępna wersja algorytmu &quot;xor-owania pisemnego z 2 kreskami&quot; </strong><br />Aktualny stan <strong>CRC</strong> + bajt &quot;czekający&quot; <strong>00 72 B9 72 2D</strong> pod dolną kreską.<br />8 czerwonych zerowych wierszy nad kreską odpowiada kolejnym przesunięciom w rejestrze CRC.<br />Nad górną kreską (po <strong>xor</strong>-owaniu 8 zerowych wierszy) widzimy nowy &quot;przesunięty&quot; stan rejestru <strong>72 B9 72 2D</strong>. Ten sam wynik jak w dolnym wierszu na rys. 35a.<br /><br /><strong>Rys. 35c - Ostateczna wersja algorytmu &quot;xor-owania pisemnego z 2 kreskami&quot; </strong><br />Bajty <span style="color: #FF0000">00 00 00 00</span> są wynikiem <strong>xor</strong>-owania 8 wierszy  na rys. 35 b.Wynik oczywiście taki sam jak w dolnym wierszu na rys. 35a.<br /><br /><strong>Rys. 35d Wersja tablicowa algorytmu dla bajtu sterującego 00 - stan początkowy</strong><br />wiersz tablicy o adresie  <strong>00</strong> wynika bezpośrednio z rys. 35c<br />W czarnym prostokącie jest początkowy stan rejestru <strong>CRC=00 72 B9 72</strong> + bajt &quot;czekający&quot; <strong>2D</strong>. Z bajtem sterującymi <strong>00 </strong>związany jest wiersz o adresie też 00, zawierający <strong>00 00 00 00</strong><br /><br /><strong>Rys. 35e Wersja tablicowa algorytmu dla bajtu sterującego 00 - stan pośredni</strong><br />Bajty w rejestrze należy przesunąć o 1 pozycję w lewo. Następnie rejestr xor-ujemy z wierszem tablicy o adresie <strong>00</strong>. czyli z <span style="color: #FF0000">00 00 00 00</span>. Wynik tego działania będzie widoczny na rys. 35f<br /><br /><strong>Rys. 35f Wersja tablicowa algorytmu dla bitów sterujących 00 - stan końcowy</strong><br />Akurat dla tego przypadku - <strong>xor</strong>-owanie przez zera rys. 35e i 35f są takie same.<br />Taki sam wynik jak na rys. 35a.<br /><br /><span style="font-size: 150%; line-height: normal"><strong>Kombinacja - bajt sterujący 21</strong></span><br /><img src="http://forum.atnel.pl/_obrazki/o/54/bda3fdaf4a112fa3f80361abe820b738.png" alt="Obrazek" /><br /><strong>Rys. 36 Jakie będzie CRC po wprowadzeniu bajtu ? - bajt sterujący 21</strong><br /><br /><strong>Rys. 36a - wersja algorytmu &quot;rejestrowa&quot; </strong><br />Aktualny stan <strong>CRC=21 72 B9 72</strong> widoczny w górnym wierszu prostokąta <strong>(2D</strong> &quot;czeka&quot; na wejściu). Pierwszy bit sterujący (najstarszy) <strong>CRC=0</strong>, dlatego bity będą tylko przesunięte w lewo. Tu znowu bit sterujący <strong>CRC=0</strong> ,czyli bity znowu będą przesunięte w lewo. <strong>Ale teraz</strong> bit sterujący = <strong>1</strong>. Czyli w następnym wierszu bity będą przesunięte w lewo i <strong>xor-owane</strong> z &quot;czerwonymi' bitami dzielnika. Tak się szczęśliwie złozyło, że przy następnych przesunięciach, bity sterujące będą <strong>zerowe</strong> . Czyli będą tylko gołe przesunięcia, bez <strong>xor-owań</strong>. W ten sposób po przesunięciu o bajt, dojdziemy do <strong>wytłuszczonego</strong> wiersza nr 9 ze stanem <strong>CRC= 66 9A C4 CB</strong> . <br /><strong>Uwaga</strong> Tylko jeden wiersz &quot;do <strong>xor</strong>-owania&quot;, to tylko przypadek! Przy innym bajcie sterującym, mogłoby  być ich np. 5 a nawet 8.<br /><br /><strong>Rys. 36b - Wstępna wersja algorytmu &quot;xor-owania pisemnego z 2 kreskami&quot; </strong><br />Aktualny stan <strong>CRC</strong> + bajt &quot;czekający&quot; <strong>21 72 B9 72 2D</strong> pod dolną kreską.<br />7 czerwonych zerowych wierszy  odpowiada gołym przesunięciom w rejestrze CRC. Wiersz nr 3 - z czerwonymi bitami dzielnika, odpowiada przesunięciu i <strong>xor-</strong>-owaniu. Przy innych danych takich wierszy mogło być oczywiście więcej.<br />Nad górną kreską widzimy nowy stan rejestru <strong>66 9A C4 CB</strong>. Taki sam wynik jak w dolnym wierszu na rys. 36a.<br /><br /><strong>Rys. 36c - Ostateczna wersja algorytmu &quot;xor-owania pisemnego z 2 kreskami&quot; </strong><br />Bajty <span style="color: #FF0000">14 23 B6 E0</span> są wynikiem <strong>xor</strong>-owania 8 wierszy  na rys. 36 b.Wynik oczywiście taki sam jak w dolnym wierszu na rys. 36a.<br /><br /><strong>Rys. 36d Wersja tablicowa algorytmu dla bajtu sterującego 21 - stan początkowy</strong><br />wiersz tablicy o adresie  <strong>21</strong> wynika bezpośrednio z rys. 36c<br />W czarnym prostokącie jest początkowy stan rejestru <strong>CRC=21 72 B9 72</strong> + bajt &quot;czekający&quot; <strong>2D</strong>. Z bajtem sterującymi <strong>21 </strong>związany jest wiersz o adresie też <strong>21</strong>, zawierający [img]14%2023%20B6%20E0[/img]<br /><br /><strong>Rys. 36e Wersja tablicowa algorytmu dla bajtu sterującego 21 - stan pośredni</strong><br />Bajty w rejestrze należy przesunąć o 1 pozycję w lewo. Następnie rejestr xor-ujemy z wierszem tablicy o adresie <strong>21</strong>. czyli z <span style="color: #FF0000">14 23 B6 E0</span>. Wynik tego działania będzie widoczny na rys. 36f<br /><br /><strong>Rys. 36f Wersja tablicowa algorytmu dla bitów sterujących 21 - stan końcowy</strong><br />Taki sam wynik jak na rys. 36a.<br /><br /><span style="font-size: 150%; line-height: normal"><strong>Zarys programu obliczającego resztę CRC-32</strong></span><br />Niniejszy program będzie obliczał resztę <strong>CRC-32</strong>, tak obliczając następny stan <strong>CRC</strong> jak na rys. 34. Jest prawie kopią programu z rozdz. 13.<br />Założenia. <br />Dzielnikiem jest 1 <strong><span style="color: #FF0000">04 A1 1D B7</span></strong><br />Z powyższego wynika że <strong>CRC</strong> jest 4-bajtowe (32 bo bo dzielnik 33-bitowy)<br />Przesyłaną wiadomością dowolna liczba (więcej niż 4 bajty oczywiście).<br />Program w C-podobnym języku powinien policzyć resztę z dzielenia <strong>wiadomość:1 <span style="color: #FF0000">04 A1 1D B7</span></strong><br />Wcześniej w dyrektywach program założy tablice 256x4 bajty (256 wierszy po 4 bajty) tak jak na rys. 34. Ten kawałek nie jest pokazany w poniższym programie. <br /><span style="color: #FF0000"><strong>Wyzeruj </strong>rejestr CRC</span> (4 bajty)<br /><span style="color: #FF0000"><strong>Dopisz</strong> do wiadomości 00 00 00 00 </span><br /><span style="color: #FF0000"><strong>WHILE</strong>(jeszcze nie jest wprowadzona cała wiadomość z zerami)</span><br /><span style="color: #FF0000"><strong>{</strong></span><br />...<span style="color: #FF0000"><strong>Zapamiętaj</strong> bajt sterujący</span><br />...<span style="color: #FF0000"><strong>PRZESUŃ</strong> CRC o 1 bajt w lewo i wprowadź najstarszy bajt wiadomości z zerami do CRC</span><br />...<span style="color: #FF0000"><strong>XOR</strong>-uj CRC z wierszem tablicy wskazanym przez bajt sterujący </span><br /><span style="color: #FF0000"><strong>}</strong></span><br />Gdy cała wiadomość z dołączonymi 32 zerami zostanie wprowadzona do CRC, to program wyjdzie z pętli <span style="color: #FF0000"><strong>WHILE {</strong>...<strong>}</strong></span>. <br />Wtedy w <strong>CRC </strong> będzie reszta z dzielenia <strong>wiadomość:1 <span style="color: #FF0000">04 A1 1D B7</span></strong><br /><br /><a href="http://forum.atnel.pl/topic3555.html"  class="postlink">powrót do części 1 <strong><span style="font-size: 200%; line-height: normal">LINK</span></strong></a><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=683">mg101</a> — 16 lip 2013, o 19:22</p><hr />
]]></content>
</entry>
</feed>