Um, look maybe we need an FAQ entry on this but.... WE ALWAYS WANT THE CODE. Sorry to shout but asking the PICListers if they want to see code is like asking an addict if he wants to shoot up. ; What you need is to define the polynomial. E. g. for the CCITT one: poly0 equ 0x21 poly1 equ 0x10 ; Do not forget to initialize = before the 1st call ; e. g. with 0xFF or with zeroes, as the particular CRC algorithm ; requires. ;This subroutine calculates a 16-bit CRC ;-------- ; CrcUpd: update using ; ; CBLOCK crcblk crch crcl saved oldcch i ENDC CrcUpd movwf saved ; j = W movlw d'8' ; W = 8 movwf i ; i = W _loop movfw crch movwf oldcch ; temporary save clrc ; clear carry for rlf rlf crcl ; crc << 1 rlf crch movfw saved ; the char read xorwf oldcch,F ; test with old high btfss oldcch,7 ; if bit set, apply mask b _notset ; otherwise skip movlw poly0 xorwf crcl,F movlw poly1 xorwf crch,F _notset clrc ; for rlf rlf saved,F ; next bit of saved decfsz i,F b _loop return ; ; End CrcUpd More at: http://www.piclist.com/faq James Newton mailto:jamesnewton@geocities.com 1-619-652-0593 phone http://www.piclist.com ----- Original Message ----- From: Charles Ader To: Sent: Thursday, February 10, 2000 21:03 Subject: CRC-16 for the PIC16C5X > I was searching through the PICLIST archive for a CRC-16 > routine for a project but found nothing useful. The only > thing I found was a Dallas app note (#27) that uses a > linear method, no table lookup and no loops. > > This translated well to PIC code. If there is still > an interest I'll post it to the list. > > Here is a summary: > > ; CRC-16 (x^16+x^15+x^2+x^0) > ; No tables, No loops, No temporary registers used. > ; > ; Input: W = Data byte for CRC calculation > ; crc_hi:crc_lo 16 bit CRC register > ; > ; Output: crc_hi:crc_lo updated. > ; > ; 30 instructions, 31 machine cycles per byte. > > Charles. >