Ja sam koristio tabelu, imaš objašnjeno u maxim-ovom AN-u kako se koristi tabela umesto matematike ili ti šiftovanja.
Evo ti primer u mikroBasicu, za ds1820 temperaturni senzor. Kada ospojiš senzor ili bilo koji pin senzora prijaviće grešku na lcd-u,
ako isto uradiš bez CRC kontrole prijavljulje ili 12.5 ili 85 stepeni, ako se dobro sećam.
Code:
program crc_chek
const crc_table as byte[256]=(
0,94,188,226,97,63,221,131,194,156,126,32,163,253,31,65,
157,195,33,127,252,162,64,30,95,1,227,189,62,96,130,220,
35,125,159,193,66,28,254,160,225,191,93,3,128,222,60,98,
190,224,2,92,223,129,99,61,124,34,192,158,29,67,161,255,
70,24,250,164,39,121,155,197,132,218,56,102,229,187,89,7,
219,133,103,57,186,228,6,88,25,71,165,251,120,38,196,154,
101,59,217,135,4,90,184,230,167,249,27,69,198,152,122,36,
248,166,68,26,153,199,37,123,58,100,134,216,91,5,231,185,
140,210,48,110,237,179,81,15,78,16,242,172,47,113,147,205,
17,79,173,243,112,46,204,146,211,141,111,49,178,236,14,80,
175,241,19,77,206,144,114,44,109,51,209,143,12,82,176,238,
50,108,142,208,83,13,239,177,240,174,76,18,145,207,45,115,
202,148,118,40,171,245,23,73,8,86,180,234,105,55,213,139,
87,9,235,181,54,104,138,212,149,203,41,119,244,170,72,22,
233,183,85,11,136,214,52,106,43,117,151,201,74,20,246,168,
116,42,200,150,21,75,169,247,182,232,10,84,215,137,107,53)
dim scratch_pad as byte[9]
dim tmp_sign,i,j as byte
dim text as string[6]
sub function crc_check(dim byref data as byte[9])as byte
dim j,i,crc as byte
j=0
i=0
crc=0
for j=0 to 8
i = crc xor data[j]
crc = crc_table[i]
next j
if crc=0
then result=255 'CRC O.K
else result=0 'CRC-ERROR
end if
end sub
main:
text = "Temp:"
adcon1 = 255
PORTA = 255
PORTB = 0
TRISA = 255
TRISB = 0
Lcd_Init(PORTB)
lcd_cmd(LCD_CURSOR_OFF)
lcd_out(1, 1, text)
lcd_chr(2, 10, 223)
lcd_chr(2, 11, "C")
while true
ow_reset(PORTA, 5)
ow_write(PORTA, 5, $CC)
ow_write(PORTA, 5, $44)
delay_ms(1)
i = ow_reset(PORTA, 5)
ow_write(PORTA, 5, $CC)
ow_write(PORTA, 5, $BE)
''''''''''''''''''''''''''''''''''''''''''''''''''''
'Read all Cratch-pad and store in 9 byte array
''''''''''''''''''''''''''''''''''''''''''''''''''''
for j=0 to 8
scratch_pad[j]=ow_read(porta,5)
next j
'scratch_pad[7].7=1 'this bit is always zero
'corrupting data packet
' only for test
''''''''''''''''''''''''''''''''''''''''''''''''''''
' call cyclic redundancy check sub function
''''''''''''''''''''''''''''''''''''''''''''''''''''
i=crc_check(scratch_pad)
if i ' if true crc is o.k.
then if scratch_pad[1]=255
then tmp_sign="-"
scratch_pad[0]= not scratch_pad[0]
scratch_pad[0]=scratch_pad[0]+1
else tmp_sign="+"
end if
scratch_pad[1] = (scratch_pad[0] and $01) * 5
scratch_pad[0] = scratch_pad[0]>>1
ByteToStr(scratch_pad[0], text)
lcd_chr(2, 7, tmp_sign)
lcd_chr(2, 8, text[1])
lcd_chr(2, 9, text[2])
lcd_chr(2, 10, 46)
ByteToStr(scratch_pad[1], text)
lcd_chr(2, 11, text[2])
lcd_out(2,2," ")
''''''''''''''''''''''''''''''''''''''''''''''''''''''
' if crc_check return false then print error
'''''''''''''''''''''''''''''''''''''''''''''''''''''
else lcd_out(2,2,"CRC-ERROR ")
end if
delay_ms(500)
wend
end.