Hi I've looked through the threads on this subject but all the code i've found and tried don't seem to giv me the correct CRC calculation.
here's what i've tried, all using either polynomial's $A001, $8005, $1021 and clearing the CRC to $0000 and $FFFF but they don't give me the correct calc's any help here would be much appreciated.
trial 1:
SYMBOL crc = w0
SYMBOL k = w1
SYMBOL bite = b4
SYMBOL i = b5
crc = $ffff
bite = $16:GOSUB CrcAdd
bite = $06:GOSUB CrcAdd
bite = $63:GOSUB CrcAdd
bite = $0a:GOSUB CrcAdd
bite = $1d:GOSUB CrcAdd
bite = $61:GOSUB CrcAdd
;bite = $00:GOSUB CrcAdd
' ** CRC-16 is $7B80 **
DEBUG crc
END
CrcAdd:
FOR i = 0 TO 7
k = bite ^ crc & $01 ' original code was "k = bite ^ crc & 1" which didn't compile???
IF k = 0 THEN CrcAdd1
k = $a001
CrcAdd1:
crc = crc / 2 ^ k
bite = bite / 2
NEXT
RETURN
trial 2:
SYMBOL DataFlags = b0
SYMBOL data_bit = bit0
SYMBOL SR_lsb = bit1
SYMBOL FB_bit = bit2
SYMBOL line = b16
SYMBOL bbyte = b17
SYMBOL data_back = b18
SYMBOL check = b19
SYMBOL EEdata = b20
SYMBOL Checkbyte = b3
SYMBOL CRC16 = w11
SYMBOL CRC16Check = w12
SYMBOL Poly16Mask = $8005 ;1021 ;A001
;
; ---------------------------------------------------------------------------
Try_again:
pause 1000
GOSUB CRC_Check
end
; ---------------------------------------------------------------------------
;
CRC_Check:
CRC16Check = $ffff
CheckByte = $16 : GOSUB CRC_Calc
CheckByte = $06 : GOSUB CRC_Calc
CheckByte = $63 : GOSUB CRC_Calc
CheckByte = $0A : GOSUB CRC_Calc
CheckByte = $1D : GOSUB CRC_Calc
CheckByte = $61 : GOSUB CRC_Calc
;CRC16Check = 65535 - CRC16Check
RETURN
;
;
CRC_Calc:
FOR line = 0 to 7
data_bit = CheckByte AND $01
SR_lsb = CRC16Check AND $01
FB_bit = data_bit XOR SR_lsb AND $01
CRC16Check = CRC16Check / 2
IF FB_bit = 1 THEN
CRC16Check = CRC16Check XOR Poly16Mask
ENDIF
CheckByte = CheckByte / 2
NEXT Line
RETURN
Thanks Robert
here's what i've tried, all using either polynomial's $A001, $8005, $1021 and clearing the CRC to $0000 and $FFFF but they don't give me the correct calc's any help here would be much appreciated.
trial 1:
SYMBOL crc = w0
SYMBOL k = w1
SYMBOL bite = b4
SYMBOL i = b5
crc = $ffff
bite = $16:GOSUB CrcAdd
bite = $06:GOSUB CrcAdd
bite = $63:GOSUB CrcAdd
bite = $0a:GOSUB CrcAdd
bite = $1d:GOSUB CrcAdd
bite = $61:GOSUB CrcAdd
;bite = $00:GOSUB CrcAdd
' ** CRC-16 is $7B80 **
DEBUG crc
END
CrcAdd:
FOR i = 0 TO 7
k = bite ^ crc & $01 ' original code was "k = bite ^ crc & 1" which didn't compile???
IF k = 0 THEN CrcAdd1
k = $a001
CrcAdd1:
crc = crc / 2 ^ k
bite = bite / 2
NEXT
RETURN
trial 2:
SYMBOL DataFlags = b0
SYMBOL data_bit = bit0
SYMBOL SR_lsb = bit1
SYMBOL FB_bit = bit2
SYMBOL line = b16
SYMBOL bbyte = b17
SYMBOL data_back = b18
SYMBOL check = b19
SYMBOL EEdata = b20
SYMBOL Checkbyte = b3
SYMBOL CRC16 = w11
SYMBOL CRC16Check = w12
SYMBOL Poly16Mask = $8005 ;1021 ;A001
;
; ---------------------------------------------------------------------------
Try_again:
pause 1000
GOSUB CRC_Check
end
; ---------------------------------------------------------------------------
;
CRC_Check:
CRC16Check = $ffff
CheckByte = $16 : GOSUB CRC_Calc
CheckByte = $06 : GOSUB CRC_Calc
CheckByte = $63 : GOSUB CRC_Calc
CheckByte = $0A : GOSUB CRC_Calc
CheckByte = $1D : GOSUB CRC_Calc
CheckByte = $61 : GOSUB CRC_Calc
;CRC16Check = 65535 - CRC16Check
RETURN
;
;
CRC_Calc:
FOR line = 0 to 7
data_bit = CheckByte AND $01
SR_lsb = CRC16Check AND $01
FB_bit = data_bit XOR SR_lsb AND $01
CRC16Check = CRC16Check / 2
IF FB_bit = 1 THEN
CRC16Check = CRC16Check XOR Poly16Mask
ENDIF
CheckByte = CheckByte / 2
NEXT Line
RETURN
Thanks Robert