logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Jak obliczyć i sprawdzić CRC dla danych z czujnika DS18b20?

Tomcio7 29 Sie 2008 16:51 7085 7
REKLAMA
  • #1 5487390
    Tomcio7
    Poziom 17  
    Posty: 297
    Pomógł: 8
    Ocena: 19
    Troszkę szukałem no i dalej jestem nemo. Jak zrobić tą kontrolę dla 9 bajtów danych z czujnika temperatury DS18b20

    Pierwsze 8 bajtów są danymi (mniej lub bardziej znaczącymi) a ostatni bajt to właśnie CRC. Gdy mam już te 8 bajtów to jak policzyć dla nich CRC i sprawdzić z tym 9bajtem?

    Znalazłem wzór X^8 + x^5 + x^4 + 1 - ale nie wiem jak go wykorzystać...
  • REKLAMA
  • #2 5487456
    ciastek4
    Poziom 14  
    Posty: 118
    Pomógł: 4
    Obrazek z dokumentacji:

    Jak obliczyć i sprawdzić CRC dla danych z czujnika DS18b20?

    Mozna to tak zrobić:

    dla jednego bajtu:

    1) CRC = 0
    2) sprawdz czy wyrazenie (LSB xor Input bit (kolejne bity w bajcie) jest rowne jeden.
    3)przesuń bity w CRC ( np. CRC >>=1; (C) )
    4)Jezeli wyrazenie z podpunktu 2 jest prawdziwe to wykonaj operację :CRC = CRC xor 0x1C ( negujesz tym sposobem bity o numerach 8,4,3) ( tak jak na rysunku wyżej).
    Jeżeli nie to nie rób nic.
    5)powtórz wyrażnienie od punktu 2 ( aż sprawdzisz wszystkie bity w bajcie :D )

    Jeżeli masz wiecej niż jedne bajt danych i chcesz z nich policzyć CRC to wykonujesz 1 podpunkt i walisz już do końca 2,3,4,5 .. 2,3,4,5 itd

    Nie jestem pewien ale wydaje mi się ze pierwszym bitem który ladujesz do Input bit będzie LSB z bajtu którego będziesz liczył CRC.


    Jeżeli nie jasno napisałem to proszę daj znać
    Mam nadzieję że pomogłem
  • REKLAMA
  • #3 5487577
    Tomcio7
    Poziom 17  
    Posty: 297
    Pomógł: 8
    Ocena: 19
    gdyby można było prościej - programuje w [c]
    na przykładzie. Może ktoś inny z tego też skorzysta.
  • REKLAMA
  • Pomocny post
    #4 5487669
    skritland
    Poziom 13  
    Posty: 21
    Pomógł: 2
    W załączniku jest "moja" biblioteka. Moja w cudzysłowiu, bo to jedynie przepisane z noty aplikacyjnej atmela i przerobione przeze mnie na gcc.
    Załączniki:
    • owi_crc.rar (874 Bajtów) Musisz być zalogowany, aby pobrać ten załącznik.
  • Pomocny post
    #5 5487924
    ciastek4
    Poziom 14  
    Posty: 118
    Pomógł: 4
    Przedmówca zamieścił właśnie kod który działa tak samo jak wcześniej opisałem :)

    W załączniku przedstawiam moją wersję CRC ( co prawda nie testowałem jej ale wydaj się prawidłowa ( dla innych CRC działa bezproblemowo)

    pozdrawiam
    Załączniki:
    • crc.txt (508 Bajtów) Musisz być zalogowany, aby pobrać ten załącznik.
  • REKLAMA
  • #6 5490417
    Tomcio7
    Poziom 17  
    Posty: 297
    Pomógł: 8
    Ocena: 19
    Wersja (ciastek4) jak najbardziej poprawnie działa dla 1wire
  • #7 5494880
    BoskiDialer
    Poziom 34  
    Posty: 1530
    Pomógł: 353
    Ocena: 42
    Tomcio7: Jeśli wersja od ciastek4 działa poprawnie, to tutaj wrzucam jego kod zoptymalizowany przeze mnie (liczenie równoległe):
    uint8_t CRC8(uint8_t *inData, uint8_t len)
    {
    	uint8_t crc;
    	crc = 0;
    	for(; len; len--)
    	{
    		crc ^= *inData++;
    		crc ^= (crc << 3) ^ (crc << 4) ^ (crc << 6);
    		crc ^= (crc >> 4) ^ (crc >> 5);
    	}
    	return crc;
    }
  • #8 12167144
    vonfatt
    Poziom 2  
    Posty: 2
    Do kolegi BoskiDialer, jeżeli jeszcze czyta forum, prośba o wyjaśnienie, jak doszedł do tej równoległej wersji, która rzeczywiście działa. Ta optymalizacja graniczy trochę z magią...

Podsumowanie tematu

LABEL_AI_GENERATED
Dyskusja dotyczy metody obliczania i weryfikacji CRC dla 9 bajtów danych z czujnika temperatury DS18b20, gdzie pierwsze 8 bajtów to dane, a 9. bajt to CRC. Wskazano, że CRC oblicza się bitowo, stosując wielomian X^8 + X^5 + X^4 + 1, co odpowiada polinomowi 0x1C. Przedstawiono algorytm krok po kroku: inicjalizacja CRC na 0, iteracyjne sprawdzanie bitów (LSB) każdego bajtu, przesunięcia bitowe i operacje XOR z wartością 0x1C w zależności od wyniku XOR bitów. Zaproponowano implementację w języku C, w tym zoptymalizowaną wersję równoległą funkcji CRC8, która wykorzystuje operacje XOR i przesunięcia bitowe dla całego bufora danych. Kod ten jest zgodny z notą aplikacyjną Atmela i działa poprawnie dla protokołu 1-Wire stosowanego w DS18b20. W dyskusji pojawiła się prośba o wyjaśnienie optymalizacji kodu równoległego, która jest bardziej złożona, ale efektywna.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA