Searching \ for '16cxx CRC-16 example source code' in subject line. ()
Make payments with PayPal - it's fast, free and secure! Help us get a faster server
FAQ page: techref.massmind.org/techref/method/errors.htm?key=crc
Search entire site for: '16cxx CRC-16 example source code'.

Truncated match.
PICList Thread
'16cxx CRC-16 example source code'
1998\02\12@115031 by Farmer, Rick - Flash Comm

flavicon
face
The following is an example program that creates a string and appends an ANSI standard CRC-16 to it. This will work on any PIC16cXX processor. I have ported it to the 12c5xx, but it is messy because of the limited jump space in the 'c5x architecture. Feel free to use/modify this as you wish. The code was adapted from a C routine I found on the net a while back. This code has been tested and decoded by a PC that the PIC sent data to.

Follow up to: spam_OUTrfarmerTakeThisOuTspammindspring.com


TITLE   "CRC-16 source code"
               LIST    P=16C72
               INCLUDE "P16C72.INC"    ;Microchip Reg Definitions

               __CONFIG  _LP_OSC&_WDT_ON&_PWRTE_ON&_CP_OFF&_BODEN_OFF
;               low freq xtal, dog on, 72ms pwr up, read mem ok, brown out off
;               Author  Rick Farmer

;*************************************************************************
;               Variable Declarations.



WSAVE   equ     20h     ;place for ISR to save W reg
STATSAV equ     21h     ;place for ISR to save STATUS reg
FSRSAV  equ     22h     ;place for ISR to save FSR reg
PCLSAV  equ     23h     ;place to save PCLATH
TXLENG  equ     24h     ;xmit packet length in bytes
OLDTXLN equ     25h     ;original string length going into CRC
CRCPTR  equ     26h     ;CRC table pointer
CRCMSB  equ     27h     ;CRC16 high byte
CRCLSB  equ     28h     ;CRC16 low byte
FLAGS   equ     29h     ;place to store single bit control flags

PG2     equ     00h     ;CRC table destination is 256-512  (2nd half)

PKTOFF  equ     60h     ;60h-7Fh (32D bytes) reserved for packet string

;*************************************************************************
;               Constant Declarations.


;*************************************************************************

       ORG     0000h           ;first instruction location
       GOTO    START           ;program starting point
       ORG     0004h           ;interrupt vector

;*************************************************************************
;ISR            This ISR is currently blank.

ISR     movwf   WSAVE           ;save W reg in WSAV
       swapf   STATUS,W        ;status to W reversed
       bcf     STATUS,RP0      ;switch back to page 0
       movwf   STATSAV         ;status to STATSAV reversed
       movf    FSR,W           ;get FSR
       movwf   FSRSAV          ;save it

       bcf     INTCON,GIE      ;do your thing here

ISRDONE movf    FSRSAV,W        ;get old FSR
       movwf   FSR             ;retore it
       swapf   STATSAV,W       ;STATSAV to W in order
       movwf   STATUS          ;W to STATUS in order
       swapf   WSAVE,F         ;WSAV to W reversed
       swapf   WSAVE,W         ;restore W's order
       retfie                  ;done


;*************************************************************************
;IOINIT         This routine initializs all the port pins.

IOINIT  movlw   07h             ;all table jumps go to 700-800h
       movwf   PCLATH          ;bottom of page 1 (2K)

                               ;setup uC as needed here

       return                  ;done

;*************************************************************************
;PACKET         This routine assembles a test packet for CRCSTRG to chew on.

PACKET  movlw   PKTOFF          ;load packet start address
       movwf   FSR             ;init pointer

       movlw   'H'             ;ASCII char
       movwf   INDF            ;load string
       incf    FSR,F           ;inc ptr

       movlw   'e'             ;ASCII char
       movwf   INDF            ;load string
       incf    FSR,F           ;inc ptr

       movlw   'l'             ;ASCII char
       movwf   INDF            ;load string
       incf    FSR,F           ;inc ptr

       movlw   'l'             ;ASCII char
       movwf   INDF            ;load string
       incf    FSR,F           ;inc ptr

       movlw   'o'             ;ASCII char
       movwf   INDF            ;load string
       incf    FSR,F           ;inc ptr

       movlw   PKTOFF          ;load packet start address
       subwf   FSR,W           ;subtract from pointer for length
       movwf   TXLENG          ;save packet length

       movlw   PKTOFF          ;load packet start address for CRC-16
       movwf   FSR             ;init pointer

       return                  ;done

;*************************************************************************
;MAIN           This boiler plate assembles a string and CRC-16's it.

START   call    IOINIT          ;setup I/O ports, ADC, timers, and interrupts

MAIN    clrwdt                  ;kick the dog
       call    PACKET          ;assemble test packet
       call    CRCSTRG         ;CRC-16 the packet
       goto    MAIN            ;do it all over again

;********************************************************************
;CRCSTRG        This routine will CRC16 a string of length TXLENG
;               starting at FSR and append the CRC16 to it MSB first.

CRCSTRG movf    PCLATH,W        ;get current table jump destination
       movwf   PCLSAV          ;save it
       movf    TXLENG,W        ;get string length
       movwf   OLDTXLN         ;save string length
       clrf    CRCMSB          ;clear high byte of CRC
       clrf    CRCLSB          ;clear low byte of CRC

