CRC



Masz problem? Zapytaj na forum elektroda.pl z bramk± pl.misc.elektronika!

Poprzedni Następny
Wiadomość
spis tre¶ci
From: "Maniek" <ks_at_nospam_pg.gda.pl>
Subject: CRC
Date: Thu, 04 Feb 1999 10:45:33 GMT


Czy ktos zrobil kiedys procedurki liczenia crc - sumy kontrolnej dla 51`ki
w asemblerze? Oferuje w zamian inne procedurki np: RS485 pamiec szeregowa
EEPROM itp.

Maniek

Poprzedni Następny
Wiadomość
spis tre¶ci
From: jareka_at_nospam_dawid.com.pl (Jaroslaw Andrzejewski)
Subject: Re: CRC
Date: Thu, 04 Feb 1999 10:52:32 GMT


Thu, 04 Feb 1999 10:45:33 GMT, "Maniek" <ks_at_nospam_pg.gda.pl> napisał(-a):

Czy ktos zrobil kiedys procedurki liczenia crc - sumy kontrolnej dla 51`ki
w asemblerze? Oferuje w zamian inne procedurki np: RS485 pamiec szeregowa
Tak. Dallas opublikował tak± procedurkę do liczenia CRC dla swoich
"pastylek".


--
Jarek Andrzejewski

--
Serwis RUBIKON - http://rubikon.pl - 020 92 47

Poprzedni Następny
Wiadomość
spis tre¶ci
From: kulikk_at_nospam_zeus.polsl.gliwice.pl (Klaudiusz Kulik)
Subject: Re: CRC - listing
Date: 4 Feb 1999 22:15:14 GMT


Maniek pisze:
Czy ktos zrobil kiedys procedurki liczenia crc - sumy kontrolnej dla 51`ki
w asemblerze? Oferuje w zamian inne procedurki np: RS485 pamiec szeregowa
EEPROM itp.

Wysylam na liste - moze komus sie przyda. Jest to implementacja
algorytmu CRC16 w szybszej wersji (korzystajacej z tablic), a bedaca
przerobka funkcji oryginalnie napisanej w C.

BTW. Szybciej sie chyba tego nie da napisac. Moze ktos sprobuje? ;)

--- BEGIN ---

DSEG AT 0020h

CRCHi: ds 01h ; CRC starszy bajt
CRCLo: ds 01h ; CRC mlodszy bajt
index: ds 01h ; wskaznik danych

CSEG
USING 0

; obliczanie crc16
; wejscie: r0 = adres bufora
; r1 = dlugosc bufora
; wyjscie: CRCHi i CRCLo

crc16:

mov CRCHi,#0FFh
mov CRCLo,#0FFh

crc16_1:
; najpierw obliczenie index
mov a,_at_nospam_r0
xrl a,CRCHi
mov index,a ; index = CRCHi ^ bufor[r0]

inc r0 ; nastepny znak z bufora


mov dptr,#CRCHiTable
movc a,_at_nospam_a+dptr ; acc = CRCHiTable[index]
xrl a,CRCLo
mov CRCHi,a ; CRCHi = CRCLo ^
; CRCHiTable[index]


mov dptr,#CRCLoTable
mov a,index
movc a,_at_nospam_a+dptr
mov CRCLo,a ; CRCLo = CRCLoTable[index]


djnz r1,crc16_1 ; czy juz caly bufor?

ret


; Tablice kodow do algorytmu CRC16

CRCHiTable:
db 000h, 0C1h, 081h, 040h, 001h, 0C0h, 080h, 041h, 001h, 0C0h
db 080h, 041h, 000h, 0C1h, 081h, 040h, 001h, 0C0h, 080h, 041h
db 000h, 0C1h, 081h, 040h, 000h, 0C1h, 081h, 040h, 001h, 0C0h
db 080h, 041h, 001h, 0C0h, 080h, 041h, 000h, 0C1h, 081h, 040h
db 000h, 0C1h, 081h, 040h, 001h, 0C0h, 080h, 041h, 000h, 0C1h
db 081h, 040h, 001h, 0C0h, 080h, 041h, 001h, 0C0h, 080h, 041h
db 000h, 0C1h, 081h, 040h, 001h, 0C0h, 080h, 041h, 000h, 0C1h
db 081h, 040h, 000h, 0C1h, 081h, 040h, 001h, 0C0h, 080h, 041h
db 000h, 0C1h, 081h, 040h, 001h, 0C0h, 080h, 041h, 001h, 0C0h
db 080h, 041h, 000h, 0C1h, 081h, 040h, 000h, 0C1h, 081h, 040h
db 001h, 0C0h, 080h, 041h, 001h, 0C0h, 080h, 041h, 000h, 0C1h
db 081h, 040h, 001h, 0C0h, 080h, 041h, 000h, 0C1h, 081h, 040h
db 000h, 0C1h, 081h, 040h, 001h, 0C0h, 080h, 041h, 001h, 0C0h
db 080h, 041h, 000h, 0C1h, 081h, 040h, 000h, 0C1h, 081h, 040h
db 001h, 0C0h, 080h, 041h, 000h, 0C1h, 081h, 040h, 001h, 0C0h
db 080h, 041h, 001h, 0C0h, 080h, 041h, 000h, 0C1h, 081h, 040h
db 000h, 0C1h, 081h, 040h, 001h, 0C0h, 080h, 041h, 001h, 0C0h
db 080h, 041h, 000h, 0C1h, 081h, 040h, 001h, 0C0h, 080h, 041h
db 000h, 0C1h, 081h, 040h, 000h, 0C1h, 081h, 040h, 001h, 0C0h
db 080h, 041h, 000h, 0C1h, 081h, 040h, 001h, 0C0h, 080h, 041h
db 001h, 0C0h, 080h, 041h, 000h, 0C1h, 081h, 040h, 001h, 0C0h
db 080h, 041h, 000h, 0C1h, 081h, 040h, 000h, 0C1h, 081h, 040h
db 001h, 0C0h, 080h, 041h, 001h, 0C0h, 080h, 041h, 000h, 0C1h
db 081h, 040h, 000h, 0C1h, 081h, 040h, 001h, 0C0h, 080h, 041h
db 000h, 0C1h, 081h, 040h, 001h, 0C0h, 080h, 041h, 001h, 0C0h
db 080h, 041h, 000h, 0C1h, 081h, 040h

CRCLoTable:
db 000h, 0C0h, 0C1h, 001h, 0C3h, 003h, 002h, 0C2h, 0C6h, 006h
db 007h, 0C7h, 005h, 0C5h, 0C4h, 004h, 0CCh, 00Ch, 00Dh, 0CDh
db 00Fh, 0CFh, 0CEh, 00Eh, 00Ah, 0CAh, 0CBh, 00Bh, 0C9h, 009h
db 008h, 0C8h, 0D8h, 018h, 019h, 0D9h, 01Bh, 0DBh, 0DAh, 01Ah
db 01Eh, 0DEh, 0DFh, 01Fh, 0DDh, 01Dh, 01Ch, 0DCh, 014h, 0D4h
db 0D5h, 015h, 0D7h, 017h, 016h, 0D6h, 0D2h, 012h, 013h, 0D3h
db 011h, 0D1h, 0D0h, 010h, 0F0h, 030h, 031h, 0F1h, 033h, 0F3h
db 0F2h, 032h, 036h, 0F6h, 0F7h, 037h, 0F5h, 035h, 034h, 0F4h
db 03Ch, 0FCh, 0FDh, 03Dh, 0FFh, 03Fh, 03Eh, 0FEh, 0FAh, 03Ah
db 03Bh, 0FBh, 039h, 0F9h, 0F8h, 038h, 028h, 0E8h, 0E9h, 029h
db 0EBh, 02Bh, 02Ah, 0EAh, 0EEh, 02Eh, 02Fh, 0EFh, 02Dh, 0EDh
db 0ECh, 02Ch, 0E4h, 024h, 025h, 0E5h, 027h, 0E7h, 0E6h, 026h
db 022h, 0E2h, 0E3h, 023h, 0E1h, 021h, 020h, 0E0h, 0A0h, 060h
db 061h, 0A1h, 063h, 0A3h, 0A2h, 062h, 066h, 0A6h, 0A7h, 067h
db 0A5h, 065h, 064h, 0A4h, 06Ch, 0ACh, 0ADh, 06Dh, 0AFh, 06Fh
db 06Eh, 0AEh, 0AAh, 06Ah, 06Bh, 0ABh, 069h, 0A9h, 0A8h, 068h
db 078h, 0B8h, 0B9h, 079h, 0BBh, 07Bh, 07Ah, 0BAh, 0BEh, 07Eh
db 07Fh, 0BFh, 07Dh, 0BDh, 0BCh, 07Ch, 0B4h, 074h, 075h, 0B5h
db 077h, 0B7h, 0B6h, 076h, 072h, 0B2h, 0B3h, 073h, 0B1h, 071h
db 070h, 0B0h, 050h, 090h, 091h, 051h, 093h, 053h, 052h, 092h
db 096h, 056h, 057h, 097h, 055h, 095h, 094h, 054h, 09Ch, 05Ch
db 05Dh, 09Dh, 05Fh, 09Fh, 09Eh, 05Eh, 05Ah, 09Ah, 09Bh, 05Bh
db 099h, 059h, 058h, 098h, 088h, 048h, 049h, 089h, 04Bh, 08Bh
db 08Ah, 04Ah, 04Eh, 08Eh, 08Fh, 04Fh, 08Dh, 04Dh, 04Ch, 08Ch
db 044h, 084h, 085h, 045h, 087h, 047h, 046h, 086h, 082h, 042h
db 043h, 083h, 041h, 081h, 080h, 040h

--- END ---

Maniek


--
K.

Poprzedni Następny
Wiadomość
spis tre¶ci
From: "Maniek" <ks_at_nospam_pg.gda.pl>
Subject: Dzieki potworne
Date: Fri, 05 Feb 1999 14:34:04 GMT


WDZIECZNOSC MOJA GRANIC NIE ZNA !

#Maniek

Poprzedni Następny
Wiadomość
spis tre¶ci
From: "Maniek" <ks_at_nospam_pg.gda.pl>
Subject: KLOPOTY
Date: Sat, 06 Feb 1999 09:09:21 GMT


No to pieknie: mam 3 rozne procedury. Jedna z nich zapodal Pan Klaudiusz
Kulik, druga zrobilem w oparciu o ten sam algorytm a trzecia napisalem w
oparciu o algorytm funkcyjny - patrz ksiazka "interfejsy szeregowe".
KAZDY LICZY INACZEJ ! ! !
Proponuje wspaniala zabawe - niech kazdy kto ma z tym cos wspolnego obliczy
CRC z 6 bajtow danych z ktorych kazdy jest np. rowny zero.
A oto moje typy; 0DDD5h lub 001Bh lub 001Bh - zadziwiajace dwa wyniki a
rozne metody, jednak dla innych liczb wej. jest inaczej.
Wynik jest dwubajtowy.

Kto sie ze mna pobawi ?

#Maniek

Poprzedni Następny
Wiadomość
spis tre¶ci
From: kulikk_at_nospam_zeus.polsl.gliwice.pl (Klaudiusz Kulik)
Subject: Re: KLOPOTY
Date: Sun, 07 Feb 1999 17:39:49 GMT


Maniek pisze:

A oto moje typy; 0DDD5h lub 001Bh lub 001Bh - zadziwiajace dwa wyniki a
rozne metody, jednak dla innych liczb wej. jest inaczej.

Cos pochrzaniles. U mnie wychodzi 001Bh. Dla szesciu bajtow
0FFh: 0194h; dla szesciu bajtow 7Fh: 57C2h. Wyniki zgadzaja sie dla
kodu w asm., jak i dla oryginalnego kodu w C.

#Maniek

--
K.