{{17.48.1_Example_WRD_CRCBIT D,{#}S_131}} {{ CRCBIT D,{#}S Iterate CRC value in D using C and polynomial in S. If (C XOR D[0]) then D = (D >> 1) XOR S, else D = (D >> 1). Example send n bytes to have string CRC genetated code is set for one byte is being sent for testing }} CON _clkfreq = 20_000_000 ''Debug must be enabled clock must be greater than 10MHZ for Debug VAR byte src[4] ' long address_src[4] long byteNum long answerCRC8 ' long poly PUB main()|x debug("--------------------------------------") debug("CRCBIT D,{#}S") debug("Iterate CRC value in D using C and polynomial in S. If (C XOR D[0])") debug("then D = (D >> 1) XOR S, else D = (D >> 1).") debug("Example") debug(" ") debug("--------------------------------------") byteNum := 4 src[0] := $77 src[1] := $78 src[2] := $79 src[3] := $7A debug("before CRC8 Calculation ",ubin_byte(answerCRC8)) ' repeat x from 0 to 3 ' address_src[x] := @src[x] ' debug(udec(x),udec(address_src[x]),ubin_byte(src[x]),uhex(src[x])) answerCRC8 := CR8_spin(@src,byteNum) ' answerCRC8 := CR8_crcbit(@src,byteNum) ' answerCRC8 := CR8_discrete(@src,byteNum) debug("after CRC8 Calculation ",ubin_byte(answerCRC8),udec(answerCRC8)) debug("--------------------------------------") repeat 'keep cog 0 running PUB CR8_spin(p_src,n) : crc | data repeat n data := byte[p_src++] ' retrieve a byte of data repeat 8 if crc & 1 <> data & 1 ' if lsb of crc and lsb of data are not equal crc >>= 1 ' shift crc right 1 crc ^= $8C ' xor crc with polynomial $8C else ' if lsbs are equal crc >>= 1 ' then shift but don't xor data >>= 1 ' put next bit of data into lsb debug(ubin_byte(crc),ubin_byte(data)) debug(" ") PUB CR8_crcbit(p_src,n) : crc | data, bit_ctr org byte_loop rdbyte data, p_src add p_src, #1 mov bit_ctr,#8 .bit_loop shr data,#1 wc crcbit crc, #$8C debug(ubin_byte(crc),ubin_byte(data)) djnz bit_ctr,#.bit_loop debug(" ") .done djnz n, #byte_loop end PUB CR8_discrete(p_src,n) : crc | data, bit_ctr org byte_loop rdbyte data, p_src add p_src, #1 mov bit_ctr,#8 .bit_loop shr data,#1 wc testb crc,#0 wz shr crc,#1 if_c_ne_z xor crc, #$8C debug(ubin_byte(crc),ubin_byte(data)) djnz bit_ctr,#.bit_loop debug(" ") .done djnz n, #byte_loop end CON {{ 1st byte $77 crc z data c 00000000 01110111 starting values 00000000 0 00111011 1 test crc bit 0 into z, shift crc right 1, shift data right 1 into c 10001100 c_ne_z so xor crc with $8C 01000110 0 00011101 1 test crc bit 0 into z, shift crc right 1, shift data right 1 into c 11001010 c_ne_z so xor crc with $8C 01100101 0 00001110 1 test crc bit 0 into z, shift crc right 1, shift data right 1 into c 11101001 c_ne_z so xor crc with $8C 01110100 1 00000111 0 test crc bit 0 into z, shift crc right 1, shift data right 1 into c 11111000 c_ne_z so xor crc with $8C 01111100 0 00000011 1 test crc bit 0 into z, shift crc right 1, shift data right 1 into c 11110000 c_ne_z so xor crc with $8C 01111000 0 00000001 1 test crc bit 0 into z, shift crc right 1, shift data right 1 into c 11110100 c_ne_z so xor crc with $8C 01111010 0 00000000 1 test crc bit 0 into z, shift crc right 1, shift data right 1 into c 11110110 c_ne_z so xor crc with $8C 01111011 0 00000000 0 test crc bit 0 into z, shift crc right 1, shift data right 1 into c, c_eq_z 2nd byte $78 crc z data c 01111011 01111000 starting values 00111101 1 00111100 0 test crc bit 0 into z, shift crc right 1, shift data right 1 into c 10110001 c_ne_z so xor crc with $8C 01011000 1 00011110 0 test crc bit 0 into z, shift crc right 1, shift data right 1 into c 11010100 c_ne_z so xor crc with $8C 01101010 0 00001111 0 test crc bit 0 into z, shift crc right 1, shift data right 1 into c, c_eq_z 00110101 0 00000111 1 test crc bit 0 into z, shift crc right 1, shift data right 1 into c 10111001 c_ne_z so xor crc with $8C 01011100 1 00000011 1 test crc bit 0 into z, shift crc right 1, shift data right 1 into c, c_eq_z 00101110 0 00000001 1 test crc bit 0 into z, shift crc right 1, shift data right 1 into c 10100010 c_ne_z so xor crc with $8C 01010001 0 00000000 1 test crc bit 0 into z, shift crc right 1, shift data right 1 into c 11011101 c_ne_z so xor crc with $8C 01101110 1 00000000 0 test crc bit 0 into z, shift crc right 1, shift data right 1 into c 11100010 c_ne_z so xor crc with $8C }}