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

 
 
> 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 19 2008, 16:06
Сообщение #2


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

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



Цитата
Идея простая, как веник.


Только таблички в ОЗУ надо хранить. А это вечно недостающий ресурс.

Ну и пара огрехов других, например, надо сдвигать yl влево на один бит. Ну или y+ заменить на y и subi yl,0-16 - это тоже тактов не добавит.


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


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Цитата(Rst7 @ Sep 19 2008, 19:06) *
Ну и пара огрехов других, например, надо сдвигать yl влево на один бит.
Это ладно, я не это имел ввиду, когда писал

Цитата(ReAl @ Sep 19 2008, 18:16) *
И что, именно этот веник действительно метёт?


Даже если исправить эти мелкие огрехи, в переводе на С тот ассемблерный кусок выглядит приблизительно так:

Код
extern uint16_t crctable[32];
uint16_t crc;

void crc_update(uint8_t data) {
    crc ^= crctable[ data & 0x0F ];
    crc ^= crctable[ 16 + (data >>4) ];
}


Что-то не пахнет тут CRC.
Мне кажется, что это ничем не лучше простой XORки всех байтов сообщения.
Независимо от таблицы реакция на последовательность 0xA5 0xC3 будет та же, что и на
0xC3 0xA5 или на 0xC5 0xA3.

А после того, как заставить этот код считать таки CRC, да табличку положить во флеш и получить +4 такта на переходе от LD к LPM - выйдет дольше, чем обсуждавшиеся методы.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
=GM=
сообщение Sep 19 2008, 23:17
Сообщение #4


Ambidexter
*****

Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282



Цитата(ReAl @ Sep 19 2008, 19:27) *
в переводе на С тот ассемблерный кусок выглядит приблизительно так:
Код
extern uint16_t crctable[32];
uint16_t crc;
void crc_update(uint8_t data) {
    crc ^= crctable[ data & 0x0F ];
    crc ^= crctable[ 16 + (data >>4) ];
}
Что-то не пахнет тут CRC.

Я бы ещё усилил, примерно так
Код
void crc_update(uint8_t data)
{
  crc ^= crctable2[ data ];
}

А это чисто табличный метод счёта crc. Возражения есть(:-)? В посте #18 я дал чисто идею реализации. Посчитал поточнее, получился 21 такт, включая загрузку байта из буфера и счётчик байт. В симуляторе вроде дышит, доберусь до работы, проверю поточнее. А может у кого под рукой есть тестовая строка с вычисленной crc?


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
ReAl
сообщение Sep 20 2008, 07:16
Сообщение #5


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Цитата(=GM= @ Sep 20 2008, 02:17) *
Я бы ещё усилил, примерно так
Код
void crc_update(uint8_t data)
{
  crc ^= crctable2[ data ];
}
Кажется, речь шла о коде, который не вычисляет CRC с помощью таблички для 4 битов, а не при помощи таблички для 8 битов.
Хотя с 256-словной таблицей алгоритм не вычисляет CRC быстрее, спору нет.

Цитата(=GM= @ Sep 20 2008, 02:17) *
А это чисто табличный метод счёта crc. Возражения есть(:-)? В посте #18 я дал чисто идею реализации.
Да какие уж тут возражения... "слов нет"


--------------------
Ну, я пошёл… Если что – звоните…
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
- - Rst7   Цитата+1 Оптимальнее чем в avr-gcc для crc16 и не ...   Sep 18 2008, 11:42
|- - 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
||- - =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 Текстовая версия Сейчас: 20th July 2025 - 07:14
Рейтинг@Mail.ru


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