Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту

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

Закрытая тема
Опции темы
Непрочитано 10.02.2009, 21:44   #1
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   #2
urry
Почётный гражданин KAZUS.RU
 
Аватар для urry
 
Регистрация: 06.02.2007
Сообщений: 1,340
Сказал спасибо: 3
Сказали Спасибо 106 раз(а) в 66 сообщении(ях)
urry на пути к лучшему
По умолчанию

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

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

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

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

дело скорее всего в том, что на корпусе указана сумма для сrс16 а не 8
__________________
warez
urry вне форума  
Непрочитано 11.02.2009, 13:32   #9
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   #10
sanitar249
Почётный гражданин KAZUS.RU
 
Аватар для sanitar249
 
Регистрация: 19.01.2007
Сообщений: 1,747
Сказал спасибо: 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:01.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot