реклама на сайте
подробности

 
 
> CRC16(ModBus) на С для ATmega128, помогите разобраться
sf9
сообщение Sep 17 2008, 07:38
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 35
Регистрация: 30-10-07
Из: Москва
Пользователь №: 31 896



Всем доброе время суток!
Прошу помочь мне разобраться в С коде.Сам только недавно начал осваивать.
нужно реализовать CRC16 для ModBus.
Я знаю,что есть куча готовых реализаций.Простым(последовательным) и табличным способом.
Но хочу реализовать сам.
У меня проблема в том,что для вычисления CRC нужно смотреть на состояние младшого бита. Если "1" - то выполнять XOR,если нет,то крутить дальше.

Вот мой код:

int crc16 (unsigned char a) // a - 8-bit data for calculation CRC
{
unsigned int reg, tmp;
int i;

reg = 0xFFFF; // step1: initial loading of 16-bit register
reg ^= (unsigned int)a; // step2: a XOR reg

for(i = 0;i<8;i++) //step3: 8-iteration to calculate CRC
{
reg >>= 1;
tmp = reg;
tmp <<= 15;
if(tmp == 0x8000) reg ^= 0xA001; // checking: if LSB = "1" reg=reg^0xA001
}
return reg;
}

проверку я выолняю поразрядным сдвигом 16-битного reg влево, и, если там "1",то xor.

ниже преведена другая реализация CRC16 и она работет корректно!!!!

int crc16 (unsigned char a)
{
unsigned int reg;
unsigned char i, tmp;

reg = 0xFFFF;
reg ^= (unsigned int)a;
for(i = 0;i<8;i++)
{
tmp = (unsigned char)(reg&0x0001);
reg >>= 1;
if(tmp) reg ^= 0xA001;
}
return reg;
}

Поясните,что не так в первой реализачии. smile3046.gif
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Rst7
сообщение Sep 18 2008, 11:42
Сообщение #2


Йа моск ;)
******

Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610



Цитата
+1 Оптимальнее чем в avr-gcc для crc16 и не сделать


Не кажи "гоп" wink.gif

Код
__z UREG CRC16stage2(UINT8 uchCRCLo, UINT8 uchCRCHi, UREG l, UREG write, UINT8 *puchMsg, UREG i128,UREG i1, UREG i192);

UREG CRC16(UINT8 *puchMsg, UREG usDataLen, UREG write )
{
  return CRC16stage2(0xFF,0xFF,usDataLen,write,puchMsg,128,1,192);
}

#pragma optimize=no_inline
__z UREG CRC16stage2(UINT8 uchCRCLo, UINT8 uchCRCHi, UREG l, UREG write, UINT8 *puchMsg, UREG i128, UREG i1, UREG i192)
{
  do
  {
    UINT8 parity;
    UINT16 tmp16;
    parity=*puchMsg++;
    parity^=uchCRCLo;
    uchCRCLo=uchCRCHi;
    tmp16=__multiply_unsigned(parity,i128);
    uchCRCHi=tmp16>>8;
    uchCRCLo^=tmp16;
    tmp16>>=1;
    uchCRCHi^=tmp16>>8;
    uchCRCLo^=tmp16;
    parity^=tmp16>>8;
    parity^=parity>>1;
    parity^=__swap_nibbles(parity);
    if (parity&1)
    {
      uchCRCLo^=i1;
      uchCRCHi^=i192;
    }
  }
  while(--l);
  if (write)
  {
    *puchMsg++=uchCRCLo;
    *puchMsg++=uchCRCHi;
  }
  else
  {
    UREG k;
    if ((k=*puchMsg++-uchCRCLo)) return k;
    return *puchMsg++-uchCRCHi;
  }
  return 0;  
}


Код
        RSEG CODE:CODE:NOROOT(1)
//   74 UREG CRC16(UINT8 *puchMsg, UREG usDataLen, UREG write )
CRC16:
//   75 {
        MOVW    R31:R30, R17:R16
//   76   return CRC16stage2(0xFF,0xFF,usDataLen,write,puchMsg,128,1,192);
        LDI     R22, 192
        LDI     R21, 1
        LDI     R20, 128
        LDI     R17, 255
        LDI     R16, 255
        REQUIRE CRC16stage2
       ;               // Fall through to label CRC16stage2
//   77 }
//   78
//   79 #pragma optimize=no_inline

        RSEG CODE:CODE:NOROOT(1)
