Как вычислять контрольную сумму - CRC8 CRC16 ?
Начал изучать 1-wire и столкнулся с проблемой подсчёта CRC8, не могу понять алгоритм. В частности почему на wikipedia.ru http://ru.wikipedia.org/wiki/CRC таблица CRC8 одна, а на radiokot.ru http://radiokot.ru/articles/13/ таблица совсем другая, хотя вроде бы используется один и тот же полином. Руками попробовал посчитать таблицу с полиномом X^8+X^5+X^4+X^0, получилась такая же как на википедии. В чём разница???
- Реклама
Различие, IMHO, в том с какого конца считать биты. CRC это остаток деления потока на полином. А вот в каком порядке этот поток идет - старшим битом вперед или младшим - это уже вопрос конкретного соглашения.
Таблицы одинаковые, только для разных направлений.
Таблица в радиокоте совпадает с далласовской AN27. А даллас пихает данные начиная с младшего бита первого байта.
Таблицы одинаковые, только для разных направлений.
Таблица в радиокоте совпадает с далласовской AN27. А даллас пихает данные начиная с младшего бита первого байта.
Полином 100110001 - X^8+X^5+X^4+X^0
Перевёрнутый 100011001
считаю второй элемент таблицы индекс 1
что то не совпадает, в таблице 94
Покажите наглядно как считать.
Перевёрнутый 100011001
считаю второй элемент таблицы индекс 1
Код: Выделить всё
1 0000 0000
1 0001 1001
--------------
1 1001 = 25 (dec)
Покажите наглядно как считать.
А... теория... я - пас. Может кто-нибудь поумнее может разжевать этот вопрос.
Может эта ссылка прольёт свет на этот вопрос?http://en.wikipedia.org/wiki/Computation_of_CRC
Может эта ссылка прольёт свет на этот вопрос?http://en.wikipedia.org/wiki/Computation_of_CRC
у меня получилось...
Как я и говорил, надо сдвигать в ДРУГУЮ сторону.
Код: Выделить всё
Поток 000000001
полином 100011001
----------
0000100011000
100011001
-----------------
10011101
100011001
----------------
110000100
100011001
--------------
1011110 = 5e = 94
- Реклама
По аналлогии с прямым алгоритмом слева нужно добавлять количество нулей такое сколько бит CRC, CRC 8ми битная, почему же у вас добавляется 14 нулей вместо 8? Каков алгоритм? И вконце почему то спустился ноль справа, опять же какая логика? Сколько нулей спускать? Конечно получилось 94, но это метод подгонки по моему.
Должно быть 15 - припиши нолик слева в последней строке где получилось 0x5e. 8 нулей из буфера начального состояния CRC и 7 нулей из числа 0x01. Просто я эти нули не писал и выбросил строчки где отнимается 0. Всего вычитаний должно быть 8.
Извини, математическое доказательство привести я не могу. Могу только показать как это считать и почему имеются две "правильных" таблицы.но это метод подгонки по моему
- Meteor
- Друг Кота
- Сообщения: 3961
- Зарегистрирован: Пн июл 13, 2009 14:37:39
- Откуда: Московская область, наукоград.....
- Контактная информация:
Глянь сюда http://atmel.com/dyn/resources/prod_doc ... oc1143.pdf вдруг поможет
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
Математическое док-во мне и не нужно. Благодарю за объясненияuldemir писал(а): Извини, математическое доказательство привести я не могу. Могу только показать как это считать и почему имеются две "правильных" таблицы.
Спасибо за ссылку, пригодится.Meteor писал(а): Глянь сюда http://atmel.com/dyn/resources/prod_doc ... oc1143.pdf вдруг поможет
Ну, может так нагляднее. В конце, я вставил два вычитания, чтобы было видно откуда взялся ноль справа (да и слева). Так же, два вычитания 0 нужно было бы вставить после первого вычитания. И еще, в первой строчке разделил Начальное значение CRC и первый байт. Те нули, что я ставлю перед остатком слева - берутся справа от 1 в первой строчке. Т.е. "10000000" надо рассматривать как 0x01, а не 0x80. Младшим битом вперед.
Устал подгонять выравнивание, необессудьте, если у вас не выглядит красивым столбиком, почему-то при копировании все съехало.
Код: Выделить всё
00000000 10000000
- 10001100 1
-------------------------
10001100 0
- 100011001
-------------------------
10011101
- 100011001
-------------------------
110000100
- 000000000
-------------------------
011000010
- 100011001
-------------------------
101111000
- 000000000
-------------------------
01011110
Код: Выделить всё
0 000000000 10001000
- 100110001
-------------------------
1 001100010 = 8c 0001000
- 000000000
-------------------------
2 011000100 = 46 001000
- 000000000
-------------------------
3 110001000 = 23 01000
- 100110001
-------------------------
4 101110010 = 9d 1000
- 000000000
-------------------------
5 1011100100 = 4e 000
- 000000000
-------------------------
6 111001000 = 27 00
- 100110001
-------------------------
7 111110010 = 9f 0
- 100110001
-------------------------
= 110000110 = c3
- Meteor
- Друг Кота
- Сообщения: 3961
- Зарегистрирован: Пн июл 13, 2009 14:37:39
- Откуда: Московская область, наукоград.....
- Контактная информация:
Вот надыбал кое что ( http://rsdn.ru/article/files/classes/Se ... cguide.pdf ), времени пока разбираться нет...
((((
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
Взято из:Используется та же самая таблица, правда, содержимое каждой ее позиции зеркально обращено относительно центра позиции.
Используется то же самое исходное значение регистра, только так же отраженное.
Байты сообщения обрабатываются в том же порядке, что и раньше, то есть само сообщение не является зеркальным.
Сами байты сообщения не нужно зеркально отображать, так как все остальное уже было отражено!
Вобщем как таблица получается одна из другой я понял. Но "нетабличный" алгоритм подсчёта обратной CRC я не понялMeteor писал(а):Вот надыбал кое что ( http://rsdn.ru/article/files/classes/Se ... cguide.pdf ), времени пока разбираться нет...((((
- Meteor
- Друг Кота
- Сообщения: 3961
- Зарегистрирован: Пн июл 13, 2009 14:37:39
- Откуда: Московская область, наукоград.....
- Контактная информация:
Вот еще попробуйте ехемплы посмотреть от иара http://supp.iar.com/Support/?note=91733&from=note+16492, наверняка не таблицами шьют...svamoscow писал(а): Но "нетабличный" алгоритм подсчёта обратной CRC я не понялне хотелось бы память контроллера забивать таблицами.
ЗЫ. Хотя похоже что предыдущее - перевод текущего, но ехемплы есть:)
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
- Meteor
- Друг Кота
- Сообщения: 3961
- Зарегистрирован: Пн июл 13, 2009 14:37:39
- Откуда: Московская область, наукоград.....
- Контактная информация:
Увы, что поделать.uldemir писал(а):Примеры кочуют из книги в книгу со страницы на страницу в неизменном виде.
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
Помогите разобраться с кашей в голове
Помогите пожалуйста расчитать CRC16 табличным методом, ибо у меня используя различные вылженные коды для расчета, для каждого кода свой результат.
И так:
AtMega2561, AVRStudio
Поток: 0х00С8 (сдесь первый вопрос: Использовать 0хС8 или все таки 0х00С8 )
Полином: 8005
Нач. значение: 0xFFFF
Последнее с XOR: 0xFFFF
Отражения: нет
Используя реальное вычисение CRC получаю:
0xC8 : 1100 1000
8005 : 1000 0000 0000 0101
W: 15
Используя табличный алгоритм вычесления предложенный romeuz результат 0xD630 (но в его алгоритме я так понял используется отраженный метод)
Используя калькулятор http://zorc.breitbandkatze.de/crc.html вводя исходные данные
CRC order: 16
CRC polynom: 8005
Initial value: 0xFFFF
Final XOR value:0xFFFF
Data sequence: 00c8
Result: F6D9 (hex), 4 data bytes
Исользуя калькулятр(вложенный файл)
Резултат: 89BE
И наконец попробывал написать свою программу (код во влжении)
Результат 0xBED6
Помогите пожалуйсто разобраться как правильно расчитать CRC 16
И так:
AtMega2561, AVRStudio
Поток: 0х00С8 (сдесь первый вопрос: Использовать 0хС8 или все таки 0х00С8 )
Полином: 8005
Нач. значение: 0xFFFF
Последнее с XOR: 0xFFFF
Отражения: нет
Используя реальное вычисение CRC получаю:
0xC8 : 1100 1000
8005 : 1000 0000 0000 0101
W: 15
Код: Выделить всё
11001000000000000000000
1000000000000101| || |
============ | || |
01001000000001010|| |
1000000000000101|| |
============ || |
0001000000001111000
1000000000000101
============
1111101000 -> 0x03E8Используя калькулятор http://zorc.breitbandkatze.de/crc.html вводя исходные данные
CRC order: 16
CRC polynom: 8005
Initial value: 0xFFFF
Final XOR value:0xFFFF
Data sequence: 00c8
Result: F6D9 (hex), 4 data bytes
Исользуя калькулятр(вложенный файл)
Резултат: 89BE
И наконец попробывал написать свою программу (код во влжении)
Результат 0xBED6
Помогите пожалуйсто разобраться как правильно расчитать CRC 16
- Вложения
-
- CRC_16v2.asm
- CRC16
- (4.24 КБ) 332 скачивания
-
- 14687_CRC16.rar
- Калькулятор CRC16
- (244.76 КБ) 511 скачиваний
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18546
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Как вычислять контрольную сумму - CRC8 CRC16 ?
для 1-wire CRC я сделал небольшую утилитку-калькулятор. в отличие от других известных калькулятров моя утилитка может вести посчет CRC для произвольного количества байтов, а не только семи или восьми.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: Как вычислять контрольную сумму - CRC8 CRC16 ?
использую такой код с ds18b20:
Код: Выделить всё
uint8_t iInfo[9]; // здесь лежат данные с датчика
uint8_t iCheckCRC(void)
{
uint8_t a, b, i, j, crc=0;
for(i=0; i<9; i++)
{
a = iInfo[i];
for(j=0; j<8; j++)
{
b = a;
a ^= crc;
if(a & 1) crc = ((crc^0x18)>>1) | 0x80;
else crc >>= 1;
a = b >> 1;
}
}
if(crc == 0) return 1;
else return 0;
}


