Reply by hubbardd_2000 March 27, 20072007-03-27
Hi Guys,  this message is too late now , but you may want to consider the
Microchip PIC24F series for your next design.   It has the CRC calculator
built in hardware.   The PIC24F series will save you cycles and code.  
You can find it in Section 19.0 ( page 181) of PIC24FJ128GA006 data sheet 
This is a 64pin device with 128Kbytes flash.  They also have a 28 pin
version w/ 8K ram and 64Kbytes flash sampling in 4-6 weeks with the CRC.  
Good luck. 
Don 

Here is the link to the datasheet on the web.  
http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1335&dDocName=en024813
>janka vietzen <janvi@t-online.de> wrote: > >> Arlet wrote: >> many thanx, i am going to test your code. >> >> here is my first try with atMega > >[snip] > >> Assume txbuf contains the 6 byte modbus rtu message: 1,3,0,0,0,2 >> the crc should be 0xc40b (what I can see in a old trace record) >> but my code calculates 0x98e8 for crc result. Any bugs obvious? > >You seem to have mixed up the algorithm from the previous post. Have >another look at the algorithm. > >You are shifting the CRC in the wrong direction (it should be shifted >right, not left) and your inner loop structure is wrong: it is supposed >to exclusive-OR the polynomial into the result when shifting out a one >bit for each of eight bit shift operations. You have it doing eight left >shifts then doing a single eor based on the result of the last shift. > >There may be more errors but I didn't look closely at the rest of it. > >-- >David Empson >dempson@actrix.gen.nz >
Reply by David Empson February 3, 20072007-02-03
janka vietzen <janvi@t-online.de> wrote:

> Arlet wrote: > many thanx, i am going to test your code. > > here is my first try with atMega
[snip]
> Assume txbuf contains the 6 byte modbus rtu message: 1,3,0,0,0,2 > the crc should be 0xc40b (what I can see in a old trace record) > but my code calculates 0x98e8 for crc result. Any bugs obvious?
You seem to have mixed up the algorithm from the previous post. Have another look at the algorithm. You are shifting the CRC in the wrong direction (it should be shifted right, not left) and your inner loop structure is wrong: it is supposed to exclusive-OR the polynomial into the result when shifting out a one bit for each of eight bit shift operations. You have it doing eight left shifts then doing a single eor based on the result of the last shift. There may be more errors but I didn't look closely at the rest of it. -- David Empson dempson@actrix.gen.nz
Reply by Alexander Baranov February 2, 20072007-02-02
"David Kelly" <n4hhe@Yahoo.com> wrote in message 
news:12s74p1c5ea08fd@corp.supernews.com...
> janka vietzen wrote: >> for the moment I struggle with the modbus protocol checksum what seems to >> use a quite odd 16 bit CRC polynom 0xA001. I have no idea if my ATmega >> assembly code works correct becouse its responsible for both directions >> generation and test same time and for the moment I do not have further >> modbus certificated devices. >> >> Is there any CRC calculator known what allows to comapare reference >> values? > > A year or so ago I used a Windows Modbus application downloadable from > England as a reference for verifying correct Modbus operation with my > AVR-gcc based product. The Modbus app I am thinking of would work for free > for 5 or 10 minutes each time it was launched. Otherwise $60 or so. > Couldn't write anything like it for only $60, money well spent. > > You need something for your Modbus design to talk to, else you don't know > that it works. >
This one worked with Siemens power meter: int crc16_siemens9200(unsigned char *ptr, int count) { unsigned int crc; char i; crc = 0xffff; while (--count >= 0) { crc = crc ^ (unsigned int) *ptr++; i = 8; do { if (crc & 0x0001) crc = (crc >> 1) ^ 0xA001; else crc = (crc >> 1); } while(--i); } return (crc); } Alex.
Reply by David Kelly February 2, 20072007-02-02
janka vietzen wrote:
> for the moment I struggle with the modbus protocol checksum what seems to > use a quite odd 16 bit CRC polynom 0xA001. I have no idea if my ATmega > assembly code works correct becouse its responsible for both directions > generation and test same time and for the moment I do not have further > modbus certificated devices. > > Is there any CRC calculator known what allows to comapare reference values?
A year or so ago I used a Windows Modbus application downloadable from England as a reference for verifying correct Modbus operation with my AVR-gcc based product. The Modbus app I am thinking of would work for free for 5 or 10 minutes each time it was launched. Otherwise $60 or so. Couldn't write anything like it for only $60, money well spent. You need something for your Modbus design to talk to, else you don't know that it works.
Reply by janka vietzen February 2, 20072007-02-02
Arlet wrote:
many thanx, i am going to test your code. 

here is my first try with atMega

;** R0  tempory  use
;** R16 counts Bits of a Byte
;** R17 counts Bytes of txbuf
;** R18:R19 contains polynom
;** R20:R21 CRC data 
;** R30:R31 Z Register points to txbuf

crcgen: ldi r17,low(txend-txbuf+1)      ;r16 rxbuf length
        ldi zl,low(txbuf)       ;       Z points to txbuf start
        ldi zh,high(txbuf)
        ldi     r18,0x01
        ldi r19,0xa0            ;r18:r19 = CRC Polynom = 0xa001
        ldi r20,0xff
        ldi r21,0xff            ;r20:r21 is CRC register 1)
        ld r0,z+                ;get first Byte from txbuf

bytlop: eor r20,r0              ;exor crc lowbyte with next data byte
        ldi r16,8+1             ;count 8 bits per byte
bitlop: dec r16                 ;one bit has been processed
        breq nbyte              ;-> byte is complete
        lsl     r20             ;shift 16 bit CRC Register 
        rol     r21                                     
        brcc bitlop             ;-> shift continius if C=0 
        eor r20,r18             ;if Carry = 1 
        eor r21,r19             ;exor with 16 bit Polynom 
        rjmp bitlop             ;repeat for all 8 bits