//   80 __z UREG CRC16stage2(UINT8 uchCRCLo, UINT8 uchCRCHi, UREG l, UREG write, UINT8 *puchMsg, UREG i128, UREG i1, UREG i192)
CRC16stage2:
//   81 {
        MOV     R2, R16
        MOV     R23, R17
//   82   do
//   83   {
//   84     UINT8 parity;
//   85     UINT16 tmp16;
//   86     parity=*puchMsg++;
??CRC16stage2_0:
        LD      R3, Z+
//   87     parity^=uchCRCLo;
        EOR     R3, R2
//   88     uchCRCLo=uchCRCHi;
        MOV     R2, R23
//   89     tmp16=__multiply_unsigned(parity,i128);
        MUL     R3, R20
//   90     uchCRCHi=tmp16>>8;
        MOV     R23, R1
//   91     uchCRCLo^=tmp16;
        EOR     R2, R0
//   92     tmp16>>=1;
        LSR     R1
        ROR     R0
        EOR     R23, R1
//   93     uchCRCHi^=tmp16>>8;
//   94     uchCRCLo^=tmp16;
        EOR     R2, R0
//   95     parity^=tmp16>>8;
        EOR     R3, R1
//   96     parity^=parity>>1;
        MOV     R16, R3
        LSR     R16
        EOR     R3, R16
//   97     parity^=__swap_nibbles(parity);
        MOV     R16, R3
        SWAP    R16
        EOR     R3, R16
//   98     if (parity&1)
        BST     R3, 0
        BRTC    ??CRC16stage2_1
//   99     {
//  100       uchCRCLo^=i1;
        EOR     R2, R21
//  101       uchCRCHi^=i192;
        EOR     R23, R22
//  102     }
//  103   }
//  104   while(--l);
??CRC16stage2_1:
        DEC     R18
        BRNE    ??CRC16stage2_0
//  105   if (write)
        TST     R19
        BREQ    ??CRC16stage2_2
//  106   {
//  107     *puchMsg++=uchCRCLo;
        ST      Z+, R2
//  108     *puchMsg++=uchCRCHi;
        ST      Z, R23
//  109   }
//  110   else
//  111   {
//  112     UREG k;
//  113     if ((k=*puchMsg++-uchCRCLo)) return k;
//  114     return *puchMsg++-uchCRCHi;
//  115   }
//  116   return 0;  
        LDI     R16, 0
        RET
??CRC16stage2_2:
        LD      R16, Z+
        SUB     R16, R2
        BRNE    ??CRC16stage2_3
        LD      R16, Z
        SUB     R16, R23
??CRC16stage2_3:
        RET
//  117 }


