A discussion group for the PICMicro microcontroller. Also called the Microchip PIC, this list is dedicated to the use and abuse of this fine, simple, microcontroller. Close to topic posts are welcome, ie. general electronics.
|
Hello.....
I´m trying to communicate my PIC 16F873 to a motor speed
variator that use the RS485 interface and a MODBUS protocol. This protocol generate a CRC
cyclic redundancy check to detect errors. This CRC value is two bytes of 8 bits, CRChigh
and CRC low. To generate this two bytes, the routine use all bytes that that are included
in the message. The two bytes CRC then are included in the frame message that form the
MODBUS protocol.
Now, I have to make the CRC routine. I have seen the
application note 730 (CRC generatig and checking), where use two implementations. I want
to know if this application note generate the CRC that I need for the MODBUS protocol,
because I have seen some difference.
The Modbus use this procedure:
1. Load a 16 bit CRC register with FFFF hex
2. Exclusive OR the first byte ( 8 bit )of the message
with the low order byte of the 16 bit register CRC, putting the result in the
CRC register
3. Shift the CRC register one bit to the right (toward
the LSB), zero-filling the MSB. Extract and examine the LSB.
4. If LSB was 0 : repeat step 3 ( another
shift)
If LSB was 1 : Exclusive OR
the CRC register with the polynomial value A001hex (1010 0000 0000 0001
)
5. Repeat steps 3 and 4 until 8 shifts have been
performed. When this is done , a complete data byte will have been
processed.
6. Repeat steps 2 through 5 for the next byte of the
message. Continue doing this until all bytes have been processed.
7. The final content of the CRC register is the CRC
value.
8. When the CRC is placed into the message , its upper
byte and lower bytes must be swapped
Anybody know something about that ? Or have a routine that can help me ?
If someone have used this protocol with PIC, please tell me if it has worked
well.
Thanks for your help......
Marcelo
--- Outgoing mail is certified Virus Free. Checked by AVG anti-virus system (http://www.grisoft.com). Version: 6.0.572 / Virus Database: 362 - Release Date: 27/01/04 |
|
|
|
I have used the following for several years on a
variety of Modbus systems. It works fine on 20mhz xtal for 9600. Bear in mind
going any faster might need table lookups and not calcs. Modbus use the TTY version
of CRC checking.
Initialise with this before use
movlw 0xFF
movwf CRC_Low movwf CRC_High add to the checksum with this
movfp ModbusBuffer1,WREG call CallAddCRC16M obviously the results in CRC_High and
CRC_Low that is calculated on the fly as it comes in is then compared with the last
two bytes.
;-------------------------------------------------------------------------------------------------
; ****************************** CRC16 routine ****************************************** ;------------------------------------------------------------------------------------------------- ;--CLASS REGISTERS----------------------------------------------------------- ;Temp1 ;CRC_High ;CRC_Low ;---------------------------------------------------------------------------- CallAddCRC16M xorwf CRC_High,f
movlw 8 movwf Temp1 CRC_Loop
bcf ALUSTA,C
rrcf CRC_Low,f rrcf CRC_High,f btfss ALUSTA,C goto NoXOring movlw B'10100000' xorwf CRC_Low,f movlw B'0000001' xorwf CRC_High,f NoXOring decfsz Temp1,F goto CRC_Loop return
|