CALCCRC movf    INDF,W          ;get next STRG byte
       xorwf   CRCLSB,W        ;XOR with LSB of CRC word
       movwf   CRCPTR          ;store table index

       bcf     FLAGS,PG2       ;clear the bit for jump to page 2
       bsf     STATUS,C        ;set carry in for LSB of 16bit TBL val
       rlf     CRCPTR,F        ;convert word table to byte index
       btfsc   STATUS,C        ;is jump to page 2 of 2 in table?
        bsf    FLAGS,PG2       ;yes, save info for next jump

       call    CRCTBL          ;retrieve value at C:CRCPTR
       xorwf   CRCMSB,W        ;W = TBLLSB XOR CRCMSB
       movwf   CRCLSB          ;save new CRCLSB

       bcf     CRCPTR,0        ;clear low bit of index for MSB
       bcf     STATUS,C        ;force page 1 of 2
       btfsc   FLAGS,PG2       ;should we jump to page 2?
        bsf    STATUS,C        ;yes, jump to page 2

       call    CRCTBL          ;retrieve value at C:CRCPTR
       movwf   CRCMSB          ;new CRCMSB = MSB of TABLE

       incf    FSR,F           ;point to next byte in string
       decfsz  TXLENG,F        ;at end of string?
        goto   CALCCRC         ;no

       movf    CRCLSB,W        ;yes, get LSB into W
       movwf   INDF            ;add to string
       incf    FSR,F           ;point to next byte
       movf    CRCMSB,W        ;get MSB into W
       movwf   INDF            ;add to string

       incf    OLDTXLN,W       ;get old string length + 1 into W
       movwf   TXLENG          ;save it
       incf    TXLENG,F        ;TXLENG now includes the CRC word
       movf    PCLSAV,W        ;get old PC jump dest
       movwf   PCLATH          ;restore high byte of PC for jumps
       return                  ;done

;********************************************************************
;CRCTBL         This routine returns the byte at org+STATUS(C):CRCPTR.

CRCTBL  movlw   05h             ;load memory org offset
       btfsc   STATUS,C        ;CRC pointer >FFh?
        addlw  01h             ;yes
       movwf   PCLATH          ;store high byte of PC for jump
       movf    CRCPTR,W        ;get low byte of pointer
       movwf   PCL             ;long jump into table

;********************************************************************
;               This is the 512 byte lookup table for CRCTBL.

       org     0500h           ;0500-06FF used for table

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

;*************************************************************************
;ASCII          This routine turns a 0-F value in W to an ascii char in W

       org     0700h           ;all table jumps on this page

ASCII   andlw   0Fh             ;strip off high nibble
       addwf   PCL,F           ;jump into table
       retlw   30h             ;0
       retlw   31h             ;1
       retlw   32h             ;2
       retlw   33h             ;3
       retlw   34h             ;4
       retlw   35h             ;5
       retlw   36h             ;6
       retlw   37h             ;7
       retlw   38h             ;8
       retlw   39h             ;9
       retlw   41h             ;A
       retlw   42h             ;B
       retlw   43h             ;C
       retlw   44h             ;D
       retlw   45h             ;E
       retlw   46h             ;F

       END                     ;compiler finish

;*************************************************************************

Rick Farmer             | 300 A1 North Drive    
Electrical Engineer   | Melbourne, Fl. 32934
Flash Comm            | 407-752-3013

1998\02\12@160236 by PIC Stuff

flavicon
picon face
>
>  The following is an example program that creates a string and appends =
> an ANSI standard CRC-16 to it. This will work on any PIC16cXX processor. =
> I have ported it to the 12c5xx, but it is messy because of the limited =
> jump space in the 'c5x architecture. Feel free to use/modify this as you =
> wish. The code was adapted from a C routine I found on the net a while =
> back. This code has been tested and decoded by a PC that the PIC sent =
> data to.
> =20
> Follow up to: .....rfarmerKILLspamspam@spam@mindspring.com
>
[several hundred lines of code snipped]

Here is a slightly smaller version:

;
;
;    Calculate CRC-16.
;
;
;
; In:   W - Byte to add to CRC
;       CRC_High,CRC_Low - Previous CRC (set to 0 on startup)
; Act:  Update
; Out:  CRC_High,CRC_Low - Updated CRC value
; Regs: tmp, Counter

CalcCRC         movwf   tmp
               movlw   8
               movwf   Counter

CRC_Loop        movf    CRC_Low,w
               xorwf   tmp,w
               clrc
               rrf     CRC_High
               rrf     CRC_Low
               andlw   1
               jz      CRC_Skip

               movlw   0xa0
               xorwf   CRC_High
               movlw   0x01
               xorwf   CRC_Low

CRC_Skip        rrf     tmp
               loop    Counter,CRC_Loop
               return

This may or may not generate the same CRC (it's the same algorithm as
used in zoo and arc and many other old archives).  By changing the
two hex values that are XORed, you can change this code to
calculate any CRC-16.  I've also got one that interleaves the CRC
calculations with the serial receive, so it takes zero time to execute.
This code runs on 12 and 14 bit PICs with minimal changes.

Frank

More... (looser matching)
- Last day of these posts
- In 1998 , 1999 only
- Today
- New search...