20.5 тактов против 23 на собственно расчет следующего значения CRC16.


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- sf9   CRC16(ModBus) на С для ATmega128   Sep 17 2008, 07:38
- - Sat360   В первой реализации регистр сдвигается ДО анализа ...   Sep 17 2008, 07:46
- - Сергей Борщ   В работающей программе сначала запоминается младши...   Sep 17 2008, 07:55
- - sf9   СПАСИБО ОГРОМНОЕ!!! Я понял,просто ...   Sep 17 2008, 08:30
- - Rst7   А меня вот последнее время поперло по-другому CRC1...   Sep 17 2008, 08:52
|- - ReAl   Цитата(Rst7 @ Sep 17 2008, 11:52) А меня ...   Sep 17 2008, 10:29
|- - singlskv   Цитата(ReAl @ Sep 17 2008, 14:29) У avr-g...   Sep 17 2008, 17:43
- - sf9   Кстати,в компиляторах и САПРах для МСs как можно п...   Sep 17 2008, 09:15
- - Rst7   Никак. Только ручками. Ну или в симуляторе выполни...   Sep 17 2008, 09:29
|- - sf9   Цитата(Rst7 @ Sep 17 2008, 13:29) Никак. ...   Sep 17 2008, 09:43
- - Rst7   ЦитатаЕсть ли настройки в компиляторах или САПРах ...   Sep 17 2008, 09:50
|- - sf9   Спасибо большое! Побрёл я наращивать головные ...   Sep 17 2008, 10:04
- - sf9   По поводу crc16.h абсолютно согласен,вчера проверя...   Sep 18 2008, 09:52
|- - singlskv   Цитата(Rst7 @ Sep 18 2008, 15:42) Не кажи...   Sep 18 2008, 20:25
|- - =GM=   А что если сделать две таблицы на биты <7-4...   Sep 19 2008, 11:20
|- - Сергей Борщ   Цитата(=GM= @ Sep 19 2008, 14:20) А что е...   Sep 19 2008, 11:47
|- - =GM=   Идея простая, как веник. Ну вот как-то так, таблиц...   Sep 19 2008, 12:07
|- - ReAl   Цитата(=GM= @ Sep 19 2008, 15:07) Идея пр...   Sep 19 2008, 15:16
- - Rst7   ЦитатаИдея простая, как веник. Только таблички в ...   Sep 19 2008, 16:06
|- - ReAl   Цитата(Rst7 @ Sep 19 2008, 19:06) Ну и па...   Sep 19 2008, 20:27
|- - =GM=   Цитата(ReAl @ Sep 19 2008, 19:27) в перев...   Sep 19 2008, 23:17
||- - ReAl   Цитата(=GM= @ Sep 20 2008, 02:17) Я бы ещ...   Sep 20 2008, 07:16
||- - =GM=   Цитата(ReAl @ Sep 20 2008, 06:16) Кажется...   Sep 20 2008, 17:36
||- - ReAl   Цитата(=GM= @ Sep 20 2008, 20:36) Речь я ...   Sep 20 2008, 20:51
|- - =GM=   Цитата(ReAl @ Sep 19 2008, 19:27) Что-то ...   Sep 21 2008, 22:30
|- - ReAl   Вы так упорствуете в своих заблуждениях... Цитата(...   Sep 22 2008, 11:09
|- - =GM=   Ну, я не упорствую, но вот это ваше "return c...   Sep 23 2008, 11:51
|- - singlskv   Цитата(=GM= @ Sep 23 2008, 15:51) (Замечу...   Sep 23 2008, 18:48
|- - ReAl   Цитата(=GM= @ Sep 23 2008, 14:51) Ну, я н...   Sep 23 2008, 21:33
||- - =GM=   Цитата(ReAl @ Sep 23 2008, 20:33) Вы сами...   Sep 23 2008, 23:18
|- - defunct   Цитата(=GM= @ Sep 23 2008, 14:51) Для ваш...   Sep 29 2008, 19:50
|- - =GM=   Цитата(defunct @ Sep 29 2008, 18:50) У ва...   Sep 30 2008, 09:26
||- - defunct   Цитата(=GM= @ Sep 30 2008, 12:26) А вы эт...   Sep 30 2008, 13:13
||- - =GM=   Цитата(defunct @ Sep 30 2008, 12:13) Я не...   Sep 30 2008, 15:35
||- - Сергей Борщ   Цитата(=GM= @ Sep 30 2008, 18:35) Я ж вам...   Sep 30 2008, 16:04
|||- - =GM=   Цитата(Сергей Борщ @ Sep 30 2008, 15:04) ...   Sep 30 2008, 21:49
|||- - Сергей Борщ   Цитата(=GM= @ Oct 1 2008, 00:49) Во, Серг...   Oct 3 2008, 09:23
|||- - =GM=   Вот укороченная таблица для модбаса Код;a short cr...   Oct 3 2008, 12:43
|||- - defunct   Цитата(=GM= @ Oct 3 2008, 14:43) Вот тест...   Jan 9 2009, 00:07
|||- - =GM=   Цитата(defunct @ Jan 9 2009, 00:07) =GM=,...   Jan 9 2009, 11:38
||- - defunct   Цитата(=GM= @ Sep 30 2008, 18:35) Я ж вам...   Sep 30 2008, 16:46
|- - =GM=   Цитата(defunct @ Sep 29 2008, 18:50) Mодб...   Oct 2 2008, 15:27
||- - defunct   Цитата(=GM= @ Oct 2 2008, 18:27) defuct, ...   Oct 2 2008, 16:37
||- - =GM=   Цитата(defunct @ Oct 2 2008, 15:37) Если ...   Oct 2 2008, 20:41
|- - =GM=   Проверил ещё раз, получаются другие результаты, но...   Oct 3 2008, 08:30
- - dred73   Держи рабочие функции по расчету CRC8 и CRC16 Код...   Jan 11 2009, 07:04
- - Kovrov   Ребят, может кто нибудь оканчательный исходник выл...   Aug 12 2009, 09:59
|- - =GM=   Код в посте #28, таблица для модбаса и тестовые ве...   Aug 12 2009, 22:03
- - Kovrov   В этом примере таблица находится в рам пусть и 64 ...   Aug 13 2009, 13:38


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 00:55
Рейтинг@Mail.ru


Страница сгенерированна за 0.01447 секунд с 7
ELECTRONIX ©2004-2016