Технический форум по робототехнике.
Levin150 » 20 июл 2014, 11:45
Привет всем .
Нужно написать два скетча и подробно расписать для подсчёта контрольной суммы CRC за вознаграждения , кому интересно пишите на почту.
evgenzheka@qip.ru Есть устройства которое читает данные с контрольной суммой.
Нужен код когда я изменяю любое значения , контрольная сумма рассчитывается
автоматически.
void setup() {
Serial.begin(19200);
}
void loop() {
Serial.write(62);
Serial.write(1);
Serial.write(7);
Serial.write(19);
Serial.write(83);
Serial.write(0);
Serial.write(252);
Serial.write(20);
Serial.write(183); // Контрольная сумма 100110001 P(x) = x8+ x5+ x4+ x0
delay(1000);
}
А во втором коде я не знаю по какой CRC она рассчитывается
void setup() {
Serial.begin(9600);
}
void loop() {
Serial.println("S1B2F02 A010540.00 C0165010.000 E0012143.0 G077.0 H1200 I+050 J060 K02220.0 L02221.0 M02222.0 N02223.0 O02224.0 P01000000 Z6CFE");
delay(1000);
}
elmot » 28 июл 2014, 14:42
Опять АВР. Нет, чтобы взять нормальный контроллер с аппаратным CRC
трололо off
Madf » 28 июл 2014, 15:09
зато есть аппаратное шифрование :Р
Duhas » 28 июл 2014, 19:27
трололо on
не обобщаем, xmega = avr, crc аппаратное есть )
elmot » 29 июл 2014, 23:55
Duhas писал(а):трололо on
не обобщаем, xmega = avr, crc аппаратное есть )
А бывают ли ардуины на xmega'х?
Angel71 » 30 июл 2014, 00:16
и да и нет. из неофициального есть как минимум xmegaduino. официального вроде ничего небыло.
Duhas » 01 авг 2014, 10:27
elmot писал(а):А бывают ли ардуины на xmega'х?
не суть - был "наезд" на АВР а не на дуино) последние и на армах бывают )
ПС порой надоедает ваша пропаганда "нормальных" контроллеров.
Dmitry__ » 01 авг 2014, 17:59
А мне другое интересно, эти аппаратные crc считают любой полином? Если нет, то аппаратный crc на фиг не нужен...
Подсчет crc - стандартная задача для контроллера, на все стандартные задачи не напасешься аппаратных перделок.
Вот для crc8 шустрый способ, полином как у 1-wire dallas (кажись):
На сцы:
- Код: Выделить всё • Развернуть
//******************************
void CalcCrc8 (unsigned char x)
{
CrcCalc ^= x;
x = 0;
if (CrcCalc & 0x01) x ^= 0x5e;
if (CrcCalc & 0x02) x ^= 0xbc;
if (CrcCalc & 0x04) x ^= 0x61;
if (CrcCalc & 0x08) x ^= 0xc2;
if (CrcCalc & 0x10) x ^= 0x9d;
if (CrcCalc & 0x20) x ^= 0x23;
if (CrcCalc & 0x40) x ^= 0x46;
if (CrcCalc & 0x80) x ^= 0x8c;
CrcCalc = x;
}
//******************************
На асм avr:
- Код: Выделить всё • Развернуть
CalcCrc8_temp1:
eor CrcCalc,temp1
clr temp1
ldi temp3,0x5e
sbrc CrcCalc,0
eor temp1,temp3
ldi temp3,0xbc
sbrc CrcCalc,1
eor temp1,temp3
ldi temp3,0x61
sbrc CrcCalc,2
eor temp1,temp3
ldi temp3,0xc2
sbrc CrcCalc,3
eor temp1,temp3
ldi temp3,0x9d
sbrc CrcCalc,4
eor temp1,temp3
ldi temp3,0x23
sbrc CrcCalc,5
eor temp1,temp3
ldi temp3,0x46
sbrc CrcCalc,6
eor temp1,temp3
ldi temp3,0x8c
sbrc CrcCalc,7
eor temp1,temp3
mov CrcCalc,temp1
ret
На асм pic:
- Код: Выделить всё • Развернуть
CalcCrc8_w
xorwf CrcCalc,f
movlw 0
btfsc CrcCalc,0
xorlw 0x5e
btfsc CrcCalc,1
xorlw 0xbc
btfsc CrcCalc,2
xorlw 0x61
btfsc CrcCalc,3
xorlw 0xc2
btfsc CrcCalc,4
xorlw 0x9d
btfsc CrcCalc,5
xorlw 0x23
btfsc CrcCalc,6
xorlw 0x46
btfsc CrcCalc,7
xorlw 0x8c
movwf CrcCalc
return
Ой, опять на pic код красивше avr
Считаем так для асм:
- Код: Выделить всё • Развернуть
clrf CrcCalc ;сбросить регистр crc
movf Buf1,w
call CalcCrc8_w
movf Buf1+1,w
call CalcCrc8_w
movf Buf1+2,w
call CalcCrc8_w
movf CrcCalc,w
xorwf Buf1+3,w
btfss STATUS,Z ;ошибка crc
goto a0_0 ;
;crc верен
Для сцы:
- Код: Выделить всё • Развернуть
CrcCalc = 0; //пересчитать CRC
CalcCrc8(RxBuffer[2]);
CalcCrc8(RxBuffer[3]);
CalcCrc8(RxBuffer[4]);
CalcCrc8(RxBuffer[5]);
CalcCrc8(RxBuffer[6]);
CalcCrc8(RxBuffer[7]);
CalcCrc8(RxBuffer[8]);
CalcCrc8(RxBuffer[9]);
CalcCrc8(RxBuffer[10]);
CalcCrc8(RxBuffer[11]);
CalcCrc8(RxBuffer[12]);
Таблица весов получается так:
- Код: Выделить всё • Развернуть
Возмите степени двойки: 1,2,4... и прогоните через пример от производителя -> получите таблицу весов разрядов.
;1=0x31
;2=0x62
;4=0xC4
;8=0xB9
;16=0x43
;32=0x86
;64=0x3D
;128=0x7A
По поиску в гугле "Возмите степени двойки: 1,2,4... и прогоните через пример", найдете источник...
и.т.д. и.т.п.
Aseris » 01 авг 2014, 18:19
А так не кошерно?, под любой полином и буфер, чесно слямзено в нете и допилено, когдато давно
- Код: Выделить всё • Развернуть
/*******************************************************************************
* Function CalcCrc8
*
* input - buffer pointer and length
* output - 8 bit CRC
*
* Polinomial X^8+X5+X^4+1 = 0x131, but use only 0x31,
* why see CRC explanation in web.
*
* NOTE: Lazy, not preformance optimal implementation
*******************************************************************************/
#define CRC8_POLYNOM 0x31
unsigned char CalcCrc8(unsigned char *pcBlock, unsigned long len)
{
unsigned char crc = 0xFF;
unsigned long i;
while (len--)
{
crc ^= *pcBlock++;
for (i = 0; i < 8; i++)
{
crc = crc & 0x80 ? (crc << 1) ^ CRC8_POLYNOM : crc << 1; /*test bit 7, if 1 do xor and shift, if 0 do only shift */
}
}
return crc;
}
Добавлено спустя 5 минут 41 секунду:Хотя из задачи ТС, я понял что он полином хочет найти из 2 последовательности, вобщем задача криво поставлена
Последний раз редактировалось
Aseris 01 авг 2014, 18:21, всего редактировалось 1 раз.
Dmitry__ » 01 авг 2014, 18:22
Aseris писал(а):А так не кошерно?
Кошерно, но очень долго.
Добавлено спустя 1 минуту 46 секунд:откомпили и посмотри какой будет быдлокод.
elmot » 01 авг 2014, 22:54
Dmitry__ писал(а):А мне другое интересно, эти аппаратные crc считают любой полином? Если нет, то аппаратный crc на фиг не нужен...
Подсчет crc - стандартная задача для контроллера, на все стандартные задачи не напасешься аппаратных перделок.
STM32F07x:
5.2 CRC main features
• Uses CRC-32 (Ethernet) polynomial: 0x4C11DB7
X32 + X26 + X23 + X22 + X16 + X12 + X11 + X10 +X8 + X7 + X5 + X4 + X2+ X +1
• Alternatively uses a fully programmable polynomial with programmable size (7, 8, 16,
32 bits) (STM32F07x devices only)
• Handles 8-,16-, 32-bit data size
• Programmable CRC initial value
• Single input/output 32-bit data register
• Input buffer to avoid bus stall during calculation
• CRC computation done in 4 AHB clock cycles (HCLK) for 32-bit data
Dmitry__ » 01 авг 2014, 23:28
Посмотрел RM0316, Cyclic redundancy check calculation unit (CRC)
А как же CRC-4-ITU, CRC-5-EPC, CRC-6-ITU, CRC-64-ISO, CRC-128, CRC-256 ???
Programmable polynomial size (7, 8, 16, 32 bit) - всего 4 размерности, ваще бред.
Нет в жизне щастя

Duhas » 02 авг 2014, 08:08
идеального МК на все случаи жизни не будет никогда, для каждого своя задача и свои требования.. и то что теперь для многих задач удобнее работать на тех же STM не говорит об ущербности AVR
elmot » 02 авг 2014, 08:38
причем тут ущербность? просто авры 8бит устарели уже очень давно. кста, я разговаривал с бывшим разработчиком авров. Он сказал, что год назад закрылся их R&D центр по восьмибитникам. только продаваны остались. т.е. новых 8бит авров уже не будет.
Madf » 02 авг 2014, 08:55
зачем нам новые, в той области в которой они используются - достаточно
да и китайцы ещё ой как долго будут на этом делать деньги
это всё называется - маркетинг или кто-то хочет денег (представляя нам новую продукцию)