CCS C Software and Maintenance Offers
FAQFAQ   FAQForum Help   FAQOfficial CCS Support   SearchSearch  RegisterRegister 

ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

CCS does not monitor this forum on a regular basis.

Please do not post bug reports on this forum. Send them to CCS Technical Support

I need CRC16-CCITT(KERMIT) not CRC16-CCITT(XMODEM)

 
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion
View previous topic :: View next topic  
Author Message
Josep Robert



Joined: 27 Mar 2018
Posts: 25

View user's profile Send private message

I need CRC16-CCITT(KERMIT) not CRC16-CCITT(XMODEM)
PostPosted: Wed Mar 04, 2020 3:23 am     Reply with quote

Hello.

I need to calculate the CRC16-CCITT(Kermit) but this routine gives me the CRC16-CCITT(XMODEM).

I don't know what to change to obtain the CRC16-CCITT(KERMIT).

I don't know to implement the following definitions:

CRC-16/XMODEM
width=16 poly=0x1021 init=0x0000 refin=false refout=false xorout=0x0000 check=0x31c3 residue=0x0000 name="CRC-16/XMODEM"

CRC-16/KERMIT
width=16 poly=0x1021 init=0x0000 refin=true refout=true xorout=0x0000 check=0x2189 residue=0x0000 name="CRC-16/KERMIT"

Could you help me?

thanks in advance.

Code:

#include <18LF47K40.h>
#use delay(clock = 16MHZ, internal)

#FUSES WDT_SW
#FUSES WDT65536

#case

void main(void)
{
   unsigned int8 data[6] = {0x05 , 0x01 , 0x00 , 0x04 , 0xFC , 0xFF};   // XMODEM=7DCC. (KERMIT = 72A6)
   
   unsigned int16 crc;
   
   setup_crc(16, 12, 5, 0);                    // Setup the CRC polynomial x^16 + x^12 + X^5 + X^0
   
   crc_init(0x0000);                           // Starts the CRC accumulator out at 0

   crc = crc_calc16(data, sizeof(data), 8);    // Returns the calculated CRC value
 
   delay_cycles(1);                            // Breakpoint
}
Ttelmah



Joined: 11 Mar 2010
Posts: 19538

View user's profile Send private message

PostPosted: Wed Mar 04, 2020 3:39 am     Reply with quote

Kermit, has the bit order in the bytes reversed before processing (and
afterwards). Also the byte order is swapped in the final result.
It's otherwise the same as XMODEM. Same seed, and same polynomial.

Bit reversal can be done efficiently with:

<https://www.ccsinfo.com/forum/viewtopic.php?t=23364>

So apply this to your data, feed this through the XMODEM calculator,
then apply this again to the result. Finally swap the pair of bytes for
the result.
Josep Robert



Joined: 27 Mar 2018
Posts: 25

View user's profile Send private message

PostPosted: Wed Mar 04, 2020 3:55 am     Reply with quote

Thank you very much for your immediate help. Regards.
Josep Robert



Joined: 27 Mar 2018
Posts: 25

View user's profile Send private message

PostPosted: Wed Mar 04, 2020 4:41 am     Reply with quote

With this code I get the CRC-16 / KERMIT. It works fine. Thanks again Ttelmah for your help.
Code:

#include <18LF47K40.h>
#use delay(clock = 16MHZ, internal)

#FUSES WDT_SW
#FUSES WDT65536

#case

int8 swap_bits(int8 data);
 
