Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 26 mar 2026, o 05:29


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 6 ] 
Autor Wiadomość
PostNapisane: 14 sie 2016, o 10:10 
Offline
Użytkownik

Dołączył(a): 07 paź 2015
Posty: 79
Pomógł: 0

Szanowni Forumowicze,
Zagłębiając się w temat znalazłem funkcję liczącą CRC w bibliotece na arduino do tego czujnika. Dowiedziałem się też, że jest biblioteka o nazwie crc16.h w katalogu util. Pierwotnie chciałem z niej korzystać, ale wymaga argumentów 8-bitowych, a z tego, co zrozumiałem z datasheet'a czujnika i patrząc na funkcję z biblioteki arduino muszę zlepić ze sobą dane pomiarowe z czujnika, czyli otrzymam 16-bitową liczbę. Postać funckji z crc16.h:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Funkcja z biblioteki arduino:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Użycie w programie:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Starałem się analizować to co piszą w DS do czujnika jednocześnie czytając kod funkcji. I mam problem z tym, że nie do końca rozumiem początek:
Cytuj:
calculation
To compute an n-bit binary CRC, line the bits representing the input in a row, and position the (n+1)-bit pattern
representing the CRC's divisor (called a "polynomial") underneath the left-hand end of the row.
This is first padded with zeroes corresponding to the bit length n of the CRC.
If the input bit above the leftmost divisor bit is 0, do nothing. If the input bit above the

Podejrzewam, że tu ma uzasadnienie to:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

W bibliotece arduino jest odnośnik do wiki: http://en.wikipedia.org/wiki/Computatio ... ncy_checks
ale dalej nie wiem skąd SHIFTED_DIVISOR. Widzę, że 0x988 to przesunięcie w prawo o trzy 0x0131 z dopisanymi 12ma zerami z prawej, ale skąd u diabła akurat takie wartości? Ma to związek z wielomianem X^8 + X^5 + X^4 + 1, który jest podany w DS czujnika?

Proszę uprzejmie o wskazówki i pozdrawiam,
Dawid.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 4 paź 2016, o 16:10 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 14 lut 2014
Posty: 279
Lokalizacja: Kraków
Pomógł: 4

Na podstawie dokumentacji napisałem własną obsługę tego czujnika. Właśnie skończyłem CRC. Zainteresowany?

_________________
http://forum.atnel.pl/topic15633.html



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 paź 2016, o 14:47 
Offline
Użytkownik

Dołączył(a): 07 paź 2015
Posty: 79
Pomógł: 0

No pewnie :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 paź 2016, o 11:08 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 14 lut 2014
Posty: 279
Lokalizacja: Kraków
Pomógł: 4

To może na początek coś na rozruszanie mózgu :idea:

Postanowiłem, że napiszę sobie najprostszą funkcję do obliczania CRC dla mojego przypadku.

Założenia były następujące:

- Wielomian postaci: X^8+X^5+X^4+X^0 co daje binarnie: 0b100110001 - długość 9 bitów!!!! - to jest bardzo ważne, 9 ;)
- Obrabiane dane mieszczą się w typie uint16_t - jeśli więcej to trzeba zmodyfikować kod.

A działanie przedstawia się następująco:

- do zmiennej roboczej wsuwamy najstarszy bit zmiennej dane
- za pomocą odpowiedniej maski (0b00000001 00000000) sprawdzamy czy przypadkiem już w zmiennej roboczej na pozycji 9 nie pojawila się jedynka
- jeśli nie to wsuwamy następny bit i ponownie sprawdzamy warunek

- pojawiła się w końcu jedynka... więc zmienną roboczą XORujemy wartością naszego wielomianu :!: (0b100110001)

- ... i znowu wsuwamy bit, i znowu sprawdzamy czy na pozycji 9...

jak długo? odpowiedź: tyle ile jest bitów w naszej zmiennej dane plus długość naszego wielomianu (9bitów) minus jeden co daje łącznie 24 przesunięcia ;)
rzecz jasna ostatnie 8 bitów jakie się wsuną to będą same zera.


po tej 24 operacji przesunięcia sprawdzamy co znajduje się aktualnie w naszej zmiennej roboczej .

Powinna to być właśnie suma kontrolna identyczna z tą nadesłaną przez czujnik ;)

podsyłam na szybko prosty kod przedstawiający metodę w akcji .
Był przygotowany w oparciu o zestaw ATB z atmega32A na pokładzie i bibliotekę do obsługi uart z BlueBook'a

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


a tutaj jest jest biblioteka do funkcji crc8:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


i plik nagłówkowy
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Autor postu otrzymał pochwałę

_________________
http://forum.atnel.pl/topic15633.html



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 paź 2016, o 20:18 
Offline
Użytkownik

Dołączył(a): 07 paź 2015
Posty: 79
Pomógł: 0

Widzisz, od razu mi jest jaśniej :) Samą procedurę obliczania CRC już rozumiem.

Mam jeszcze pytanie do wielomianów:
Cytuj:
Wielomian postaci: X^8+X^5+X^4+X^0 co daje binarnie: 0b100110001

Znaczy to, że mamy jak mamy jakiś wielomian n-tego stopnia to binarnie jedynkę mamy tam, gdzie występuje niezerowy współczynnik?
Np.: wielomian X^5+X^3+X^1 binarnie będzie wyglądał tak: 0b101010.
I przy okazji - jak mam rozumieć binarne zapisanie wielomianu? Jak ma się jedno do drugiego? :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 paź 2016, o 22:49 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 14 lut 2014
Posty: 279
Lokalizacja: Kraków
Pomógł: 4

dawid75_75 napisał(a):
Znaczy to, że mamy jak mamy jakiś wielomian n-tego stopnia to binarnie jedynkę mamy tam, gdzie występuje niezerowy współczynnik?
Np.: wielomian X^5+X^3+X^1 binarnie będzie wyglądał tak: 0b101010.
I przy okazji - jak mam rozumieć binarne zapisanie wielomianu? Jak ma się jedno do drugiego? :)

Dokładnie tak. Ja ten zapis wielomianowy traktuję jako zapis bajtów klucza w sposób skrócony. Bo ile trzeba by napisać gdyby wyraz pierwszy był wyższego rzędu niż. 5?

CRC-32
0x04C11DB7 (tu już zapis hex jest długawy, a wyobraź sobie zapis binarny)
x32 + x26 + x23 + x22 + x16 + x12 + x11 + x10 + x8 + x7 + x5 + x4 + x2 + x1 + 1

_________________
http://forum.atnel.pl/topic15633.html



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 6 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 0 gości


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO