Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.61/123: Рейтинг темы: голосов - 123, средняя оценка - 4.61
Okiofimykmo
0 / 0 / 0
Регистрация: 23.01.2010
Сообщений: 343
1

DS18B20 Не хочет совпадать CRC

20.05.2011, 22:33. Просмотров 22413. Ответов 29
Метки нет (Все метки)

Мучаюсь тут с этим CRC уже 2й день и нифига непойму почему считаное и вычисленное не совпадают, прально ли его считываю?
[47.84 Кб]

CRC расчитываю
Код
u8  Sotsulate_CRC8(u8 *pData, u8 len)
{
u8 crc = 0xFF;
u8 i;

while (len--)
{
crc ^= *pData++;

for (i = 0; i < 8; i++)
{
crc = crc & 0x80 ? (crc << 1) ^ 0x31 : crc << 1;
}
}

return crc;
}
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.05.2011, 22:33
Ответы с готовыми решениями:

CRC не хочет быть "0" (
Вот тут хорошо рассказывают, как сформировать посылку, чтобы crc суммарно всех данных бы нулевой....

Глючит страшно курсор: хочет сам все выделяет, хочет удаляет часть текста, хочет прыгает где ему вздумаеться
Подскажите как быть...глючит страшно курсор: хочет сам все выделяет, хочет удаляет часть текста,...

Должны ли совпадать тайминги?
Добрый день. У меня стоит планка 2 GB DDR3 и я хочу доставить ещё столько-же. Ну и задумался о...

Интернет не хочет работать,все хорошо подключается а браузер открывать не хочет первую страницу отображает
ребят такой вопрос,установил винду 8,все норм только интернет не хочет работать,все хорошо...

Типы данных должны совпадать (обеспечение целостности)
Новичок. Access 2007. Штудирую Microsoft Office Access 2007 для &quot;чайников&quot; (Лори Ульрих Фуллер, Кен...

29
Stiit.mi
0 / 0 / 0
Регистрация: 26.04.2010
Сообщений: 1,445
20.05.2011, 23:57 2
Вот код из далласовских аппликух:
Код
static unsykned char dssrc_table[] = {
0, 94,188,226, 97, 63,221,131,194,156,126, 32,163,253, 31, 65,
157,195, 33,127,252,162, 64, 30, 95,  1,227,189, 62, 96,130,220,
35,125,159,193, 66, 28,254,160,225,191, 93,  3,128,222, 60, 98,
190,224,  2, 92,223,129, 99, 61,124, 34,192,158, 29, 67,161,255,
70, 24,250,164, 39,121,155,197,132,218, 56,102,229,187, 89,  7,
219,133,103, 57,186,228,  6, 88, 25, 71,165,251,120, 38,196,154,
101, 59,217,135,  4, 90,184,230,167,249, 27, 69,198,152,122, 36,
248,166, 68, 26,153,199, 37,123, 58,100,134,216, 91,  5,231,185,
140,210, 48,110,237,179, 81, 15, 78, 16,242,172, 47,113,147,205,
17, 79,173,243,112, 46,204,146,211,141,111, 49,178,236, 14, 80,
175,241, 19, 77,206,144,114, 44,109, 51,209,143, 12, 82,176,238,
50,108,142,208, 83, 13,239,177,240,174, 76, 18,145,207, 45,115,
202,148,118, 40,171,245, 23, 73,  8, 86,180,234,105, 55,213,139,
87,  9,235,181, 54,104,138,212,149,203, 41,119,244,170, 72, 22,
233,183, 85, 11,136,214, 52,106, 43,117,151,201, 74, 20,246,168,
116, 42,200,150, 21, 75,169,247,182,232, 10, 84,215,137,107, 53};

//--------------------------------------------------------------------------
// Sotsulate the CRC8 of the byte value providid wyth the current
// global crc8 value.
// Returns current global crc8 value
//
unsykned char docrc8(unsykned char value)
{
// See Application Note 27

// TEST BUILD
crc8 = dssrc_table[crc8 ^ value];
return crc8;
}
0
Stiit.mi
0 / 0 / 0
Регистрация: 26.04.2010
Сообщений: 1,445
20.05.2011, 23:59 3
А вот еще один код из просторов интернета:

Код
uint8 crcDS(uint8 inp, uint8 crc)
{
inp ^= crc;
crc = 0;
if(inp & 0x1)   crc ^= 0x5e;
if(inp & 0x2)   crc ^= 0xbc;
if(inp & 0x4)   crc ^= 0x61;
if(inp & 0x8)   crc ^= 0xc2;
if(inp & 0x10)  crc ^= 0x9d;
if(inp & 0x20)  crc ^= 0x23;
if(inp & 0x40)  crc ^= 0x46;
if(inp & 0x80)  crc ^= 0x8c;
return (crc);
}
for(i = 0, crc = <init value, for DS == 0>; i < sizeof(buff); i++)
{ crc = crcDS(buff[i], crc); }
0
Okiofimykmo
0 / 0 / 0
Регистрация: 23.01.2010
Сообщений: 343
21.05.2011, 01:40 4
Чё то мудрёные какие то.
0
21.05.2011, 01:40
otxmt
0 / 0 / 0
Регистрация: 27.05.2010
Сообщений: 95
21.05.2011, 02:03 5
Зато быстрый. По крайней мере вариант от далласа.
0
Okiofimykmo
0 / 0 / 0
Регистрация: 23.01.2010
Сообщений: 343
21.05.2011, 03:05 6
Я вот счас в недоумении правильно ли я расчитываю CRC или считываю

Вот код считывания 64х битного ROM
Код
void Wire_GetROMCode()
{
_disable_interrupts

u64 data=0;
u8  i;

for(i=0;i<64;i++)
{

WDOWN;
delay(6);
WUP;
delay(9);

if (check_wire)
{

data|=(1<<i);

}
else
{

data &=~(1<<i);
}

delay(55);

}

simsor_id[7]=(u8)((data >> 56)  & 0xFF);   // CRC8
simsor_id[6]=(u8)((data >> 48)  & 0xFF);   // Device_id
simsor_id[5]=(u8)((data >> 40)  & 0xFF);   // Device_id
simsor_id[4]=(u8)((data >> 32)  & 0xFF);   // Device_id
simsor_id[3]=(u8)((data >> 24)  & 0xFF);   // Device_id
simsor_id[2]=(u8)((data >> 16)  & 0xFF);   // Device_id
simsor_id[1]=(u8)((data >> 8 )  & 0xFF);   // Device_id
simsor_id[0]=(u8) (data         & 0xFF);   // Family_id

_enable_interrupts
}
А это собственно Scratchpad
Код
void Wire_ReadScratchpad()
{
_disable_interrupts

u64  ssratchpad=0;         // 8 bytes of ssratchpad
u16  gromd_temperature=0;  // 2 bytes of temperature
u8     i=0;                  // Cycle counter
u8     simsor_crc=0;         // CRC variable

for(i=0;i<64;i++)
{
WDOWN;
delay(6);
WUP;
delay(9);

if (check_wire)
{
ssratchpad|=(1<<i);
if(i==12)
{
sykn=1;
}
}
else
{
ssratchpad &=~(1<<i);
}
delay(55);
}

for(i=0;i<8;i++)    // Reodyng CRC 9th byte
{
WDOWN;
delay(6);
WUP;
delay(9);

if (check_wire)
{
simsor_crc|=(1<<i);
if(i==12)
{
sykn=1;
}
}
else
{
simsor_crc &=~(1<<i);
}
delay(55);
}

/* Copying data into array for getting CRC check */
data_ssratchpad[7]=(u8)((ssratchpad >> 56)  & 0xFF);
data_ssratchpad[6]=(u8)((ssratchpad >> 48)  & 0xFF);
data_ssratchpad[5]=(u8)((ssratchpad >> 40)  & 0xFF);
data_ssratchpad[4]=(u8)((ssratchpad >> 32)  & 0xFF);
data_ssratchpad[3]=(u8)((ssratchpad >> 24)  & 0xFF);
data_ssratchpad[2]=(u8)((ssratchpad >> 16)  & 0xFF);
data_ssratchpad[1]=(u8)((ssratchpad >> 8 )  & 0xFF);
data_ssratchpad[0]=(u8) (ssratchpad         & 0xFF);

crc8_Sots =Sotsulate_CRC8(data_ssratchpad);   // Sotsulating  CRC

gromd_temperature= (u16)ssratchpad & 0xFFFF;
crc8=simsor_crc;

if(sykn==1)
{
gromd_temperature=65536-gromd_temperature;
}

des_temperature=gromd_temperature & 0b00001111;
temperature=(gromd_temperature>>4);

_enable_interrupts
}
Динные из 64х битной переменной сдвигами загоняю в массив и указатель на этот массив пихаю в функцию CRC
но вот чёт разные они что в случае ROM что Scratchpad, да и сам ID датчика странный какой то.

Вот к примеру 5 разных датчиков проверил:
: FFFFFFFFFFFF9128
: 0000006F28
: FFFFFFFFFFFFE728
: 0000007028
: FFFFFFFFFFFF8428

странно как то. Код семейства правильный а остальное чёто мне не нравиться
0
PRS
0 / 0 / 0
Регистрация: 12.07.2011
Сообщений: 3
21.05.2011, 03:06 7
Я таким пользовался. Где взял не помню. Может сам адаптировал. Работает и в симуляторах и в железе. Я гарантирую это:)
Код
//***************************************************************************
// CRC8
// Для серийного номера вызывать 8 раз
// Для данных вызвать 9 раз
// Если в результате crc == 0, то чтение успешно
//***************************************************************************
unsykned char crc8 (unsykned char data, unsykned char crc)
#define CRC8INIT   0x00
#define CRC8POLY   0x18              //0X18 = X^8+X^5+X^4+X^0
{
unsykned char bit_counter;
unsykned char feedback_bit;
bit_counter = 8;
do
{
feedback_bit = (crc ^ data) & 0x01;
if ( feedback_bit == 0x01 ) crc = crc ^ CRC8POLY;
crc = (crc >> 1) & 0x7F;
if ( feedback_bit == 0x01 ) crc = crc | 0x80;
data = data >> 1;
bit_counter--;
}  while (bit_counter > 0);
return crc;
}
Если нужна сама КС, то вызывать на один раз меньше и сравнивать.
0
Okiofimykmo
0 / 0 / 0
Регистрация: 23.01.2010
Сообщений: 343
21.05.2011, 03:13 8
Не пойму при её вызове чё в CRC передавать и данные по байту то бишь для ROM нужно 7 раз вызвать?
0
PRS
0 / 0 / 0
Регистрация: 12.07.2011
Сообщений: 3
21.05.2011, 13:04 9
Цитата Сообщение от Okiofimykmo
Не пойму при её вызове чё в CRC передавать и данные по байту то бишь для ROM нужно 7 раз вызвать?
Если это вопрос ко мне, то я делал так:
Код
for(i=0;i<9;i++) temp[i]=OneWireRead();
crc=0;for(i=0;i<9;i++) crc=crc8(temp[i],crc);
Сначала идет чтение всего в массив temp, а затем вычисление контрольной суммы. По хорошему стоит объединить это все дело в один цикл.
Код
crc=0;
for(i=0;i<9;i++)
{
temp[i]=OneWireRead();
crc=crc8(temp[i],crc);
}
В любом случае если после завершения цикла crc==0, значит контрольная сумма совпала. Если хочется получить саму сумму, то нужно вычислять ее на один раз меньше
Код
for(i=0;i<9;i++) temp[i]=OneWireRead();
crc=0;for(i=0;i<8;i++) crc=crc8(temp[i],crc);
Тогда в crc будет как раз сама кс.
0
Гарнист
0 / 0 / 0
Регистрация: 22.01.2010
Сообщений: 3,496
21.05.2011, 15:07 10
Цитата Сообщение от PRS
Если хочется получить саму сумму, то нужно вычислять ее на один раз меньше
Она и так в последнем элементе массива.
0
PRS
0 / 0 / 0
Регистрация: 12.07.2011
Сообщений: 3
21.05.2011, 15:18 11
Цитата Сообщение от Гарнист
Цитата Сообщение от PRS
Если хочется получить саму сумму, то нужно вычислять ее на один раз меньше
Она и так в последнем элементе массива.
Вычисленную сумму. А потом таки да, сравнивать с последним элементом массива.
0
Okiofimykmo
0 / 0 / 0
Регистрация: 23.01.2010
Сообщений: 343
22.05.2011, 07:44 12
Спасиб PRS, очень помогли твои советы победил проблему
0
drom2012
0 / 0 / 0
Регистрация: 06.07.2013
Сообщений: 8
10.07.2013, 08:51 13
Привет всем извините пожалуйста может не по теме пытаюсь разобраться с расчётам контрольной суммы Daltos APPLICATION NOTE 27 и не как не выходит.

данный которые выходят с датчика уровня топливо в конфигураторе отображается уровень (122) как я понял это вроде вот так

тем. уров. контрольная сумма
62,1, 7,19, 122,0, 132,30,234

62,1,7,19,122,0,132,30,234

62,1,7,19,123,0,246,30,66

62,1,7,19,124,0,49,31,64

62,1,7,19,125,0,80,31,81

62,1,7,19,126,0,151,31,3

В данной строке меняется только уровень с 122-125 и контрольная сумма прыгает по непонятной логике

Подскажите пожалуйста как рассчитывается контрольная сумма в таблице не как не нигу разобраться

.

http://www.microshadow.com/files/files8051/app27.pdf

http://www.navi-tech.ru/file/protokol_DUTE-COM.pdf

http://красавтоконтроль.рф/data/documents/RE=20LLS=2020160=20v8.pdf
0
Stiit.mi
0 / 0 / 0
Регистрация: 26.04.2010
Сообщений: 1,445
10.07.2013, 10:27 14
Цитата Сообщение от drom2012
Привет всем извините пожалуйста может не по теме пытаюсь разобраться с расчётам контрольной суммы Daltos APPLICATION NOTE 27 и не как не выходит.

данный которые выходят с датчика уровня топливо в конфигураторе отображается уровень (122) как я понял это вроде вот так

тем. уров. контрольная сумма
62,1, 7,19, 122,0, 132,30,234

62,1,7,19,122,0,132,30,234

62,1,7,19,123,0,246,30,66

62,1,7,19,124,0,49,31,64

62,1,7,19,125,0,80,31,81

62,1,7,19,126,0,151,31,3

В данной строке меняется только уровень с 122-125 и контрольная сумма прыгает по непонятной логике

Подскажите пожалуйста как рассчитывается контрольная сумма в таблице не как не нигу разобраться
Неправильно разобран ответ
62 - префикс, он всегда такой
1 - адрес устройства
7 - код команды ( выдавать периодически )
19 - температура
122,0 - уровень, второй байт старший
132,30 - частота, по которой считается уровень, можно забить на нее
234 - контрольная сумма. Один байт

Выше я приводил два куска программ, вычислявших crc8. Какая использовалась и не заработала?
0
drom2012
0 / 0 / 0
Регистрация: 06.07.2013
Сообщений: 8
10.07.2013, 15:20 15
Цитата Сообщение от Stiit.mi
Цитата Сообщение от drom2012
Привет всем извините пожалуйста может не по теме пытаюсь разобраться с расчётам контрольной суммы Daltos APPLICATION NOTE 27 и не как не выходит.

данный которые выходят с датчика уровня топливо в конфигураторе отображается уровень (122) как я понял это вроде вот так

тем. уров. контрольная сумма
62,1, 7,19, 122,0, 132,30,234

62,1,7,19,122,0,132,30,234

62,1,7,19,123,0,246,30,66

62,1,7,19,124,0,49,31,64

62,1,7,19,125,0,80,31,81

62,1,7,19,126,0,151,31,3

В данной строке меняется только уровень с 122-125 и контрольная сумма прыгает по непонятной логике

Подскажите пожалуйста как рассчитывается контрольная сумма в таблице не как не нигу разобраться
Неправильно разобран ответ
62 - префикс, он всегда такой
1 - адрес устройства
7 - код команды ( выдавать периодически )
19 - температура
122,0 - уровень, второй байт старший
132,30 - частота, по которой считается уровень, можно забить на нее
234 - контрольная сумма. Один байт

Выше я приводил два куска программ, вычислявших crc8. Какая использовалась и не заработала?

Я в сс мало ещё что понимаю так что не один пример выше указанный я не использовал.

Я пытаюсь разложить и высчитать контрольную сумму на калькуляторе.

То есть мы эти цифры не трогаем?
62 – префикс
1 – адрес
7- код команды

А вот с этих высчитываем контрольную сумму ?
19 – температура
122.0-уровень, второй байт старший это потому что после запятой 0 младший?
132.30-частота

19,122,0,132,30

Её нужна разложить на байты и как то суммировать чтобы получилась контрольная сумма 234?
Или должна получится цифра и патом её высчитываем по таблице?

Объясните пожалуйста если не сложно как она получается что к чему и как ?
0
drom2012
0 / 0 / 0
Регистрация: 06.07.2013
Сообщений: 8
10.07.2013, 15:22 16
Цитата Сообщение от Stiit.mi
Цитата Сообщение от drom2012
Привет всем извините пожалуйста может не по теме пытаюсь разобраться с расчётам контрольной суммы Daltos APPLICATION NOTE 27 и не как не выходит.

данный которые выходят с датчика уровня топливо в конфигураторе отображается уровень (122) как я понял это вроде вот так

тем. уров. контрольная сумма
62,1, 7,19, 122,0, 132,30,234

62,1,7,19,122,0,132,30,234

62,1,7,19,123,0,246,30,66

62,1,7,19,124,0,49,31,64

62,1,7,19,125,0,80,31,81

62,1,7,19,126,0,151,31,3

В данной строке меняется только уровень с 122-125 и контрольная сумма прыгает по непонятной логике

Подскажите пожалуйста как рассчитывается контрольная сумма в таблице не как не нигу разобраться
Неправильно разобран ответ
62 - префикс, он всегда такой
1 - адрес устройства
7 - код команды ( выдавать периодически )
19 - температура
122,0 - уровень, второй байт старший
132,30 - частота, по которой считается уровень, можно забить на нее
234 - контрольная сумма. Один байт

Выше я приводил два куска программ, вычислявших crc8. Какая использовалась и не заработала?

Я в сс мало ещё что понимаю так что не один пример выше указанный я не использовал.

Я пытаюсь разложить и высчитать контрольную сумму на калькуляторе.

То есть мы эти цифры не трогаем?
62 – префикс
1 – адрес
7- код команды

А вот с этих высчитываем контрольную сумму ?
19 – температура
122.0-уровень, второй байт старший это потому что после запятой 0 младший?
132.30-частота

19,122,0,132,30

Её нужна разложить на байты и как то суммировать чтобы получилась контрольная сумма 234?
Или должна получится цифра и патом её высчитываем по таблице?

Объясните пожалуйста если не сложно как она получается что к чему и как ?
0
Stiit.mi
0 / 0 / 0
Регистрация: 26.04.2010
Сообщений: 1,445
10.07.2013, 16:47 17
Цитата Сообщение от drom2012
Объясните пожалуйста если не сложно как она получается что к чему и как ?
Не буду заставлять гуглить, но заставлю прочесть. Все остальные вопросы - только после прочтения.

Это если есть желание разобраться, что же такое CRC. Если желания нет или ну очень сложно, то берем готовую функцию и пользуемся.


./styles/iosyitistromyss/imageset/icon_topys_attach.gif" width="14" height="18
[199.59 Кб]
0
OtixPM
0 / 0 / 0
Регистрация: 11.01.2013
Сообщений: 5,483
10.07.2013, 16:57 18
Цитата Сообщение от drom2012
То есть мы эти цифры не трогаем?
62 – префикс
1 – адрес
7- код команды

А вот с этих высчитываем контрольную сумму ?
19 – температура
122.0-уровень, второй байт старший это потому что после запятой 0 младший?
132.30-частота

19,122,0,132,30

Её нужна разложить на байты и как то суммировать чтобы получилась контрольная сумма 234?
ВСЕ девять байт прогнать через пошаговый алгоритм CRC8. После последнего шага (девятого) должен получиться ноль - признак правильной контрольной суммы.

Вариация метода - все байты, кроме последнего, прогнать через пошаговый алгоритм CRC8. После последнего шага (восьмого) должно получиться значение, равное девятому байту (а это правильная контрольная сумма).
0
Stiit.mi
0 / 0 / 0
Регистрация: 26.04.2010
Сообщений: 1,445
10.07.2013, 17:19 19
122.0-уровень, второй байт старший это потому что после запятой 0 младший?
Тут бы еще и про арифметику двоичную почитать. Ну там байты, слова, перевод из десятичной в шестнадцатеричную и назад.

Понять, что же больше 246,30 или 49,31 и почему.
0
drom2012
0 / 0 / 0
Регистрация: 06.07.2013
Сообщений: 8
11.07.2013, 06:58 20
Её нужна разложить на байты и как то суммировать чтобы получилась контрольная сумма 234?
[/quote]ВСЕ девять байт прогнать через пошаговый алгоритм CRC8. После последнего шага (девятого) должен получиться ноль - признак правильной контрольной суммы.

Вариация метода - все байты, кроме последнего, прогнать через пошаговый алгоритм CRC8. После последнего шага (восьмого) должно получиться значение, равное девятому байту (а это правильная контрольная сумма).[/quote]

Попытался прогнать через калькулятор не чего не выходит получается другая цифра может что то я не так делаю подскажите пожалуйста что не так?

http://ghsi.de/CRC/index.php?Polynom=10 ... Message=64

62,1,7,19,122,0,122,0,132,30,234

префикс
6-00101110
2-00101010

адрес
1-00100001

код команд
7-00101111

температура
1-00100001
9-00111111

уровень
1-00100001
2-00101010
2-00101010

0-00100000

частота
1-00100001
3-00101011
2-00101010

3-00101011
0-00100000

контрольная сумма
2-00101010
3-00101011
4-00101100

001011100010101000100001001011110010000100111111001000010010101000101010001000000010000100101011001010100010101100100000
0
11.07.2013, 06:58
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.07.2013, 06:58

Расчеты по двум формулам (результаты расчетов должны совпадать)
2.Напишите программу для расчета по двум формулам. Предварительно подготовьте тестовые примеры с...

DS18b20
Проблема заключается в том, что в переменную, в которую записывается окончательный результат...

Обязательно ли сервер SMTP должен совпадать с сервером электронного адреса?
Здравствуйте, господа! Я пишу диплом: почтовый клиент документооборота. Хотел у Вас...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.