void main(void)
{
   unsigned int8 i, crcH, crcL;
   unsigned int16 crc;

   // unsigned int8 dataA[1] = {0x00};                                                                  // CRC-16/KERMIT = 0000   ok
   // unsigned int8 dataA[4] = {0x03 , 0x01 , 0x00 , 0x05};                                             // CRC-16/KERMIT = BC28   ok
      unsigned int8 dataA[6] = {0x05 , 0x01 , 0x00 , 0x04 , 0xFC , 0xFF};                               // CRC-16/KERMIT = 72A6   ok
   // unsigned int8 dataA[10] = {0x09, 0xFF , 0x00 , 0x00 , 0x07 , 0x01 , 0x7F , 0x00 , 0xFF , 0xFF};   // CRC-16/KERMIT = AEF6   ok
     
   unsigned int8 dataAreversed[10];

   for (i = 0; i < sizeof(dataA); i++)
   {
      dataAreversed[i] = swap_bits(dataA[i]);
   }

   setup_crc(16, 12, 5, 0);                             // Setup the CRC polynomial x^16 + x^12 + X^5 + X^0
   
   crc_init(0x0000);                                    // Starts the CRC accumulator out at 0

   crc = crc_calc16(dataAreversed, sizeof(dataA), 8);   // Returns the calculated CRC value
 
   crcH = swap_bits(make8(crc, 1));
   
   crcL = swap_bits(make8(crc, 0));

   crc = swap_bits(make8(crc, 1)) * 256 + swap_bits(make8(crc, 0));
     
   delay_cycles(1);                            // Breakpoint
}

int8 swap_bits(int8 data)
{
   int8 result = 0;
   if(bit_test(data, 0)) bit_set(result, 7);
   if(bit_test(data, 1)) bit_set(result, 6);
   if(bit_test(data, 2)) bit_set(result, 5);
   if(bit_test(data, 3)) bit_set(result, 4);
   if(bit_test(data, 4)) bit_set(result, 3);
   if(bit_test(data, 5)) bit_set(result, 2);
   if(bit_test(data, 6)) bit_set(result, 1);
   if(bit_test(data, 7)) bit_set(result, 0);
   return result;
}

Ttelmah



Joined: 11 Mar 2010
Posts: 19538

View user's profile Send private message

PostPosted: Wed Mar 04, 2020 5:33 am     Reply with quote

Well done. Smile
temtronic



Joined: 01 Jul 2010
Posts: 9243
Location: Greensville,Ontario

View user's profile Send private message

PostPosted: Wed Mar 04, 2020 6:04 am     Reply with quote

WOW, this is a perfect example of how this fourum can work !!
In about an hour , a challenging quetion is asked, a detailed response, and then working code posted by the original poster.
NICE !!!
sad thing is I remember when xmodem came out......
allenhuffman



Joined: 17 Jun 2019
Posts: 554
Location: Des Moines, Iowa, USA

View user's profile Send private message Visit poster's website

PostPosted: Thu Mar 12, 2020 9:13 am     Reply with quote

temtronic wrote:
sad thing is I remember when xmodem came out......


Then we both probably remember when XMODEM didn't have CRC (and just used a checksum) ;-)
_________________
Allen C. Huffman, Sub-Etha Software (est. 1990) http://www.subethasoftware.com
Embedded C, Arduino, MSP430, ESP8266/32, BASIC Stamp and PIC24 programmer.
http://www.whywouldyouwanttodothat.com ?
Ttelmah



Joined: 11 Mar 2010
Posts: 19538

View user's profile Send private message

PostPosted: Thu Mar 12, 2020 10:29 am     Reply with quote

Problem is I remember using this with acoustic coupled modems where
the inductors used for the tone filters were the size of oranges,...
allenhuffman



Joined: 17 Jun 2019
Posts: 554
Location: Des Moines, Iowa, USA

View user's profile Send private message Visit poster's website

PostPosted: Thu Mar 12, 2020 11:25 am     Reply with quote

Ttelmah wrote:
Problem is I remember using this with acoustic coupled modems where
the inductors used for the tone filters were the size of oranges,...


Well, my first modem was a borrowed acoustic coupler, but it was a RadiShack model so probably much newer. I think you have me beat!
_________________
Allen C. Huffman, Sub-Etha Software (est. 1990) http://www.subethasoftware.com
Embedded C, Arduino, MSP430, ESP8266/32, BASIC Stamp and PIC24 programmer.
http://www.whywouldyouwanttodothat.com ?
Ttelmah



Joined: 11 Mar 2010
Posts: 19538

View user's profile Send private message

PostPosted: Thu Mar 12, 2020 12:35 pm     Reply with quote

I remember the Radio Shack one. A lot later unit (mid 1980's).
Xmodem was late 1970's. Before this is was mainly all 'own coding'
on error testing. Usually custom for the company involved.
Showing our age rapidly.... Sad
Display posts from previous:   
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion All times are GMT - 6 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group