Страница 1 из 2
crc8 даласса
Добавлено: Пн фев 04, 2013 13:20:28
FILIK
тема конечно истёртая до дыр,но хоть убейте не как не пойму это crc8.читал множество информации почти весь интернет облазил да и на нашем сайте читал.на бумажке вроде расчет хороший а в реальности нето.калькулятор crc показывает одно а у меня другое.да и с этими полиномами всё темно.если есть желания и терпение прошу вдалбить мне всё с самого начала как говорят на молекулярном уровне
Re: crc8 даласса
Добавлено: Пн фев 04, 2013 14:08:44
blackx
Ну напишите пример сюда, как вы "на бумажке считаете". Тогда напишем где ошибка.
Re: crc8 даласса
Добавлено: Пн фев 04, 2013 19:14:19
FILIK
привожу свой расчет+калькулятор где я проверял
Re: crc8 даласса
Добавлено: Вт фев 05, 2013 16:31:05
blackx
Калькулятором вашим пользоваться не умею, производил проверку на онлайн-калькуляторе.
Начнем с того, что у нас CRC8 - это значит, что расчеты будут производиться над восьмибитным
числом. При этом размер числа и старшая степень полинома
должны совпадать.
У вас: 10110, полином P(x) = x4 + x2 + x1 - старшая степень тут 4 (т. е. подойдет для crc4)
Приведу пример рассчета для полинома, используемого в 1-wire:
100110001 или P(x) = x8 + x5 + x4 + 1
число 01100100 (MSB, дес. 100), дополним нулем справа до размера полинома (9 бит):
011001000
для CRC8 выполняем 8 проходов по алгоритму:
если число начинается с "1", выполняем операцию XOR (^) над числом с полиномом и производим сдвиг влево (<<) на 1 бит;
иначе, если начинается с "0", то просто производим сдвиг влево на 1 бит.
Код: Выделить всё
1) 011001000: 011001000 << 1 = 110010000
2) 110010000: 110010000 ^ 100110001 << 1 = 010100001 << 1 = 101000010
3) 101000010: 101000010 ^ 100110001 << 1 = 001110011 << 1 = 011100110
4) 011100110: 011100110 << 1 = 111001100
5) 111001100: 111001100 ^ 100110001 << 1 = 011111101 << 1 = 111111010
6) 111111010: 111111010 ^ 100110001 << 1 = 011001011 << 1 = 110010110
7) 110010110: 110010110 ^ 100110001 << 1 = 010100111 << 1 = 101001110
8) 101001110: 101001110 ^ 100110001 << 1 = 001111111 << 1 = 01111111
Итого, мы получили в конце восьмого шага нашу контрольную сумму 01111111.
Проверим на калькуляторе:
http://ghsi.de/CRC/index.php?Polynom=10 ... Message=64
Re: crc8 даласса
Добавлено: Вт фев 05, 2013 20:02:46
FILIK
спасибо,что ответили.вроде становится немного понятнее тоесть: моя первая ошибка не верно выбраный полином я выбрал 4разрядный(10110двоичн=22десятич=16h),а надо 8 разрядный как вашем примере(100110001десятич=305десятич=131h).вторая ошибка я добавлял количество "0"в конец по количеству разрядов полинома и третья ошибка где-то находится в вычислениях если вам не трудно пожалуйста повторите ваши пример вычеслеия столбиком.
если я правильно мыслю запись "x8 + x5 + x4 + 1"означает позиция "1"в разрядах.
Re: crc8 даласса
Добавлено: Вт фев 05, 2013 20:36:34
blackx
Запись вида 100110001 - это числовое представления полинома. Да, единицы в этом представлении означают наличие члена полинома с соответствующей степенью.
Добавление нулей в конец - не ошибка. Я добавлял по одному нулю на каждом шаге, вы - сразу нужное количество. Вот тут есть пример вычисления с нулями в конце:
http://en.wikipedia.org/wiki/Computation_of_CRC#Example. Мне лично так не очень удобно считать.
Re: crc8 даласса
Добавлено: Вт фев 05, 2013 20:50:58
FILIK
немного непонятно, если можно пожалуйста приведите пример расчета столбиком как в моем примере где я расчитывал.
Re: crc8 даласса
Добавлено: Пт июл 12, 2013 12:17:39
dron2012
Привет всем подскажите пожалуйста не как не могу понять как получить контрольную сумму и по примеру пробовал считать и на калькуляторе не как у меня эта цифра не получается 234
62,1,7,19,122,0,132,30, 234
11111000
10000000
11100000
10011000
11110100
00000000
10000100
11110000
1111100010000000111000001001100011110100000000001000010011110000
http://ghsi.de/CRC/index.php?Polynom=10 ... Message=64
Re: crc8 даласса
Добавлено: Сб ноя 16, 2013 23:10:03
GiGaHerz
Самому была интересна эта тема, раньше пользовался чужим решением но где то потерял пришлось разбираться )
Вот к чему пришёл для AVR:
Код: Выделить всё
.def crc_tmp =r5
.def tmp =r16
.def tmp1 =r17
clr tmp
ldi tmp1,0x22
rcall calc_crc8
ldi tmp1,0xF5
rcall calc_crc8
; tmp - содержет crc
calc_crc8:
eor tmp,tmp1 ; сложить с предыдущим значением CRC
ldi tmp1,9 ; степень полинома +1 (потому что цикл с предусловием)
mov crc_tmp,tmp1 ;загрузить счётчик
ldi tmp1,0x31 ;полином 100110001 старший бит не учитываем т.к. выполняем XOR только если старший бит сообщения = 1 и результатом всегда будет 0
lab_crc:
dec crc_tmp ;как и обещал цикл с предусловием
breq ret_crc
SBRS tmp,7 ; проверка на 1 в 7 бите
rjmp only_lsl ; нет
lsl tmp ; сдвинем, писал выше о старшем бите полинома
eor tmp,tmp1 ; ну собственно отнимем или прибавим тут в CRC вычислениях это одно и тоже )
rjmp lab_crc
only_lsl:
lsl tmp ;просто сдвинем влево
rjmp lab_crc
ret_crc:
[color=#0000FF]ret[/color]
Надеюсь будет кому ни будь полезно
Re: crc8 даласса
Добавлено: Сб ноя 16, 2013 23:44:14
da-nie
Re: crc8 даласса
Добавлено: Пт дек 06, 2013 13:25:25
Laplaskin
задавал вопрос в другой теме, не отвечают. Скажите, каким образом считается crc8 в датчике ds18b20?
перевел кучу бумаги чтобы разобраться... оно может и проще кусок кода скопировать у кого-нибудь, но хочется все таки разобраться самому.
вот беру я последовательность 28A1B2C3D40000, прибавляю еще 8 нулей в конец и делю на полином восьмой же степени 100110001.
ответ F7, совпадает с калькулятором, на котором считал
blackx
http://ghsi.de/CRC/index.php?Polynom=10 ... b2c3d40000
но в симуляторе не получается f7, там 8f получается и на другом калькуляторе f8..
http://radiokot.ru/forum/viewtopic.php?f=2&t=49547 тут с картинками прям спрашивал.. последовательность правда без нулей была результат все равно не совпал
Re: crc8 даласса
Добавлено: Сб дек 07, 2013 20:30:14
Laplaskin
Re: crc8 даласса
Добавлено: Пт янв 03, 2014 15:47:51
FILIK
с новыми силами приступаю дальше к изучению этого crc и снова тупик.вот полином(100110001=305д=131h) вот число(110010=50д=32h) вот что получилось на онлайн калькуляторе(01111110=126д=7еh). у меня при вычисление на бумаге получилось 010100110=167д=а7h) не пойму как так. (ссылка на калькулятор
http://ghsi.de/CRC/index.php?Polynom=10 ... Message=50)
Re: crc8 даласса
Добавлено: Пт янв 03, 2014 20:33:40
GARMIN
Всё правильно на бумажке посчитал, только в калькуляторе надо было вставить шестнадцатеричные цифры:
http://ghsi.de/CRC/index.php?Polynom=10 ... Message=32
Re: crc8 даласса
Добавлено: Сб янв 04, 2014 16:44:06
FILIK
ладно с этим разобрался.тепер такой вопрос из того же калькулятора там полином имеет вид 100110001=305д=131h,есть число 11110=30д=1eh сколько нужно добавить нулей в конец числа и вообще как правильно это делать?
Re: crc8 даласса
Добавлено: Ср янв 08, 2014 12:27:48
FILIK
Спасибо всем кто откликнулся .Разобрался как надо расчитывать на бумаге .Теперь следующий вопрос-мне нужно понять как востановить мою последовательность бит при передачи с ошибкой вроде корекциис кодами рида соломона
Re: crc8 даласса
Добавлено: Ср янв 08, 2014 12:31:15
zöner
CRC не поможет, только определяет наличие ошибки.
для коррекции нужно что-то типа ECC
http://ru.wikipedia.org/wiki/ECC
Re: crc8 даласса
Добавлено: Ср янв 08, 2014 12:45:02
FILIK
это я понял что crc может только определить факт ошибки.я не понял как какая-то комбиначия 1или 0 может востановить сообщение .если можно по подпобнее про код хеминга.
Re: crc8 даласса
Добавлено: Ср янв 08, 2014 14:39:10
Kavka
Re: crc8 даласса
Добавлено: Ср янв 08, 2014 16:51:09
FILIK
Поисковиком пользаватся умею и ссылки сморел.Только не понимаю то что там написано в смысли как что вычисляется .Мне нужно как можно проще.