nbyte:  ld r0,z+                ;fetch next byte from rxbuf
        dec r17                 ;one byte has been processed
        brne bytlop             ;-> until all Bytes processed
        ret                     ;CRC should be in R20:R21 now


Assume txbuf contains the 6 byte modbus rtu message: 1,3,0,0,0,2
the crc should be 0xc40b (what I can see in a old trace record)
but my code calculates 0x98e8 for crc result. Any bugs obvious?

Reply by Arlet February 2, 20072007-02-02
On Feb 1, 9:06 pm, janka vietzen <j...@t-online.de> wrote:
> for the moment I struggle with the modbus protocol checksum what seems to > use a quite odd 16 bit CRC polynom 0xA001. I have no idea if my ATmega > assembly code works correct becouse its responsible for both directions > generation and test same time and for the moment I do not have further > modbus certificated devices. > > Is there any CRC calculator known what allows to comapare reference values?
Here's my modbus CRC code for AVR. It calculates CRC over data in 'rx_buf' with length in r24. The result has first CRC byte in r25, second CRC byte in r24 crc_update: ldi r31, hi8(rx_buf)// ldi r30, lo8(rx_buf)// ldi r26, 0xff // crc_high ldi r27, 0xff // crc_low ldi r18, 0xa0 // xor_high ldi r19, 0x01 // xor_low crc_byte: ld r20, Z+ // get next data byte eor r27, r20 // crc ^= data ldi r20, 8 // 8 bits crc_bit: lsr r26 // ror r27 // brcc crc_no_xor // eor r26, r18 // crc ^= 0xa001 eor r27, r19 // crc_no_xor: dec r20 // brne crc_bit // dec r24 // brne crc_byte // movw r24, r26 // r25:r24 = CRC16 A table based solution will be faster, but this worked fine for me, and I didn't have room for a table.
Reply by John Devereux February 1, 20072007-02-01
Jonathan Kirwan <jkirwan@easystreet.com> writes:

> On Thu, 01 Feb 2007 21:06:53 +0100, janka vietzen <janvi@t-online.de> > wrote: > >>for the moment I struggle with the modbus protocol checksum what seems to >>use a quite odd 16 bit CRC polynom 0xA001. I have no idea if my ATmega >>assembly code works correct becouse its responsible for both directions >>generation and test same time and for the moment I do not have further >>modbus certificated devices. >> >>Is there any CRC calculator known what allows to comapare reference values? > > Isn't there sample code for calculating modbus CRCs included in the > documentation on modbus? I seem to recall seeing it near the end of > one particular manual.
I'm sure I saw that too. (checks...) Yes, it's in the "Modbus over serial line specification and implementation guide V1.0". I downloaded it from the modbus web site. -- John Devereux
Reply by FreeRTOS.org February 1, 20072007-02-01
"Jonathan Kirwan" <jkirwan@easystreet.com> wrote in message 
news:5mi4s25krt4qes5j25j5mr2k06sih0utqc@4ax.com...
> On Thu, 01 Feb 2007 21:06:53 +0100, janka vietzen <janvi@t-online.de> > wrote: > >>for the moment I struggle with the modbus protocol checksum what seems to >>use a quite odd 16 bit CRC polynom 0xA001. I have no idea if my ATmega >>assembly code works correct becouse its responsible for both directions >>generation and test same time and for the moment I do not have further >>modbus certificated devices. >> >>Is there any CRC calculator known what allows to comapare reference >>values? > > Isn't there sample code for calculating modbus CRCs included in the > documentation on modbus? I seem to recall seeing it near the end of > one particular manual. > > Jon
It is probably 10 years since I used Modbus, and hopefully the manuals have been updated, but I recall the code sample in my Modicon manual being incorrect :-( I still have some hair left though. Regards, Richard. + http://www.FreeRTOS.org + http://www.SafeRTOS.com for Cortex-M3, ARM7, ARM9, HCS12, H8S, MSP430 Microblaze, Coldfire, AVR, x86, 8051, PIC24 & dsPIC .... and soon AVR32
Reply by Tauno Voipio February 1, 20072007-02-01
janka vietzen wrote:
>>Isn't there sample code for calculating modbus CRCs included in the > > > I dont have many modbus manuals but there are 2 diffrent code samples for > crc written in C. One uses 2 bested byte - bit loops and the other uses 255 > byte lookup tables for low and highbyte each. Unfortunately I dont tried > any Compilers for Atmels ATmega128 (probably there is a gcc available) and > even the cpu family is new for me why i decided to start with assembler
There is GCC available for AVRs (including your chip). I suppose that you mean the binary Modbus encoding, also called Modbus/RTU. (There's a hexadecimal encoding resembling Intel's hex object code, but it does not use CRC at all, but a straight checksum). The Modbus CRC is the old IBM's CRC-16, used e.g. in the early disks and in the Bisync data communication protocol. For eight-bit processors, the simplest way of calculating the CRC is the use of two 256 (not 255) byte tables, if you do not want to do it bit-by-bit. The table-driven method calculates the CRC for each incoming byte, not each bit separately. -- Tauno Voipio tauno voipio (at) iki fi
Reply by janka vietzen February 1, 20072007-02-01
> Isn't there sample code for calculating modbus CRCs included in the
I dont have many modbus manuals but there are 2 diffrent code samples for crc written in C. One uses 2 bested byte - bit loops and the other uses 255 byte lookup tables for low and highbyte each. Unfortunately I dont tried any Compilers for Atmels ATmega128 (probably there is a gcc available) and even the cpu family is new for me why i decided to start with assembler