Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
20.06.2008, 08:30
|
|
Прохожий
Регистрация: 19.12.2006
Сообщений: 5
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Вот это совсем другое дело! Спсибо pambaru. А какой полином использован в этой таблице?
|
|
|
|
20.06.2008, 08:32
|
|
Почётный гражданин KAZUS.RU
Регистрация: 19.01.2007
Сообщений: 1,747
Сказал спасибо: 2
Сказали Спасибо 46 раз(а) в 35 сообщении(ях)
|
Табличный метод для 51 на ас-ме, аналогичный предыдущему СИ-коду: http://www.8052.com/codelib/crc8.asm
Удачи!
__________________
Я, думаю, нужно подумать...
|
|
|
|
20.06.2008, 08:39
|
|
Почётный гражданин KAZUS.RU
Регистрация: 24.03.2007
Сообщений: 1,352
Сказал спасибо: 85
Сказали Спасибо 610 раз(а) в 369 сообщении(ях)
|
Сообщение от olegras
|
Вот это совсем другое дело! Спсибо pambaru. А какой полином использован в этой таблице?
|
Конкретно использую для подсчета CRC в DS18S20.
Писалось по даташиту, полином тот, что в даташите ![Улыбка](images/smilies/icon_smile.gif)
(лениво открывать). Таблица в даташите приведена.
CRC16 писал для какого-то другого устройства, не помню какого, так что не знаю в каком проекте искать ![Улыбка](images/smilies/icon_smile.gif) .
Но если сильно нужно будет, найду. В любом случае, все строго по даташиту.
|
|
|
|
20.06.2008, 08:41
|
|
Прописка
Регистрация: 10.06.2008
Сообщений: 115
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: вычисление CRC
Сообщение от qaz12345qaz12345
|
Господа, подскажите пожалуйста алгоритм вычисления CRC далласовских таблеток, смотрел смотрел даташиту, что то ни чего не пойму там.
|
Неприятности в использовании CRC
|
|
|
|
20.06.2008, 09:06
|
|
Почётный гражданин KAZUS.RU
Регистрация: 19.01.2007
Сообщений: 1,747
Сказал спасибо: 2
Сказали Спасибо 46 раз(а) в 35 сообщении(ях)
|
Сообщение от pambaru
|
Писалось по даташиту, полином тот, что в даташите ![Улыбка](images/smilies/icon_smile.gif)
(лениво открывать).
|
X^8 + X^5 + X^4 + 1
Удачи!
__________________
Я, думаю, нужно подумать...
|
|
|
|
20.06.2008, 12:52
|
|
Частый гость
Регистрация: 08.12.2006
Сообщений: 24
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
А я вот так делаю
BYTE CrcByte(BYTE b, BYTE crc)
{
BYTE i;
for(i=0;i‹8;i++)
{
if ((b & 0x80) == (crc & 0x80)) //bits are same
{
crc ‹‹= 1; //shift left crc and byte
b ‹‹= 1;
}
else
{
crc ‹‹= 1; //shift left CRC
b ‹‹= 1;
crc ^= 0x30; //invert bits 4 and 5
crc |= 0x01; // set bit[0]
}
}
return crc;
}
BYTE Crc8(BYTE *d,BYTE len,BYTE crc)
{
BYTE i;
for(i=0;i‹len;i++) crc = CrcByte(d[i],crc);
return crc;
}
|
|
|
|
20.06.2008, 14:24
|
|
Частый гость
Регистрация: 30.09.2004
Сообщений: 39
Сказал спасибо: 2
Сказали Спасибо 1 раз в 1 сообщении
|
А теперь кратко поясним, что такое деление по модулю 2. Пусть массив (последовательность бит) имеет следующий вид: 101111001110 (для простоты берем небольшую разрядность). Число, на которое делим (называемое обычно образующим полиномом) возьмем 10011. Как оно выбирается? Оно должно делиться по модулю 2 без остатка только на единицу и само на себя (то есть это должно быть простое число в смысле деления по модулю 2). Разрядность полинома берется на единицу большая, чем требуемая разрядность контрольной суммы (остатка от деления). Так, чтобы получить 8-разрядный остаток (8-разрядную контрольную сумму), надо брать 9-разрядный полином. В нашем случае полином 5-разрядный, следовательно, остаток будет 4-разрядный. Для получения 8-разрядного остатка можно использовать, например, полином 1 0001 1101 или 11D в 16-ричном коде.
Деление по модулю 2 производится точно так же, как и привычное для нас деление "в столбик" (рис. 14.6), но вместо вычитания в данном случае используется поразрядное сложение по модулю 2, то есть каждый результирующий бит представляет собой функцию Исключающее ИЛИ от соответствующих битов слагаемых. Частное от деления нас не интересует, а остаток, равный в нашем примере 1000, и будет циклической контрольной суммой.
Вычисление циклической контрольной суммы
Рис. 14.6. Вычисление циклической контрольной суммы
Или http://www.intuit.ru/department/hardware/digs/14/4.html
|
|
|
|
20.06.2008, 15:15
|
|
Прописка
Регистрация: 10.06.2008
Сообщений: 115
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Сообщение от kmw
|
А теперь кратко поясним, что такое деление по модулю 2. Пусть массив (последовательность бит) имеет следующий вид: 101111001110 (для простоты берем небольшую разрядность). Число, на которое делим (называемое обычно образующим полиномом) возьмем 10011. Как оно выбирается? Оно должно делиться по модулю 2 без остатка только на единицу и само на себя (то есть это должно быть простое число в смысле деления по модулю 2). Разрядность полинома берется на единицу большая, чем требуемая разрядность контрольной суммы (остатка от деления). Так, чтобы получить 8-разрядный остаток (8-разрядную контрольную сумму), надо брать 9-разрядный полином. В нашем случае полином 5-разрядный, следовательно, остаток будет 4-разрядный. Для получения 8-разрядного остатка можно использовать, например, полином 1 0001 1101 или 11D в 16-ричном коде.
Деление по модулю 2 производится точно так же, как и привычное для нас деление "в столбик" (рис. 14.6), но вместо вычитания в данном случае используется поразрядное сложение по модулю 2, то есть каждый результирующий бит представляет собой функцию Исключающее ИЛИ от соответствующих битов слагаемых. Частное от деления нас не интересует, а остаток, равный в нашем примере 1000, и будет циклической контрольной суммой.
Вычисление циклической контрольной суммы
Рис. 14.6. Вычисление циклической контрольной суммы
Или http://www.intuit.ru/department/hardware/digs/14/4.html
|
Неприятности в использовании CRC
|
|
|
|
20.06.2008, 22:08
|
|
Временная регистрация
Регистрация: 15.06.2008
Сообщений: 57
Сказал спасибо: 2
Сказали Спасибо 36 раз(а) в 8 сообщении(ях)
|
Табличный быстр, но жрёт много кода. Обычный медленнее, но экономичнее. Вот пример:
{тут была программа, которая читает ds1820}
call DowRst
ldi r16, 0xcc ;Skip Rom
call DowComm
ldi r16, 0xbe ;Read ScratchPad
call DowComm
clr r18 ; init CRC
call DowReadC ; byte 0
sts TempL,r16
call DowReadC ; byte 1
sts TempH,r16
call DowReadC ; byte 2
call DowReadC ; byte 3
call DowReadC ; byte 4
call DowReadC ; byte 5
call DowReadC ; byte 6
call DowReadC ; byte 7
call DowRead ; byte 8 - CRC
cpse r16,r18 ; сравниваем с посчитанной CRC
rjmp RetryReadTemp
{Тут опять корова языком слизнула...}
;------------------------------------------------------
; Чтение DOW + CRC
;------------------------------------------------------
DowReadC: rcall DowRead
;----------------------------------------------------------
; Процедура обновления CRC8 (циклическая контрольная сумма, он же dow_crc).
; Параметр в r16, результат r18, временные: r7,r8
;----------------------------------------------------------
DowCRC: push r16
ldi r17,8 ; битовый счётчик
mov r7,r17
mov r8,r16
CRC_LOOP: eor r16,r18
ror r16
mov r16,r18
brcc ZERO
ldi r18,0x18
eor r16,r18
ZERO: ror r16
mov r18,r16
lsr r8
mov r16,r8
dec r7
brne CRC_LOOP
pop r16
ret
|
|
|
|
20.06.2008, 22:09
|
|
Частый гость
Регистрация: 06.12.2006
Сообщений: 17
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Я прошу прощения, вот вроде бы после всех Ваших объяснений и ссылок мне стало понятно как это работает, не пойму только что это X^8+X^5+X^4+1. я так понимаю на месте этого должен быть байт, точнее 9 битов. Это формула? тогда что нужно подставить вместо X ?
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Тема |
Автор |
Раздел |
Ответов |
Последнее сообщение |
Помогите найт алгоритм вычисления CRC для iButton...
|
IgorSHV |
Цифровые сигнальные процессоры |
19 |
18.01.2012 21:55 |
Компилятор Hi-Tech, вычисление, на PIC12F675
|
3ann |
Микроконтроллеры, АЦП, память и т.д |
27 |
06.07.2009 12:01 |
DS1990 и crc
|
sergio-nsk |
Микроконтроллеры, АЦП, память и т.д |
13 |
12.02.2009 11:09 |
Вычисление параметров синусоиды по отсчетам, снятых с АЦП
|
_DmZ_ |
Микроконтроллеры, АЦП, память и т.д |
11 |
08.10.2008 16:23 |
Странное вычисление температуры DS18S20
|
nagano |
Микроконтроллеры, АЦП, память и т.д |
0 |
20.08.2008 08:58 |
Часовой пояс GMT +4, время: 00:46.
|
|