Crc assembly language procedure table 1, Crc generation – Rainbow Electronics DS1990A User Manual
Page 8
DS1990A
8 of 10
CRC ASSEMBLY LANGUAGE PROCEDURE Table 1
DO_CRC:
CRC_LOOP:
ZERO:
PUSH ACC
PUSH B
PUSH ACC
MOV
B,#8
XRL
A,CRC
RRC
A
MOV
A,CRC
JNC
ZERO
XRL
A,#18H
RRC
A
MOV
CRC,A
POP
ACC
RR
A
PUSH
ACC
DJNZ
B,CRC_LOOP
POP
ACC
POP
B
POP
ACC
RET
; save the accumulator
; save the B register
; save bits to be shifted
set shift=8bits
;
; calculate CRC
; move it to the carry
; get the last CRC value
; skip if data=0
; update the CRC value
;
; position the new CRC
; store the new CRC
; get the remaining bits
; position the next bit
; save the remaining bits
; repeat for eight bits
; clean up the stack
; restore the B register
; restore the accumulator
CRC GENERATION
To validate the data transmitted from the DS1990A, the bus master may generate a CRC value from the
data as it is received. This generated value is compared to the value stored in the last eight bits of the
DS1990A. The bus master computes the CRC over the 8-bit family code and all 48 ID number data bits,
but not over the stored CRC value itself. If the two CRC values match, the transmission is error-free.
An example of how to generate the CRC using assembly language software is shown in Table 1. This
assembly language code is written for the DS5000 Soft microcontroller which is compatible with the
8031/51 Microcontroller family. The procedure DO_CRC calculates the cumulative CRC of all the bytes
passed to it in the accumulator. It should be noted that the variable CRC needs to be initialized to 0 before
the procedure is executed. Each byte of the data is then placed in the accumulator and DO-CRC is called
to update the CRC variable. After all the data has been passed to DO_CRC, the variable CRC will contain
the result. The equivalent polynomial function of this software routine is:
CRC = x
8
+ x
5
+ x
4
+ 1
For more details, see the Book of DS19xx iButton Standards.