Портал для радиолюбителей и разработчиков электроники · с 2003 годаРеклама на сайте
Найти компонент, схему или даташит

Даташиты, справочник отечественных приборов, схемы с разбором и живой форум

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

 
Опции темы

DS1990 и crc

Непрочитано 10.02.2009, 21:44  
sergio-nsk
Частый гость
 
Регистрация: 26.11.2008
Сообщений: 10
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
sergio-nsk на пути к лучшему
По умолчанию DS1990 и crc

Знаю, что возможно вопрос уже избитый и не раз уже обсуждался, но решение так и не нашел!
Имеем:
Код:
#include "stdio.h"


//unsigned char iB[8] = {0x02,0x1C,0xB8,0x01,0x00,0x00,0x00,0xA2};
//unsigned char iB[8] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
unsigned char iB[8] = {0x01,0x88,0x91,0x57,0xB0,0x00,0x00,0x11};
//unsigned char iB[8] = {0x01,0x3B,0xFA,0x57,0xB0,0x00,0x00,0x9С};

unsigned char crcds = 0;
unsigned char CRC = 0;

void UpdateCRC (unsigned char b)
{
    char i;
    for (i = 8; i › 0; i--)
    {
        if ((b ^ CRC) & 1) CRC = ((CRC ^ 0x18) ›› 1) | 0x80;
        else CRC ››= 1;
        b ››= 1;
    };
    printf("ALG1 = %hhu
",CRC);
}

void Crc8(unsigned char *pcBlock,unsigned char len)
{
    unsigned char crc = 0xFF;
    unsigned char i;
    while (len--)
        {
            crc ^= *pcBlock++;
            for (i = 0; i ‹ 8; i++)
            crc = crc & 0x80 ? (crc ‹‹ 1) ^ 0x31 : crc ‹‹ 1;
        }
    printf("ALG2 = %hhu
",crc);
}

void crc (char b)
{
    unsigned char tmp = 0;
    const char table[256] =
    {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};
    //tmp = crc ^ b;
    //printf("index: %hhu; ",tmp);
    crcds = table[ (crcds ^ b) ];
    printf("ALG3 = %hhu
",crcds);
}

int main()
{
    char i;
    for (i = 0; i ‹ 8; i++) {
        UpdateCRC(iB[i]);
        crc(iB[i]);
    };
    Crc8(iB,sizeof(iB));


    return 0;
}
для ключа, который в родном maxim-ic AN27 - все считается идеально(первый по списку), но вот для моих реальных ключей (2 нижних) никак не считается - табличный алгоритм взят из AN27, второй алгоритм(не считает ни для моих ключей, не для ключа из примера maxim) - из википедии, первый найден где-то в просторах иинета.
Вообщем помогите найти алкоритм, который считал бы сумму для моих ключей!
Реклама:
sergio-nsk вне форума  
Непрочитано 11.02.2009, 01:09  
urry
Почётный гражданин KAZUS.RUN
 
Аватар для urry
 
Регистрация: 06.02.2007
Сообщений: 1,340
Сказал спасибо: 3
Сказали Спасибо 107 раз(а) в 66 сообщении(ях)
urry на пути к лучшему
По умолчанию

А сумма известна ? Ваших ключей ? Я в том смысле, что можно вычислить полином, если известно, что должно получиться.
__________________
warez
urry вне форума  
Непрочитано 11.02.2009, 07:24  
sergio-nsk
Частый гость
 
Регистрация: 26.11.2008
Сообщений: 10
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
sergio-nsk на пути к лучшему
По умолчанию

Естественно известна. Для этих ключей CRC - последняя цифра (0x11 и 0x9C соответственно). При правильном подсчете вместе с последней цифрой я в итоге должен получить 0, а при подсчете без последней цифры я соответственно должен получить последнюю!
sergio-nsk вне форума  
Непрочитано 11.02.2009, 09:29  
urry
Почётный гражданин KAZUS.RUN
 
Аватар для urry
 
Регистрация: 06.02.2007
Сообщений: 1,340
Сказал спасибо: 3
Сказали Спасибо 107 раз(а) в 66 сообщении(ях)
urry на пути к лучшему
По умолчанию

Не понял... Сумма снимается для 8 байт и должен представлять собой 9. Или у Вас - для 7 ???
Код:
unsigned char iB1[8] = {0x01,0x88,0x91,0x57,0xB0,0x00,0x00,0x11};
//-----------------------
unsigned char calc_crc (unsigned char *mas,unsigned char polinom)
{
unsigned char i,data,crc,fb,st_byt;
st_byt=0;
crc=0;
	do{
data=mas[st_byt];
     for (i=0;i‹8;i++)// счетчик битов в байте
        	{
       		fb =crc  ^ data;
      		fb&=1;
        	crc ››= 1;     
        	data ››=1;
      		if (fb == 1)crc^=polinom;// полином, мля
      		}
	st_byt++;
	}while  (st_byt != 8);// счетчик байтов в массиве
return crc;
}
//------------------
for (as=1;as‹255;as++)// перебираем полином
{
	if (calc_crc (iB1,as)==ХХ)// здесь неизвестно, с чем сравнивать

	{
__________________
warez
urry вне форума  
Непрочитано 11.02.2009, 09:43  
sergio-nsk
Частый гость
 
Регистрация: 26.11.2008
Сообщений: 10
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
sergio-nsk на пути к лучшему
По умолчанию

0x01,0x3B,0xFA,0x57,0xB0,0x00,0x00,0x9С - это код, который считывается с ключа (и написан на нем же лазерной гравировкой). 1-й байт - это серия ключа (0х01 = DS1990, 0х02 = DS1992 итд). Последний 0x9C - это контрольная сумма, которая должна получаться из 0x01,0x3B,0xFA,0x57,0xB0,0x00,0x00. Если мы посчитаем контрольную сумму для последовательности 0x01,0x3B,0xFA,0x57,0xB0,0x00,0x00,0x9С - должен получиться 0! Т.е. для последовательности 0x01,0x3B,0xFA,0x57,0xB0,0x00,0x00 должно получиться 0x9С. С ключем, который представлен в Application Notes 27 с сайта maxim-ic.com (теперяшний производитель таблеток) 0x02,0x1C,0xB8,0x01,0x00,0x00,0x00,0xA2 все так и получается, а с теми ключами которые у меня есть - официальный алгоритм не работает.
sergio-nsk вне форума  
Непрочитано 11.02.2009, 10:46  
urry
Почётный гражданин KAZUS.RUN
 
Аватар для urry
 
Регистрация: 06.02.2007
Сообщений: 1,340
Сказал спасибо: 3
Сказали Спасибо 107 раз(а) в 66 сообщении(ях)
urry на пути к лучшему
По умолчанию

Ради интереса кинул у себя - поиск полинома.
Тот, что у Вас получилось - показал стандартный далласовский полином - 8С - вернее, выпало 3 числа
8c B5 C2
Второй вариант, заканчивающийся на 11 - выпало тоже 3 числа
13 34 5D
Третий вариант - оканчивающийся на 9С - ни одного совпадения .
Баловство, конечно, все далласовские приборы снимаются по одной и той же схеме.
Проверьте правильность считывания.
__________________
warez
urry вне форума  
Непрочитано 11.02.2009, 10:54  
sergio-nsk
Частый гость
 
Регистрация: 26.11.2008
Сообщений: 10
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
sergio-nsk на пути к лучшему
По умолчанию

Все бы ничего, можно было бы грешить на правильность считывания, но вот своим глазам я верю: гравировка на корпусе совпадает со считанным значением! Неужели у меня какая - то подделка? (внешне ничем не отличаются от тех, что на картинке в даташите у dallas!) 8O
sergio-nsk вне форума  
Непрочитано 11.02.2009, 12:34  
urry
Почётный гражданин KAZUS.RUN
 
Аватар для urry
 
Регистрация: 06.02.2007
Сообщений: 1,340
Сказал спасибо: 3
Сказали Спасибо 107 раз(а) в 66 сообщении(ях)
urry на пути к лучшему
По умолчанию

дело скорее всего в том, что на корпусе указана сумма для сrс16 а не 8
__________________
warez
urry вне форума  
Непрочитано 11.02.2009, 13:32  
nictrace
Временная регистрация
 
Регистрация: 10.02.2009
Сообщений: 74
Сказал спасибо: 5
Сказали Спасибо 5 раз(а) в 5 сообщении(ях)
nictrace на пути к лучшему
По умолчанию

Код:
      ldi   temp,0x8C      ; полином
      ldi   bitcnt,8
      eor   crc,my_byte
loc2: lsr   crc         ; left shift
      brcc  loc3
      eor   crc,temp
loc3: dec   bitcnt
      brne  loc2
Делов-то!
При чтении бывает ненадежный контакт, в секунду ключ считывается около 10 раз, и если CRC не сошлась - результат игнорируется

UPD: прогнал, тот у которого CRC8, якобы, 11h, выдает ЕЕh, а тот у которого 9Сh - в действительности D1h
nictrace вне форума  
Непрочитано 11.02.2009, 13:54  
sanitar249
Почётный гражданин KAZUS.RUN
 
Аватар для sanitar249
 
Регистрация: 19.01.2007
Сообщений: 1,745
Сказал спасибо: 2
Сказали Спасибо 46 раз(а) в 35 сообщении(ях)
sanitar249 на пути к лучшему
По умолчанию

Сообщение от urry
дело скорее всего в том, что на корпусе указана сумма для сrс16 а не 8
8O А разве такое могет быть? спецификация на 01-семейство: там дб CRC8. Она получаеться 8B для 0x01,0x3B,0xFA,0x57,0xB0,0x00,0x00. Может выгравировали не правильно?
Удачи!
__________________
Я, думаю, нужно подумать...
sanitar249 вне форума  
 
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите найт алгоритм вычисления CRC для iButton... IgorSHV Цифровые сигнальные процессоры 19 18.01.2012 21:55
вычисление CRC qaz12345qaz12345 Микроконтроллеры, АЦП, память и т.д 32 23.08.2010 23:55
Помогите портировать имитатор DS1990 crafty73 Микроконтроллеры, АЦП, память и т.д 6 13.05.2008 04:57
CRC для "чайников" и не "чайников". zelen536 Микроконтроллеры, АЦП, память и т.д 1 09.03.2008 16:49
Температурный сбой 16F84 и DS1990 mikk Микроконтроллеры, АЦП, память и т.д 1 03.07.2006 11:37


Часовой пояс GMT +4, время: 13:08.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.