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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2013-07-16T19:22:11+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=56&amp;t=3555&amp;mode</id>
<entry>
<author><name><![CDATA[mg101]]></name></author>
<updated>2013-07-16T19:22:11+01:00</updated>
<published>2013-07-16T19:22:11+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3555&amp;p=42077#p42077</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3555&amp;p=42077#p42077"/>
<title type="html"><![CDATA[Jak CRC  wykrywa błędy transmisji? cz.1]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3555&amp;p=42077#p42077"><![CDATA[
<img src="http://forum.atnel.pl/_obrazki/o/54/4761a5e4b9fc40c46d29f39feefeee7b.jpg" alt="Obrazek" /><br /><strong><span style="color: #FF0000">Uwaga<br />Lepsza wersja!</span></strong> <br /><!-- m --><a class="postlink" href="http://jaktodziala.eu/" >http://jaktodziala.eu/</a><!-- m --><br /><br /><span style="font-size: 150%; line-height: normal"><strong>Rozdz.1 - WSTĘP</strong></span><br />Rozdz. 5.1.1 &quot;Magistrala 1 Wire&quot; - niebieska książka Mirka, dotyczy  układu scalonego DS18B20. Ten wyglądający jak tranzystor  maluch, potrafi zmierzyć otaczającą temperaturę, przetworzyć na wartość cyfrową np. 27,6ºC i przesłać gdzieś dalej. Już samo to jest imponujące. Ale jak się okazało, że  jeszcze wykrywa błędy transmisji, to  kopara już mi zupełnie opadła. Zwłaszcza, że DS18B20 wykorzystuje jakiś abstrakcyjny wielomian 8 stopnia <strong>x^8 + x^5 + x^4 + 1</strong>.  ( <strong>X^8</strong> to <strong>x do potęgi ósmej</strong>). Tak mnie to zaintrygowało, że zacząłem szperać w internecie. Odpuściłem sobie opracowania z dużą ilością teorii. Jakieś algebry wielomianów, ciała Galois, lematy, twierdzenia i inne bajadery. Może bym jakimś cudem przebrnął. Ale wysiłek byłby zbyt duży. Skupiłem się więc na materiałach z minimalną teorią. Tu polecałbym  cykl artykułów Jarosława Dolińskiego z Elektroniki Praktycznej <!-- m --><a class="postlink" href="http://ep.com.pl/files/4641.pdf" >http://ep.com.pl/files/4641.pdf</a><!-- m -->. To co znalazłem w internecie, jeszcze bardziej okroiłem z teorii i zamieniłem w ten artykuł. <br /><br /><span style="font-size: 150%; line-height: normal"><strong>Rozdz.2 - JAK DZIAŁA WYKRYWANIE BŁĘDÓW TRANSMISJI W ŻYCIU CODZIENNYM?</strong></span><br />Błędy transmisji podświadomie wykrywamy codziennie. Pan Jourdain od Moliera też nie wiedział, że od 40 lat mówi prozą. <br />Przykład. Kowalski dzwoni do Nowaka i chce mu przypomnieć, że ten jest mu winien mu 32547 zł. I oczekuje od niego przelewu na tę kwotę. Jak będzie przebiegać rozmowa 2 panów?<br /><strong>Krok nr 1</strong> Kowalski <strong>mówi</strong> do Nowaka ....- Czekam na przelew 32547 zł  .... Nowak notuje klnąc, że musi mendzie oddać 32547 zł.<br /><strong>Krok nr 2</strong> Kowalski <strong>powtarza</strong>  ............- Czekam na przelew 32547 zł  .... Nowak notuje drugi raz 32547 zł i porównuje te liczby. Jeżeli się zgadzają to oznacza, że prawidłowo odebrał informację.<br />Proszę zauważyć że zostały tu użyte 3 zasady wykrywania błędów transmisji.<br /><strong>Po pierwsze</strong>....-Kowalski i Nowak znają zasady przesyłania tej informacji. Tzn. Po nadaniu liczby &quot;32547&quot;, należy ją jeszcze raz powtórzyć. <br /><strong>Po drugie</strong>.......-Informacja powtórzona nie wnosi nic nowego. Np. &quot;żona Kowalskiego ma niebieskie oczy&quot;. Czyli jest to informacja nadmiarowa, służąca tylko do wykrywania błędów.<br /><strong>Po trzecie</strong>......-Sprawdzanie bezbłędności transmisji polega na tym, że Nowak  porównuje informację właściwą z nadmiarową. <br /><br /><span style="font-size: 150%; line-height: normal"><strong>Rozdz.3 - KOWALSKI JAKO NADAJNIK I NOWAK JAKO ODBIORNIK </strong></span><br />Zamieńmy teraz Kowalskiego i Nowaka w elektronikę. Z rys.1 i 2 wynika że:<br /><strong>KOWALSKI - To nadajnik zawierający 3 elementy:</strong><br /><strong>RIW</strong>- pięciocyfrowy (<strong>nie 5-bitowy!</strong>)  przesuwny <strong>R</strong>ejestr<strong> I</strong>nformacji <strong>W</strong>łaściwej. Czyli informacji do wysłania.<br /><strong>RIN</strong> - pięciocyfrowy przesuwny  <strong>R</strong>ejestr <strong>I</strong>nformacji <strong>N</strong>admiarowej. Tu informacją nadmiarową jest po prostu powtórzona informacja właściwa.<br /><strong>Przełącznik</strong> -  W położeniu górnym, gdy <strong>nadawana</strong> jest informacja właściwa (rys.1) i dolnym, gdy  nadmiarowa (rys.2).<br /><br /><strong>NOWAK - To odbiornik zawierający też 3 elementy</strong><br /><strong>RO</strong>  - pięciociocyfrowy przesuwny  <strong>R</strong>ejestr <strong>O</strong>dbiorczy dla informacji właściwej. <br /><strong>RS</strong>  - sześciocyfrowy przesuwny <strong>R</strong>ejestr <strong>S</strong>prawdzający.  Porównuje informację właściwą i nadmiarową. Jeżeli w transmisji nie wystąpiły błędy (czyli informacja właściwa właściwa = informacja nadmiarowa), to w stanie końcowym, 5 pierwszych cyfr będzie wyzerowanych. <br /><strong>Przełącznik</strong> -  W położeniu górnym, gdy odbierana jest informacja właściwa (rys.1) i dolnym, gdy nadmiarowa (rys.2).<br /><br /><strong>WSTĘPNY OPIS DZIAŁANIA TRANSMISJI</strong><br /><strong>ETAP 1</strong> Przez pierwsze 5 taktów wysyłana jest z <strong>RIW</strong> informacja właściwa i zapisywana w <strong>RIN</strong>, <strong>RO</strong> i <strong>RS</strong><strong>--&gt;rys1.</strong><br /><br /><strong>ETAP 2</strong> Przez następne 5 taktów wysyłana jest z <strong>RIN</strong>informacja nadmiarowa. <strong>--&gt;rys.2</strong>. Teraz <strong>RO</strong> już się nie zmienia (jest w nim cały czas odebrana informacja właściwa &quot;32547&quot;). Natomiast <strong>RS</strong> przez 5 tych taktów porównuje informację właściwą z nadmiarową. Jeżeli są identyczne tzn. transmisja była bez błędów, to 5 pierwszych komórek <strong>RS</strong> będzie wyzerowanych.<br /><br /><strong>DOKŁADNY OPIS ETAPU 1</strong><br /><img src="http://forum.atnel.pl/_obrazki/o/54/10b6b1776429d8297c71a10be9d71fa0.jpg" alt="Obrazek" /><br /><br /><strong>Rys.1 - Nadawanie informacji właściwej, stan początkowy, pośredni i końcowy</strong><br />Przełączniki w pozycji <strong>górnej</strong>.<br />W stanie początkowym <strong>RIW</strong> zawiera informację do wysłania, czyli liczbę &quot;32547&quot;. Rejestry <strong>RIN</strong>,<strong> RO</strong> i <strong>RS</strong> sa wyzerowane. Każdy takt (niepokazany na rysunku impuls zegarowy) &quot;przepycha&quot; liczbę z <strong>RIW</strong> do <strong>RIN</strong>,<strong> RO</strong> i <strong>RS</strong>. Na rysunku pokazano stan początkowy wszystkich rejestrów, stan po 3 takcie (jako przykład stanu pośredniego) i stan końcowy nadawania informacji właściwej (po 5-tym takcie). Czytelnik sam dojdzie do wniosku, że w stan końcowy będzie następujący: <strong>RIW</strong> = &quot;00000&quot;, <strong>RIN</strong> = &quot;32547&quot;,RO = &quot;32547&quot; i RS = &quot;325470&quot; ( &quot;0&quot; w ostatniej &quot;niebieskiej&quot; komórce).<br /><strong>Uwaga - działanie rejestru RS!</strong>. Na rys.1 tego nie widać, ale <strong>RS</strong> jest trochę bardziej skomplikowane od <strong>RIN</strong> i <strong>RO</strong>. Mianowicie, po wprowadzeniu kolejnej liczby do komórki pierwszej, natychmiast odejmowana jest od niej zawartość komórki &quot;niebieskiej&quot; (nr 6). Np. po trzecim  takcie do komórki pierwszej wpisano &quot;5&quot;. Natychmiast będzie od niej odjęte &quot;0&quot; z komórki &quot;niebieskiej&quot;. Czyli pozostanie &quot;5&quot;. A ponieważ w czasie nadawania informacji właściwej w komórce &quot;niebieskiej&quot; jest cały czas &quot;0&quot;, to <strong>RS</strong> zachowuje się jak zwykły rejestr przesuwny, czyli jak <strong>RIN</strong> i <strong>RO</strong>.<br /><br /><strong>DOKŁADNY OPIS ETAPU 2</strong><br /><img src="http://forum.atnel.pl/_obrazki/o/54/690a36ce7059f6d569f92346da998795.jpg" alt="Obrazek" /><br /><strong>Rys.2 - Nadawanie informacji nadmiarowej, stan początkowy, pośredni i końcowy</strong>.<br />Przełączniki w pozycji <strong>dolnej</strong>.<br />Stan początkowy, gdy wysyłana jest informacja <strong>nadmiarowa</strong>, rejestrów <strong>RIW</strong>,<strong>RIN</strong>,<strong>RO</strong> i <strong>RS</strong>  jest taki sam, jak w stanie końcowym  wysyłania informacji <strong>właściwej</strong> (rys.1). Każdy takt &quot;przepycha&quot; &quot;0&quot; z <strong>RIW</strong>do <strong>RIN</strong>,oraz liczbę z <strong>RIN</strong> do <strong>RS</strong>. Ze względu na stan przełącznika, <strong>RO</strong> nie będzie zmieniane i cały czas będzie w nim informacja <strong>właściwa</strong> - &quot;32547&quot;. Tak, że np. po 6 takcie <strong>RIN</strong>=&quot;03254&quot;, <strong>RO</strong>=&quot;32547&quot; i <strong>RS</strong>=&quot;032547&quot;.<strong> Uwaga!</strong> Po 6 takcie, w pierwszej komórce <strong>RS</strong> , będzie <strong>&quot;0&quot;</strong> a nie &quot;wpychane&quot; <strong>&quot;7&quot;</strong>. Przypominam, że od &quot;wepchniętej&quot; w 6 takcie do tej komórki &quot;7&quot;, natychmiast odjęta będzie komórka niebieska, też &quot;7&quot;. Czyli będzie &quot;0&quot;. W każdym kolejnym takcie, komórka pierwsza będzie w ten właśnie sposób zerowana. Dlatego w stanie końcowym w pierwszych 5 komórkach <strong>RS</strong> będą same zera! <strong>Oczywiście, przy założeniu że nie było błędów transmisji!</strong>. Czyli gdy przysłana informacja nadmiarowa, też będzie równa &quot;32547&quot; a nie np. &quot;39547&quot;. <br /><strong>Wniosek</strong> W stanie końcowym 5 zer w pierwszych 5 komórkach <strong>RS</strong> oznacza, że w <strong>RO</strong> znajduje się bezbłędnie odebrana informacja!<br /><br /><span style="font-size: 150%; line-height: normal"><strong>Rozdz.4 - NADAJNIK I ODBIORNIK BARDZIEJ SERIO</strong></span><br />Poprzedni rozdział dotyczył bardzo uproszczonego systemu wykrywania błędów transmisji.<br /><strong>Po pierwsze - </strong> Informacja właściwa była bardzo krótka, tylko 5 cyfr.<br /><strong>Po drugie - </strong> Informacja nadmiarowa, służąca do wykrywania błędów, była po prostu powtórzeniem informacji właściwej. Z jednej strony to bardzo dobrze. Wykryty będzie błąd na dowolnej pozycji. Czyli wykrywanie błędów będzie bardzo skuteczne. Z drugiej strony, dwukrotnie zwiększa się czas transmisji ( 2 razy wysyłane jest &quot;32547&quot;) i zapotrzebowanie na pamięć.<br /><br />Zaproponujmy więc system przedstawiony na rys.3 i 4. Też wytąpią tu 2 etapy.<br /><strong>Etap 1 - </strong>Wysyłanie informacji właściwej<br /><strong>Etap 2 - </strong>Wysyłanie informacji nadmiarowej<br /><br />Z rys. 3 i 4 wynika że:<br /><strong>NADAJNIK </strong> zawiera 3 elementy: <br /><strong>Rejestr RN</strong>  - 128 bajtowy rejestr nadajnika. Odpowiednik <strong>RIW</strong> z rozdz. 3. <br /><strong>Rejestr CRC-N</strong>  - 4 bajtowy rejestr obliczający informację nadmiarową. Odpowiednik <strong>RIN</strong> z rozdz. 3. Na razie nie zwracajmy uwagi na tajemniczą nazwę CRC-N. &quot;N&quot; to oczywiście od <strong>N</strong>adajnika. Do nazwy CRC wrócimy później.<br /><strong>Przełącznik</strong> -  W położeniu górnym, gdy odbierana jest informacja właściwa (rys.3) i dolnym, gdy nadmiarowa (rys.4). czyli coś znajomego.<br /><br /><strong>ODBIORNIK </strong> też zawiera 3 elementy: <br /><strong>Rejestr R0</strong>  - 128 bajtowy rejestr odbiornika. <br /><strong>Rejestr CRC-O</strong>  - 4 bajtowy rejestr obliczający informację nadmiarową. Niebieska komórka jest przeznaczona na dodatkowy bit (nie bajt!). Pełni podobną funkcję jak niebieska komórka w <strong>RS</strong> w poprzednim rozdz. 3. <br /><strong>Przełącznik</strong> -  W położeniu górnym, gdy odbierana jest informacja właściwa (rys.3) i dolnym, gdy nadmiarowa (rys.4). Czyli coś znajomego.<br /><br />Działanie jest podobne do rozdz. 3. Z tym że informacją nadmiarową nie może być już powtórzona informacja właściwa. Trudno żeby w 4 bajtach CRC-N  lub CRC-O  zmieściła się liczba 128-bajtowa! Musimy zastosować jakąś sztuczkę. Będzie to dzielenie 128 bajtowej liczny z RN przez <strong>&quot;jakąś&quot;</strong> liczbę. <strong>Najważniejsze</strong>. W rejestrach tych nie będzie <strong>ilorazu</strong>, ale <strong>reszta z dzielenia</strong>!Dzięki temu mamy pewność, że wynik zawsze się zmieści w rejestrze 4-bajtowym. Pozostaje jeszcze problem <strong>&quot;jakąś liczbę&quot;</strong>. Jaką? Liczba ta powinna być 33 bitowa, z tym że na 1 i ostatnim bicie powinna być jedynka. Przy okazji. Proszę zwrócić uwagę na to, że CRC-N i CRC-O to rejestry <strong>32</strong> bitowe i że<strong> 33=32+1</strong>. A jej wartość? Jest wiele liczb spełniający wcześniej wymienione warunki. np. <strong>4 614 984 567</strong> (ponad 4 miliardy). Tak sobie strzeliłem. Ważne jest tylko, że nadajnik i odbiornik znają tą liczbę i w trakcie przesyłania kolejnego bitu stopniowo uaktualniana jest wartość w CRC-N i CRC-O. Podobnie, jak w rozdziale 3, były aktualizowane rejestry <strong>RIN</strong> i <strong>RS</strong> Na końcu przesyłania informacji właściwej, w CRC-N i CRC-O jest już ta reszta z dzielenia.<strong>Oczywiście pod warunkiem że nie było zakłóceń na łączach!</strong> Sama wartość ilorazu jest nieważna. W drugim etapie porównywane są te wartości. Gdy były jednakowe to na końcu transmisji w CRC-0 <strong>powinny być</strong> same zera (oprócz niebieskiej komórki).  Napisałem <strong>powinny</strong>, a nie <strong>będą</strong>. Metoda ta nie jest w 100% pewna. Może być tak, że zakłócenie na łączach, zmieni wartość przesyłanej 128 bajtowej liczby a obydwie reszty w CRC-N i CRC-O będą takie same. Dlatego, że np reszta z 39:6 to 3, i reszta z 21:6 też 3. Dwie różne liczby dają taką samą resztę. Ale musiałby to być naprawdę supertotolotek, żeby &quot;zakłócona&quot; liczba dała taką samą resztę jak '&quot;niezakłócona&quot;. Zwłaszcza że dzielimy <strong> bardzo, bardzo i jeszcze raz bardzo  dużą liczbę</strong> (1024 bitową), przez tylko<strong> bardzo dużą liczbę</strong> 33 bitową.<br /><strong>Uwaga</strong><br />Przesyłanie informacji następuje i obliczanie reszty w  w CRC-N i CRC-O następują &quot;bit po bicie&quot;. Tak też należy analizować rys. 3 i 4. <br /><br /><img src="http://forum.atnel.pl/_obrazki/o/54/829de0bb7bda87c1e83d55c0b0de7de1.png" alt="Obrazek" /><br /><strong>Rys. 3 Nadajnik i odbiornik w czasie nadawania informacji właściwej (ETAP 1)</strong><br />Przełącznik w położeniu <strong>górnym</strong><br />Każdy takt (nie pokazany impuls zegarowy) &quot;przepycha&quot; 1 bit z <strong>RN</strong> nadajnika do <strong>RO</strong> odbiornika.<br />Jednocześnie każdy takt uaktualnia (oblicza) resztę z dzielenia w rejestrach CRC-N i CRC-O. Jeżeli nie występują błędy na kabelku między nadajnikiem i odbiornikiem, to CRC-N i CRC-O mają w każdym stanie takie same wartości.<br /><br /><img src="http://forum.atnel.pl/_obrazki/o/54/68fa40574f3f1d000e6b31eca6c78b31.jpg" alt="Obrazek" /><br /><strong>Rys. 4 Nadajnik i odbiornik w czasie nadawania informacji nadmiarowej (ETAP 2)</strong><br />Przełącznik w położeniu <strong>dolnym</strong><br />W <strong>RO</strong> jest już odebrana cała wiadomość z <strong>RN</strong>. Ze względu na stan przełącznika w Odbiorniku, <strong>RO</strong> nie będzie się już zmieniało.<br />Każdy takt (nie pokazany impuls zegarowy) &quot;przepycha&quot; 1 bit z <strong>CRC-N</strong> nadajnika do <strong>CRC-O</strong> odbiornika.<br />Gdy na początku etapu 2 wartości CRC-N i CRC-O były takie same <strong>(transmisja bezbłędna)</strong> to na końcu etapu 2, 4 bajty CRC-O będą wyzerowane. Komórka niebieska w CRC-O  (bitowa, dlatego mniejsza od 4 bajtowych), pełni funkcję przy porównywaniu liczb w CRC-N i CRC-O. Tak jak niebieska komórka w rozdziale 3. <br /><br /><strong>Uwaga! Uwaga!</strong><br />W powyższym opisie używałem pojęcie <strong>dzielenia</strong>. W rzeczywistości do obliczeń używa się działania <strong>podobnego</strong> do prawdziwego dzielenia. Takie sobie <strong>pseudodzielenie</strong>. Też daje coś podobnego do reszty. Za to <strong>pseudodzielenie</strong> jest dużo szybsze niż <strong>prawdziwe</strong>. Jest to bardzo ważne, gdyż zależy nam na tym, żeby wykrywanie błędów nie zwalniało transmisji. <br /><br /><span style="font-size: 150%; line-height: normal"><strong>Rozdz. 5 - JAK DZIAŁA PSEUDODZIELENIE?</strong></span><br />Dalej przeważnie będę pisał o pseudodzieleniu, a także pseudo... dodawaniu, odejmowaniu i mnożeniu. Dlatego dla wygody używajmy nazw bez pseudo, chociaż wiemy o co chodzi. Jeżeli będę się powoływał na &quot;prawdziwe&quot; działania, to wyraźnie zaznaczę.<br />Na początku napisałem, że wystarczy minimum teorii. Ale bez przesady. Zakładam, że wiesz jak podzielić pisemnie np. &quot;23538:134&quot;. Znali to już Babilończycy. I co jest najciekawsze. Problem tak trywialny jak dzielenie,  wrócił stosunkowo niedawno, około 50 lat temu do współczesnej matematyki.  Zapotrzebowanie zgłosiła wtedy nowa dziedzina wiedzy - informatyka. Mianowicie jako sposób wykrywania błędów przy przesyłaniu danych - patrz rozdział 4. Zauważ, że gdybyśmy zastosowali prawdziwe dzielenie, nawet w  wersji binarnej, to przy obliczaniu kolejnych reszt musimy korzystać z tzw. &quot;przeniesień&quot;. Wicie, rozumicie. A gdyby wykombinować takie &quot;dzielenie&quot;, w którym nie trzeba używać &quot;przeniesień&quot;? Działanie prostsze, i mniej korzystania z pamięci. Zawsze wtedy uaktualnianie CRC-N i CRC-O będzie szybsze i elektronika prostsza.<br />Później okaże się, że zamiast odejmować liczby przy obliczaniu kolejnej reszty, wystarczy je tylko <strong>xor</strong>-ować. Dlatego warto dokładnie zapoznać się z <strong>XOR</strong>-em.<br /><br />Jak działa funkcja logiczna <strong>XOR</strong>?<br /><img src="http://forum.atnel.pl/_obrazki/o/54/6a4a5ff90b62677c5359924bb0c58675.jpg" alt="Obrazek" /><br /><strong>Rys.5 Bramka XOR przy wszystkich kombinacjach wejść</strong>.<br /><strong>XOR</strong> można byłoby nazwać bardziej swojsko <strong>&quot;PORÓWNYWACZ&quot;</strong>. &quot;0&quot; na wyjściu oznacza, że 2 wejścia są takie same, &quot;1&quot; że różne.<br /><br />Inne podejście do <strong>XOR</strong>-a. Jest to układ o jednym wejściu, na które wchodzi informacja zero-jedynkowa. Drugie wejście S pełni funkcję sterującą. Gdy S=0 to przepuszcza bity bez zmian(wzmacniacz o wzmocnieniu=1), gdy S=1 to neguje je. Taki sobie sterowany wzmacniacz/negator<br /><img src="http://forum.atnel.pl/_obrazki/o/54/ca7ba74c653f9bfc1b27d63012183507.png" alt="Obrazek" /><br /><strong>Rys.6 XOR jako sterowany wzmacniacz/negator</strong>.<br /><br />Jeszcze jedna interpretacja <strong>XOR</strong>-a<br /><img src="http://forum.atnel.pl/_obrazki/o/54/5256049101767468fae7b7df1e0d0b16.jpg" alt="Obrazek" /><br /><strong>Rys.7 XOR jako &quot;Dodawacz bez przeniesień&quot;</strong><br />Chyba nie wymaga komentarza. Proponuję też sprawdzenie, jak działa <strong>XOR jako &quot;Odejmowacz bez pożyczek&quot;</strong>. Okaże się że dodawanie i odejmowanie przy pomocy <strong>XOR</strong>-owania, daje takie sam rezultat.Ja ciągle o <strong>XOR</strong>-ach! Ale naprawdę warto. Później okaże się, że wykrywanie błędów to tylko przesuwanie rejestrów i ich <strong>XOR</strong>-owanie.<br /><br /><strong>Zobaczmy jak wyglądałoby dodawanie liczb dziesiętnych bez przeniesień</strong><br /><img src="http://forum.atnel.pl/_obrazki/o/54/74982c4efeba18bcf95910603d835d5a.jpg" alt="Obrazek" /><br /><strong>Rys.8 Dodawanie liczb dziesiętnych bez przeniesień</strong><br /><br /><strong>Analogicznie dodawanie, odejmowanie i mnożenie liczb binarnych bez przeniesień/pożyczek</strong><br /><img src="http://forum.atnel.pl/_obrazki/o/54/c58c0a1ae3f30f5fe20c0f50cf4c69df.jpg" alt="Obrazek" /><br /><strong>Rys.9 Dodawanie, odejmowanie i mnożenie liczb binarnych bez przeniesień/pożyczek</strong><br />Odejmowanie daje ten sam wynik co dodawanie. Gdyby ktoś miał problemy z mnożeniem, to proponuję wykonać pisemne mnożenie np. 12x17 najpierw &quot;zwykłe&quot;--&gt; wynik 204 a potem bez przeniesień --&gt; wynik 194<br /><br /><strong>Umiemy już dodawać, odejmować i mnożyć po XOR-owsku. Pozostało na jeszcze dzielenie </strong><br /><img src="http://forum.atnel.pl/_obrazki/o/54/eba67c548b34a44685810b3aad82ae51.jpg" alt="Obrazek" /><br /><strong>Rys.10 Przykład dzielenia bez reszty</strong><br />W szkole podstawowej naukę dzielenia pisemnego zaczynaliśmy od dzielenia bez reszty, np <strong>48:3</strong>. Tu postąpimy podobnie. Na rysunku najpierw pomnożyliśmy pisemnie <strong>xor</strong>-owo <strong>1010x1101=1110010</strong>. Następnie wykonamy działanie odwrotne, czyli pisemnie podzielimy <strong>1110010</strong> przez <strong>1101</strong>. I tak <strong>1110</strong> &quot;mieści&quot; się <strong>1</strong> raz w <strong>1101</strong> to piszemy nad kreską pierwsze <strong>1</strong>.  Potem od <strong>1110</strong>odejmujemy <strong>1101</strong> jako <strong>1x1101</strong> - jak w zwykłym dzieleniu. Gdyby częściowa dzielna nie &quot;mieściła&quot; się,to piszemy nad kreską <strong>0</strong> i odejmujemy <strong>0000</strong> jako <strong>0x1101</strong>. W ten sposób otrzymujemy kolejne reszty, aż do ostatniej <strong>000</strong>. Ostatnie <strong>000</strong> oznacza, że udało podzielić się bez reszty, a nad główną kreską mamy iloraz.<br /><strong>Uwaga</strong> Częściowa dzielna &quot;mieściłaby się&quot; w <strong>1101</strong> także, gdyby była  <strong>1000</strong>.Dlaczego? Bo takie są dziwne zasady arytmetyki <strong>xor</strong>-owej. Nie &quot;mieściłaby&quot; się dopiero, gdyby była np 0111 lub mniejsza, co już jest oczywiste.  Męczy <strong>1000&gt;=1101</strong>? Trudno, takie jest życie. Wynika to chyba z tego, że <strong>xor</strong>-owe dodawanie i odejmowanie, daje ten sam wynik. Patrz rys. 9.<br /><br /><strong>Zaatakujmy teraz dzielenie z resztą</strong><br /><strong>Podejście  pierwsze </strong><br /><img src="http://forum.atnel.pl/_obrazki/o/54/ca1f4ca100a39dc3cd9204c16c0b4c6f.jpg" alt="Obrazek" /><br /><strong>Rys. 11 Podejście  pierwsze </strong><br />Wiadomo, że jak weźmiemy 2 dowolne liczby całkowite to najprawdopodobniej po podzieleniu pozostanie jakaś reszta.<br />Wykonajmy więc działanie np. <strong>1110101 : 1101</strong>. Od razu załóżmy, że nie interesuje nas coś, co możemy nazwać ilorazem-czyli liczba nad główną kreską. W transmisji też nie jest ważny iloraz, tylko <strong>reszta</strong>. Rys. 11.1 pokazuje jak otrzymaliśmy resztę <strong>111</strong>. Zaczynamy kombinować. W zwykłym dzieleniu jest np. 38:5 = 7 reszta 3, to wiadomo że  <strong>38-3=35</strong> dzieli się bez reszty przez 5. Nie chcę się chwalić, sam na to wpadłem. Analogicznie od <strong>1110101</strong> odejmijmy resztę z rys. 11.1 czyli <strong>111</strong>. Działanie to przedstawione jest na rys. 11.2 i daje wynik <strong>1110010</strong>. Jest to odpowiednik, wcześniej wymienionej liczby <strong>35</strong>. Oczekujemy więc, że po podzieleniu <strong>1110010</strong> przez <strong>1011</strong> otrzymamy resztę zerową. Działanie to przedstawia rys. 11.3. I co? Resztą jest <strong>001</strong>, a nie <strong>000</strong>. <br /><strong>Wniosek</strong> Pierwsze podejście się nie udało. Nie idź tą drogą!<br /><br /><strong>Podejście  drugie </strong><br /><img src="http://forum.atnel.pl/_obrazki/o/54/5c4633079c8a00e4a3691d7832268c6a.jpg" alt="Obrazek" /><br /><strong>Rys. 12 Podejście drugie </strong><br />Ok. 50 lat temu, mądrzy ludzie wpadli na coś takiego.<br />Dzielnik ma n bitów. <br />1. Do ostatnich bitów dzielnej dołącz (n-1) zer. Nazwijmy to zmodyfikowaną dzielną.<br />2. Metodą pierwszego podejścia wykonaj dzielenie zmodyfikowanej dzielnej.<br />3. Na końcu otrzymasz resztę <br />Przedstawione jest to na<strong> rys. 12.1 </strong><br />Szukamy reszty dla <strong>1101011:1011</strong>. Dodajemy 3 zera (bo dzielnik 4-bitowy!). Czyli nowe podejście dla znalezienia reszty z <strong>1101011:1011</strong>, to tak jakby to było pierwsze podejście dla  <strong>1101011<span style="color: #FF0000">000</span>:1011</strong>! Otrzymaną resztą jest <strong>110</strong>. Pamiętajmy, że jest to reszta dla  <strong>1101011:1011</strong> a nie dla <strong>1101011<span style="color: #FF0000">000</span>:1011</strong>! 3 zera pełnią tylko funkcję pomocniczą.<br /><strong>Sprawdźmy, czy jest to rzeczywiście reszta.</strong><br />Na <strong>rys. 12.2</strong> odjęliśmy od zmodyfikowanej dzielnej resztę <strong>1101011<span style="color: #FF0000">000</span> - 110 =1101011<span style="color: #FF0000">110</span> </strong>. Okazuje się, że jest to dzielna<strong>1101011</strong> z dodanymi 3 bitami reszty<strong>110</strong>.<br />To teraz poznaną metodą obliczmy resztę z liczby <strong>1101011</strong> z dodanymi 3 bitami reszty <strong>110</strong>. Czyli z liczby <strong>1101011110</strong>. Patrz <strong>rys. 12.3</strong> Spodziewamy się reszty <strong>000</strong>. Oczywiście, znowu musimy dodać 3 zera itd. Otrzymana reszta to <strong>000</strong>. Zwycięstwo! Jeszcze jedno. Zauważ ze resztę <strong>000</strong> widać na końcu algorytmu, oraz wcześniej. Pokazują to strzałki przy<strong>*Uwaga</strong>. Rzeczywiście, gdy dzielimy liczbę, która z założenia (jak na rys. 12.3) dzieli się bez reszty, to zerowa reszta <strong>000</strong> zawsze pojawi się wcześniej. Wykorzystamy tę właściwość w rozdziale 9 na rys. 14.3 gdzie sprawdzamy czy dana liczba dzieli się  bez reszty przez dzielnik. Wtedy zamiast dołączać do dzielnej <strong>same zera</strong>, dołączymy wcześniej obliczoną <strong>resztę</strong>. <br /><br /><strong>NAJWAŻNIEJSZY WNIOSEK</strong><br /><strong>Dołączając bity reszty do dzielnej otrzymamy liczbę podzielną (bez reszty!) przez dzielnik.</strong><br />Przykład:<br />Dzielna <strong>1101011110101</strong><br />Dzielnik <strong>10111</strong><br />Reszta <strong><span style="color: #FF0000">1000</span></strong><br />Tzn że liczba <strong>1101011110101<span style="color: #FF0000">1000</span></strong> dzieli się bez reszty przez 10111<br /><br />Gdyby ta zasada obowiązywała w naszej &quot;ludzkiej&quot; arytmetyce to powstałoby takie dziwadło:<br />Przykład:<br />Dzielna <strong>39</strong><br />Dzielnik <strong>7</strong><br />Reszta <strong><span style="color: #FF0000">4</span></strong><br />Tzn że liczba <strong>39<span style="color: #FF0000">4</span></strong> dzieli się bez reszty przez 7. ( a nie 35=39-4)<br /> <br /><strong><span style="font-size: 150%; line-height: normal">Rozdz.6 Kalkulator obliczania reszty CRC online</span></strong><br />Przy okazji. To co nazywaliśmy <strong>resztą</strong>, można nazwać bardziej dostojnie <strong>reszta CRC</strong>.<br />Omówione wcześniej obliczanie reszty wymaga tylko małpiej zręczności. Nie mniej warto, chociaż raz w życiu zrobić to ręcznie. Chyba każdy student czegoś co ma związek z informatyką, przez to przeszedł. Jak już to umiesz, to nie warto się męczyć, tylko skorzystać z kalkulatora CRC. Tu polecam stronę <!-- m --><a class="postlink" href="http://www.leischner.inf.fh-bonn-rhein-sieg.de/lehrmat/crc.htm" >http://www.leischner.inf.fh-bonn-rhein- ... at/crc.htm</a><!-- m -->. Jest to łatwy kalkulatorek bez niepotrzebnych wodotrysków, stworzony w Hochshule Bonn-Rhein-Sieg. Wystarczy wpisać dzielną, dzielnik, a kalkulator sam doda zera i bzziuu... Myślę że Rys. 13 jest wystarczającą instrukcją.Proponuję sprawdzić wcześniej podane przykłady. Zwłaszcza, że jak do do ostatnich bitów dzielnej dopiszemy resztę <strong>(którą oczywiście wcześniej obliczyliśmy kalkulatorem!)</strong> i ponownie obliczymy resztę, <strong>to będzie zerowa!</strong>. W podanym na Rys. 13 przykładzie, kalkulator liczy to samo, co my ręcznie na rys. 12.1.<br /><img src="http://forum.atnel.pl/_obrazki/o/54/f12ab9151ee4f2dfe7c294e4d7ed23a9.jpg" alt="Obrazek" /><br /><strong>Rys. 13 kalkulator reszty (CRC)</strong><br /><br /><strong><span style="font-size: 150%; line-height: normal">Rozdz. 7 Zamieńmy algorytm obliczania reszty CRC  w algorytm używający rejestrów przesuwnych</span></strong><br /><strong>Uwagi ogólne o dwóch szkołach rozgryzania algorytmów</strong><br /><strong>Szkoła nr 1 - naukowa, mądra, elegancka, ogólna - trudna do zrozumienia</strong><br />Stosowana w rozprawach, pracach magisterskich czy doktorskich. Inaczej nie wypada.<br />Przykład. Chcemy wytłumaczyć jak dzielić 2 liczby dziesiętne.<br />Zaczyna się tak. Załóżmy że dzielna ma n cyfr i dzielnik ma m cyfr. Nad dzielną narysujmy kreskę. Pod najbardziej znaczącą dzielną napiszmy dzielnik tak że najbardziej znacząca cyfra dzielnika ... itd itd. Metoda ta ma same zalety, w tym że dotyczy wszystkich n-cyfrowych <strong>dzieln</strong> i m-cyfrowych <strong>dzielników</strong>. Ma tylko jedną  wadę. Jest mało <strong>intuicyjna</strong>.<br /><strong>Szkoła nr 2 - &quot;nienaukowa&quot;, &quot;nieelegancka&quot;, nieogólna- za to łatwa do zrozumienia</strong><br />Wykorzystujemy konkretny przykład. Np <strong>126588:137</strong> Z tą metodą zetknąłeś się chyba w 4 klasie szkoły podstawowej. Trochę wstyd ją używać, ale ma jedną podstawową zaletę. Jest <strong>intuicyjna</strong>. I chociaż poznałeś tylko jeden przykład, to nie znaczy że do końca życia będziesz umiał dzielić tylko <strong>126588</strong> przez <strong>137</strong>. Umiesz przecież dzielić wszystkie liczby! Czyli też jest <strong>ogólna</strong>. Chociaż dla rasowego matematyka nauczyłeś się dzielić tylko te 2 w/w liczby. <br /><strong>Do wyjaśnienia</strong> wykrywania błędów transmisji przy pomocy <strong>CRC</strong> zastosuję <strong>szkołę nr 2</strong>- Tzn bardzo dokładnie rozpatrzę jak działa wykrywanie błędów gdy <strong> dzielną</strong> (wysyłaną informacją) jest liczba <strong>100011</strong>, dzielnikiem <strong>1011</strong> a obliczoną resztą będzie <strong>111</strong>. Reszta będzie obliczana w pewnego rodzaju rejestrze przesuwnym, którego strukturę spróbujemy wykryć. <strong>Następnie tę strukturę uogólnimy na dowolny dzielnik. </strong> Właśnie w tym zdaniu tkwi &quot;nieścisłość&quot; tej metody. No cóż, zastosowaliśmy może niezbyt etyczną zasadę. Nieważne są <strong>środki</strong> prowadzące do celu, ważny jest <strong>cel</strong>. Najważniejsze że będziesz czuł jak to działa.<br /><br /><img src="http://forum.atnel.pl/_obrazki/o/54/efcd319ed2b83adc16e4e3fc948a45f7.png" alt="Obrazek" /><br /><strong>Rys. 14.1 &quot;Rejestrowa&quot; wersja algorytmu</strong><br /><strong>Opis ogólny</strong><br />Omawiany algorytm będzie &quot;rejestrową&quot; wersją algorytmu klasycznego  (np z rys. 12.1 , 13). Dalej to już tylko krok do zaprojektowania odpowiedniej elektroniki. Do <strong>rejestru CRC</strong> wprowadzana jest bit po bicie dzielna np. <strong>100011<span style="color: #FF0000">000</span></strong> z 3 dodatkowymi  zerami. Przy każdym wprowadzeniu bitu, rejestr <strong>CRC</strong> jest w prosty sposób uaktualniany. Co prawda, już nie tak prosto jak zwykłe przesunięcie, ale jeszcze w sposób możliwy do łyknięcia. Na zakończenie <strong>rejestr CRC</strong> będzie zawierał resztę z dzielenia. Proszę zwrócić uwagę na to, <strong>że takie &quot;nic&quot;, jak to 3-bitowe CRC,  oblicza resztę z dzielenia, nawet z większej dzielnej  np. o długości 10 tys. bitów!!!</strong><br /><br /><strong>Stan początkowy algorytmu</strong> (rys. 14.1)<br /><strong>rejestr Dzielna +3 zera </strong>- rejestr przesuwny którego stanem początkowym jest <strong>100011<span style="color: #FF0000">000</span></strong> (<strong>100011</strong> to komunikat przeznaczony do wysłania)<br /><strong>rejestr CRC</strong> - rejestr  3-bitowy którego stanem początkowym jest <strong>000</strong><br /><strong>rejestr Dzielnik</strong> - Stała pamięć <strong>ROM</strong> zawierająca dzielnik <strong>1011</strong>. Jak to w <strong>ROM</strong>-ie, zawartość się nie zmienia.<br />Sercem układu jest<strong> CRC</strong>. Jest on wyższą szkołą jazdy rejestrów przesuwnych. W zwykłym rejestrze nowy stan, to po prostu przesunięte w lewo bity. W <strong>CRC</strong> bity mogą być tylko przesunięte. Ale mogą być też po przesunięciu <strong>xor</strong>-owane z trzema najmłodszymi bitami <strong>Dzielnika</strong> (tu <strong>011</strong>). Czyli <strong>xor-owane</strong> będzie &quot;niebieskie z zielonym&quot;. Przy każdym przesunięciu <strong>Dzielna +3 zera</strong> jest skracana o 1 bit. Algorytm się skończy, gdy <strong>Dzielna +3 zera</strong> zniknie całkowicie.  Wtedy <strong>CRC</strong> będzie zawierał <strong>resztę</strong> z dzielenia.<br /><br /><img src="http://forum.atnel.pl/_obrazki/o/54/2bdecdd08f6e252ad68e1adc746de141.jpg" alt="Obrazek" /><br /> <strong>Rys. 14.2. Jak działa &quot;rejestrowy&quot; algorytm obliczania reszty CRC </strong> <br />Każdy (niepokazany na rysunku) impuls zegarowy wprowadza aktualnie najstarszy  bit z <strong>Dzielna + 3 zera</strong> do <strong>CRC</strong>. Za każdym razem <strong>Dzielna + 3 zera</strong> skraca się o jeden bit. Pokazano &quot;fotografie&quot; rejestrów w każdym z 9 stanów. <strong>Stan 0</strong> to stan początkowy (jak na rys. 14.1) a <strong>stan 9 </strong> to końcowy. W tym stanie w <strong>CRC</strong> jest już ostatecznie obliczona reszta z dzielenia - tu <strong>111</strong>.<br /><strong>Uwaga</strong> Algorytm obliczania reszty CRC będzie wymagał <strong>xor</strong>-owania:<br />- 3 najmłodszych najmłodszych bitów (&quot;niebieskich&quot;) <strong>Dzielnika</strong> --&gt;<strong>011</strong><br />- z 3 bitami (&quot;zielonymi&quot;) <strong>CRC</strong> <br /><br /><strong>Algorytm jest bardzo prosty</strong><br /><strong>1 - Jeżeli</strong> najstarszy  bit <strong>CRC = 0 </strong>, to w następnym stanie tylko przesuń <strong>CRC i Dzielna + 3 zera </strong> o 1 bit w lewo.<br /><strong>2 - Jeżeli</strong> najstarszy bit <strong>CRC = 1 </strong> to w następnym stanie :<br />......Przesuń  <strong>CRC i Dzielna+3 zera </strong> o 1 bit w lewo.<br />......Potem <strong>xor</strong>-uj 3 najmłodsze bity <strong>Dzielnika</strong> (tu <strong>011</strong>) z bitami <strong>CRC</strong><br />Przy każdym stanie na rys. 14.2 jest polecenie wynikające z w/w algorytmu. Gdy <strong>najstarszy</strong> bit <strong>CRC = 0</strong> to tylko przesuń w lewo, a gdy <strong>1</strong> to itd... Efekt tego polecenia jest oczywiście widoczny w następnym stanie.<br /><br /><strong>Przykład:</strong><br /><strong>W stanie 3</strong> <br /><strong>CRC=<span style="color: #00BF00">100</span></strong> i  <strong>Dzielna + 3 zera = 011<span style="color: #FF0000">000</span></strong> <br /><strong>W stanie 4 </strong><br />- po przesunięciu <strong>CRC=<span style="color: #00BF00">000</span></strong> (ten stan nie jest pokazany na rysunku)<br />- po xor-owaniu  <strong><span style="color: #00BF00">000</span></strong> z <span style="color: #0000BF"><strong>011</strong></span> <strong>CRC=<span style="color: #00BF00">011</span></strong><br /><br />Na podstawie rys. 14.2 można, już zrealizować układ obliczający resztę z dzielenia! <strong>Bezpośrednio na rejestrach i xor-ach!</strong> Rozdział <strong>8</strong> pokaże, że można to zrobić jeszcze prościej.<br /><br /><img src="http://forum.atnel.pl/_obrazki/o/54/9406767b1e2e91be4d25fc7de9a58010.jpg" alt="Obrazek" /><br /><strong>Rys. 14.3. Sprawdzenie czy komunikat 1000011 + reszta <span style="color: #FF0000">111</span>, da nam resztę 000?</strong><br />Na rys. 14.2 do komunikatu w stanie 0 dołączyliśmy 000. W ten sposób w stanie 9 otrzymaliśmy<strong> resztę=111</strong> z dzielenia <strong>100011:1011</strong>. A co by było, gdyby zamiast <span style="color: #FF0000">000</span> wstawić resztę <span style="color: #FF0000">111</span>? Okaże się, że obliczona reszta to <strong>000</strong>. Jest to zgodne z <strong>xor</strong>-ową teorią dzielenia. W rozdz. 6 stwierdziliśmy <strong>&quot;Dołączając bity reszty do dzielnej, otrzymamy liczbę podzielną (bez reszty!) przez dzielnik&quot;.</strong><br /><br />Ciąg dalszy w <strong>Jak CRC wykrywa błędy transmisji? <a href="http://forum.atnel.pl/topic3556.html"  class="postlink">część.2 <span style="font-size: 200%; line-height: normal">LINK</span></a> </strong><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>