реклама на сайте
подробности

 
 
> DS18B20 вычисление CRC как это сделать?!, Почитал и даташит и апноты, там что то сказано, но не понял я.
eXeC001er
сообщение Jan 24 2006, 07:02
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 305
Регистрация: 23-02-05
Из: Краснодар
Пользователь №: 2 848



Можно подробнее, а если еще и примерчик что вабще гуд.
Go to the top of the page
 
+Quote Post
4 страниц V   1 2 3 > »   
Start new topic
Ответов (1 - 57)
at90
сообщение Jan 24 2006, 07:09
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 866
Регистрация: 31-03-05
Из: Краснодар
Пользователь №: 3 814



для кодевижена. Использовалась для ds1990
#pragma warn-
unsigned char crc8(void *p,unsigned char n)
{
#asm
clr r30
ld r24,y
tst r24
breq __crc83
ldi r22,0x18
ldd r26,y+1
ldd r27,y+2
__crc80:
ldi r25,8
ld r31,x+
__crc81:
mov r23,r31
eor r23,r30
ror r23
brcc __crc82
eor r30,r22
__crc82:
ror r30
lsr r31
dec r25
brne __crc81
dec r24
brne __crc80
__crc83:
#endasm
}
#pragma warn+


--------------------
<<Первая производная от чужой идеи - уже твоя идея.>>
Go to the top of the page
 
+Quote Post
m16
сообщение Jan 24 2006, 07:33
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 242
Регистрация: 27-01-05
Пользователь №: 2 225



у меня есть рабочий пример на асме авр. вышлю на мыло к сообщению не прикрепляется-Ошибка загрузки
Go to the top of the page
 
+Quote Post
eXeC001er
сообщение Jan 24 2006, 07:40
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 305
Регистрация: 23-02-05
Из: Краснодар
Пользователь №: 2 848



Еще я не особенно врыбуюсь для каких байт считать этот CRC, там есть ROM и есть ScratchPad и там и там CRC, видать для каждого свой.
В апнотах от maxim-ic есть пример подсчета но там какой то табличный способ, как его использовать не пойму!
Go to the top of the page
 
+Quote Post
GxOST
сообщение Jan 24 2006, 07:42
Сообщение #5


Участник
*

Группа: Свой
Сообщений: 58
Регистрация: 6-12-05
Из: Санкт-Петербург
Пользователь №: 11 878



Цитата(eXeC001er @ Jan 24 2006, 10:02) *
Можно подробнее, а если еще и примерчик что вабще гуд.

Отличная штука для понимания идеи
А вообще понимать не обязательно, берешь исходники и вперед.


--------------------
cul8r!
* #ru_embedded - эмбеддерский чат
Go to the top of the page
 
+Quote Post
eXeC001er
сообщение Jan 24 2006, 07:58
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 305
Регистрация: 23-02-05
Из: Краснодар
Пользователь №: 2 848



эт не то, я не разберусь в этих языках.
Go to the top of the page
 
+Quote Post
MicronSys
сообщение Jan 24 2006, 08:11
Сообщение #7


Частый гость
**

Группа: Участник
Сообщений: 106
Регистрация: 12-05-05
Пользователь №: 4 946



unsigned char one_wire_byte[9]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
IB_CRC=iButtonCRC(one_wire_byte);



unsigned char iButtonCRC( unsigned char *code)
{
unsigned char j, i, Data, tmp, CRC = 0;
for (j = 0; j < 7; j++)
{
Data = code[j];
for (i = 0; i < 8; i++)
{
tmp = 1 & (Data ^ CRC);
CRC >>= 1;
Data >>= 1;
if ( 0 != tmp ) CRC ^= 0x8c;
}
}
return CRC;
}

Простинко и совкусом 101% рабочая
cheers.gif
Go to the top of the page
 
+Quote Post
GxOST
сообщение Jan 24 2006, 09:08
Сообщение #8


Участник
*

Группа: Свой
Сообщений: 58
Регистрация: 6-12-05
Из: Санкт-Петербург
Пользователь №: 11 878



Цитата(eXeC001er @ Jan 24 2006, 10:58) *
Цитата(GxOST @ Jan 24 2006, 10:42) *

Цитата(eXeC001er @ Jan 24 2006, 10:02) *

Можно подробнее, а если еще и примерчик что вабще гуд.

Отличная штука для понимания идеи
А вообще понимать не обязательно, берешь исходники и вперед.

эт не то, я не разберусь в этих языках.

да чего ж там понимать! Всё как на це. Вот пример формирования crc в соответствии со сгенеренным верилогом (табличный)


--------------------
cul8r!
* #ru_embedded - эмбеддерский чат
Go to the top of the page
 
+Quote Post
MicronSys
сообщение Jan 24 2006, 09:18
Сообщение #9


Частый гость
**

Группа: Участник
Сообщений: 106
Регистрация: 12-05-05
Пользователь №: 4 946



Цитата(GxOST @ Jan 24 2006, 13:08) *
Цитата(eXeC001er @ Jan 24 2006, 10:58) *

Цитата(GxOST @ Jan 24 2006, 10:42) *

Цитата(eXeC001er @ Jan 24 2006, 10:02) *

Можно подробнее, а если еще и примерчик что вабще гуд.

Отличная штука для понимания идеи
А вообще понимать не обязательно, берешь исходники и вперед.

эт не то, я не разберусь в этих языках.

да чего ж там понимать! Всё как на це. Вот пример формирования crc в соответствии со сгенеренным верилогом (табличный)


Не таблица енто отстой ПАМЯТЬ НЕ РЕЗИНОВАЯ !!! blink.gif
Если делать в тинька то лишние байты ох как нужны !!!!! a14.gif
Go to the top of the page
 
+Quote Post
haker_fox
сообщение Jan 24 2006, 09:19
Сообщение #10


Познающий...
******

Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125



В прикрепленной теме есть табличная реализация CRC8, а поиском по подфоруму можете найти и полный исходник для DS18B20...


--------------------
Выбор.
Go to the top of the page
 
+Quote Post
MicronSys
сообщение Jan 24 2006, 09:27
Сообщение #11


Частый гость
**

Группа: Участник
Сообщений: 106
Регистрация: 12-05-05
Пользователь №: 4 946



Вот полный текст для работы с DS1990A

#define ONEWIRE 0x08 // BIT Какой пин использовать
#define ONEPIN (*(volatile unsigned char *)0x30) // PIN register
#define ONEDDR (*(volatile unsigned char *)0x31) // Data Direction Register
#define ONEPORT (*(volatile unsigned char *)0x32) // PORT

unsigned char one_wire_byte[9]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
void OneWireReadROM(void);
unsigned char OneWireReset(void);
unsigned char OneWireReadByte(void);
void OneWireWriteByte(unsigned char);
unsigned char iButtonCRC( unsigned char *code);

void OneWireReadROM(void) {
OneWireWriteByte(0x33);
one_wire_byte[0] = OneWireReadByte();
one_wire_byte[1] = OneWireReadByte();
one_wire_byte[2] = OneWireReadByte();
one_wire_byte[3] = OneWireReadByte();
one_wire_byte[4] = OneWireReadByte();
one_wire_byte[5] = OneWireReadByte();
one_wire_byte[6] = OneWireReadByte();
one_wire_byte[7] = OneWireReadByte();
one_wire_byte[8] = iButtonCRC(one_wire_byte);
}
unsigned char OneWireReset(void)
{
ONEPORT &= ~(ONEWIRE); // Normal input no pull up
if (!(ONEPIN & ONEWIRE)) return 0; // detect 0V on buss error
ONEDDR |= ONEWIRE; // out at 0
_delay_loop_2(462); // 500 us

ONEDDR &= ~(ONEWIRE); // Set to input
_delay_loop_2(64); // 70 us

if ((ONEPIN & ONEWIRE) == 0)
{
_delay_loop_2(462); // 500 us
return(1);
}
_delay_loop_2(462); // 500 us
return(0);
}
//********************************************************************************
*********
void OneWireWriteByte(unsigned char data)
{
unsigned char i;
ONEPORT &= ~(ONEWIRE);
for (i=0;i<=7;i++)
{
ONEDDR |= ONEWIRE;
if (data & 0x01)
{ // Send 1
_delay_loop_2(1); // 7 us

ONEDDR &= ~(ONEWIRE);
_delay_loop_2(32); // 70 us
}
else
{ // Send 0
_delay_loop_2(32); // 70 us
ONEDDR &= ~(ONEWIRE);
_delay_loop_2(1); // 7 us
}
data>>=1;
}
}
//********************************************************************************
*********
unsigned char OneWireReadByte(void)
{
unsigned char data = 0;
unsigned char i;

ONEPORT &= ~(ONEWIRE); // Output '0' or input without pullup
for (i=0;i<=7;i++)
{
ONEDDR |= ONEWIRE; // Set output to '0'
asm("nop");
ONEDDR &= ~(ONEWIRE); // Set to input
asm("nop");
data >>=1;
if (ONEPIN & ONEWIRE) data |= 0x80;
else data &= 0x7f;
_delay_loop_2(32); // 70 us
}
return data;
}
//********************************************************************************
*********
unsigned char iButtonCRC( unsigned char *code)
{
unsigned char j, i, Data, tmp, CRC = 0;
for (j = 0; j < 7; j++)
{
Data = code[j];
for (i = 0; i < 8; i++)
{
tmp = 1 & (Data ^ CRC);
CRC >>= 1;
Data >>= 1;
if ( 0 != tmp ) CRC ^= 0x8c;
}
}
return CRC;
}

int main(void)
{
if(OneWireReset()=1) // Есть ключ
{
OneWireReadROM()
if(one_wire_byte[7]=one_wire_byte[8]) // CRC OK
{
// Делаем что нужно
}


}

}
Помоему здесь все проще и понятней cheers.gif
Go to the top of the page
 
+Quote Post
ROC
сообщение Jan 24 2006, 09:29
Сообщение #12


Частый гость
**

Группа: Свой
Сообщений: 157
Регистрация: 14-11-04
Из: Санкт-Петербург
Пользователь №: 1 125



А на чем пишем-то? ASM, C? Если С, то который?
Для BASCOM-AVR & FastAVR, например, вообще есть встроенная функция CRC8 и в FastAVR это выглядит весьма просто:

Dim tmpT(9) As Byte
'
' bla-bla-bla
'
Sub Read1820()
1Wread tmpT,9
If Crc8(VarPtr(tmpT),9)=0 Then ' check Crc, if OK
CalcTmp() ' calc temp
1Wreset
else
Locate 2,1: Lcd "DS18B20 CRC Error!"
end if

Что-то у меня ввод в виде кода не работает.... sad.gif


--------------------
WBR,
ROC.
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Jan 24 2006, 10:11
Сообщение #13


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Цитата(ROC @ Jan 24 2006, 11:29) *
Что-то у меня ввод в виде кода не работает.... sad.gif

Код
Dim tmpT(9) As Byte
'
' bla-bla-bla
'
Sub Read1820()
1Wread tmpT,9
If Crc8(VarPtr(tmpT),9)=0 Then    ' check Crc, if OK
  CalcTmp()        ' calc temp
  1Wreset
else
Locate 2,1: Lcd "DS18B20 CRC Error!"
end if

Работает
Go to the top of the page
 
+Quote Post
Atashi
сообщение Jan 24 2006, 10:29
Сообщение #14


Участник
*

Группа: Новичок
Сообщений: 66
Регистрация: 30-04-05
Пользователь №: 4 630



ежели памяти полно, а надо быстро, то вот так:

crc8_tabl[]=
{
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
};

// if bytes=7 ->returns CRC
// if bytes=8 -> returns 0
//

char crc8_compute(char * str, char bytes)
{
char crc8=0;

while (bytes)
{
crc8=crc8_tabl[crc8 ^ *str++];
--bytes;
}
return crc8;
}
wink.gif
Go to the top of the page
 
+Quote Post
eXeC001er
сообщение Jan 24 2006, 10:41
Сообщение #15


Местный
***

Группа: Свой
Сообщений: 305
Регистрация: 23-02-05
Из: Краснодар
Пользователь №: 2 848



to MicronSys
а почему здесь 7 а не 8?! for (j = 0; j < 7; j++)
байтов то 9, последний CRC, которое считается по оставшимся 8 байтам.
Go to the top of the page
 
+Quote Post
m16
сообщение Jan 24 2006, 10:45
Сообщение #16


Местный
***

Группа: Свой
Сообщений: 242
Регистрация: 27-01-05
Пользователь №: 2 225



рабочий пример на асме. до восьми датчиков ds1820. переименовать в zip архив.
Прикрепленные файлы
Прикрепленный файл  2313Temp8hard_zip.txt ( 15.11 килобайт ) Кол-во скачиваний: 155
 
Go to the top of the page
 
+Quote Post
GxOST
сообщение Jan 24 2006, 11:26
Сообщение #17


Участник
*

Группа: Свой
Сообщений: 58
Регистрация: 6-12-05
Из: Санкт-Петербург
Пользователь №: 11 878



Цитата(MicronSys @ Jan 24 2006, 12:18) *
Цитата(GxOST @ Jan 24 2006, 13:08) *

Цитата(eXeC001er @ Jan 24 2006, 10:58) *

Цитата(GxOST @ Jan 24 2006, 10:42) *

Цитата(eXeC001er @ Jan 24 2006, 10:02) *

Можно подробнее, а если еще и примерчик что вабще гуд.

Отличная штука для понимания идеи
А вообще понимать не обязательно, берешь исходники и вперед.

эт не то, я не разберусь в этих языках.

да чего ж там понимать! Всё как на це. Вот пример формирования crc в соответствии со сгенеренным верилогом (табличный)

Не таблица енто отстой ПАМЯТЬ НЕ РЕЗИНОВАЯ !!! blink.gif
Если делать в тинька то лишние байты ох как нужны !!!!! a14.gif

Таблица зато быстрей. Тут уж выбирай. К тому же можно табличную CRC, но обрабатывать по полбайта - таблица уменьшится с 256 до 16 байт (это для CRC8). В моем примере именно так и сделано для CRC16, правда там полубайты заранее разнесены по байтам, но кому надо - может переделать smile.gif

ЗЫ. Народ! вы про тэги [code] [/code] не в курсе что-ли?

Сообщение отредактировал GxOST - Jan 24 2006, 11:28


--------------------
cul8r!
* #ru_embedded - эмбеддерский чат
Go to the top of the page
 
+Quote Post
eXeC001er
сообщение Jan 24 2006, 11:52
Сообщение #18


Местный
***

Группа: Свой
Сообщений: 305
Регистрация: 23-02-05
Из: Краснодар
Пользователь №: 2 848



вот в айбатонах 8 байт и 8 это CRC! а в термометрах 9 байт. но в даташите тоже написано что то про 7 байт, никак не пойму.
по сайту поискал нашел, но файлы не скачиваются, говорит что их уже нет.
Go to the top of the page
 
+Quote Post
MicronSys
сообщение Jan 24 2006, 14:57
Сообщение #19


Частый гость
**

Группа: Участник
Сообщений: 106
Регистрация: 12-05-05
Пользователь №: 4 946



[quote name='eXeC001er' date='Jan 24 2006, 14:41' post='80832']
to MicronSys
а почему здесь 7 а не 8?! for (j = 0; j < 7; j++)
в сях 0 тоже ипользуется

типа 0,1,2..7 итого 8 байт cheers.gif
Go to the top of the page
 
+Quote Post
GxOST
сообщение Jan 24 2006, 15:12
Сообщение #20


Участник
*

Группа: Свой
Сообщений: 58
Регистрация: 6-12-05
Из: Санкт-Петербург
Пользователь №: 11 878



Цитата(MicronSys @ Jan 24 2006, 17:57) *
to MicronSys
а почему здесь 7 а не 8?! for (j = 0; j < 7; j++)
в сях 0 тоже ипользуется

типа 0,1,2..7 итого 8 байт cheers.gif

j<7, значит 7 не считается. cranky.gif


--------------------
cul8r!
* #ru_embedded - эмбеддерский чат
Go to the top of the page
 
+Quote Post
MicronSys
сообщение Jan 24 2006, 15:20
Сообщение #21


Частый гость
**

Группа: Участник
Сообщений: 106
Регистрация: 12-05-05
Пользователь №: 4 946



Бывает a14.gif
Go to the top of the page
 
+Quote Post
BVU
сообщение Jan 24 2006, 15:49
Сообщение #22


Профессионал
*****

Группа: Свой
Сообщений: 1 301
Регистрация: 30-11-04
Из: Россия, Н.Новгород
Пользователь №: 1 264



Цитата(eXeC001er @ Jan 24 2006, 13:41) *
to MicronSys
а почему здесь 7 а не 8?! for (j = 0; j < 7; j++)
байтов то 9, последний CRC, которое считается по оставшимся 8 байтам.

Почитайте на этом сайте:
http://www.zinetz.info/article.php?id=home_temp2
Человек с этим разобрался и все подробно изложил, даже с примерами. smile.gif


--------------------
Не корысти ради, не в целях наживы, а во исполнение велений души!
Go to the top of the page
 
+Quote Post
Kovrov
сообщение Jan 24 2006, 15:55
Сообщение #23


Мастер-фломастер
****

Группа: Свой
Сообщений: 611
Регистрация: 29-12-05
Пользователь №: 12 700



на, мил человек, пользуйся и не мучейся :-)
Код
;*******************************************************************************
****
; Вычисление CRC (Х8+X5+X4+1) блока памяти
; в XH:XL надо загрузить начальный адрес блока памяти
; в count количество байт
;.def HiCRC = temp6
;.def LoCRC = temp5  здесь будет CRC8 блока памяти по окончании подпрограммы
;.def BitCount = temp2
;.def temp = r16
;.def count = temp3
;*******************************************************************************
****
CHECK_CRC:
    ldi        temp3,8        ; всего 8 байт
    LDX        (bufer_ds1820)
GetCRC_8:
      ldi     temp,0x18     ; загрузка полинома
      mov     temp6,temp     ; в регистр HiCRC
      clr     temp5         ; обнуление CRC регистра

CRC_Loop:
      ldi        temp2,8         ; указываем 8 бит для подсчета ;
      ld         temp,X+        ; берем байт из буфера

Bit_Loop:
      push     temp         ; сохранение байта в стеке
      eor     temp,temp5     ; xor байта и регистра CRC
      lsr     temp         ; сдвигаем младший бит получившегося байта в перенос
      brcc     Zero_0         ; проверяем младший разряд байта
      eor     temp5,temp6 ; если там 1, то CRC xor полином
Zero_0:
      ror     temp5          ; если там 0, то просто сдвиг CRC регистра
      pop     temp         ; возвращаем байт на место
      lsr     temp         ; и сдвигаем его
      dec     temp2       ;
      brne     Bit_Loop       ; переход на цикл проверки слеующего бита

      dec     temp3         ;
      brne     CRC_Loop     ; переход на следующий байт буфера
      ret


расчитана на вычисление группы байт
под темпы подставишь свои регистры
без труда переделаешь на апдейт CRC каждым новым байтом - что эффективней
типа как тока прочитал байт от 1820 сразу суешь его в эту процедуру


--------------------
Вон ПОПОВ, клоун клоуном, а радио изобрел!!
Go to the top of the page
 
+Quote Post
afe
сообщение Jan 25 2006, 22:57
Сообщение #24


Частый гость
**

Группа: Свой
Сообщений: 94
Регистрация: 4-05-05
Из: Харьков
Пользователь №: 4 740



Я уже давал эту ссылку и на этот вопрос там есть сорцы и для DS16b20:

http://electronix.ru/forum/index.php?showtopic=10934&st=15

http://hubbard.engr.scu.edu/avr/avrlib/


--------------------
SY AfE
Go to the top of the page
 
+Quote Post
Pyku_He_oTTyda
сообщение Feb 1 2006, 05:57
Сообщение #25


Профессионал
*****

Группа: Свой
Сообщений: 1 751
Регистрация: 4-08-05
Из: Великие Луки
Пользователь №: 7 360



Kovrov
Не обьясните, как начинающему на пальцах, как правильно определить буфер, например в 90S2313, и смоделировать программу в AVRstudio.
Особенно интересует, откуда берет значение строка

ld temp,X+ ; берем байт из буфера


--------------------
Андрей Смирнов
Go to the top of the page
 
+Quote Post
m16
сообщение Feb 1 2006, 06:52
Сообщение #26


Местный
***

Группа: Свой
Сообщений: 242
Регистрация: 27-01-05
Пользователь №: 2 225



Цитата(Pyku_He_oTTyda @ Feb 1 2006, 08:57) *
Особенно интересует, откуда берет значение строка
ld temp,X+ ; берем байт из буфера


система команд авр. http://www.gaw.ru/html.cgi/txt/doc/micros/avr/asm/start.htm
Go to the top of the page
 
+Quote Post
Atashi
сообщение Feb 1 2006, 08:27
Сообщение #27


Участник
*

Группа: Новичок
Сообщений: 66
Регистрация: 30-04-05
Пользователь №: 4 630



... давненько не был здесь; похоже, сомнения насчет 7/8/9 байтов где-то застряли.
Придется объясниться.

на таблетке ds1991 etс такая инфа набита: 01 - код семейства, потома 6 байтов кода, ище байт CRC:
итого выходить осемь байта.
Отчего и происходят мозоли, по авторитетному мнению г-на Пруткова. angry.gif
Go to the top of the page
 
+Quote Post
Pyku_He_oTTyda
сообщение Feb 1 2006, 10:21
Сообщение #28


Профессионал
*****

Группа: Свой
Сообщений: 1 751
Регистрация: 4-08-05
Из: Великие Луки
Пользователь №: 7 360



m16
Торнутая в морду лица ссылка помоглаsmile.gif, мозги запудренные просветлились. На обеде разобрался, откуда берет данные.

Вопрос вдогонку - 01(код семейства) участвуеn в подсчете CRC?


--------------------
Андрей Смирнов
Go to the top of the page
 
+Quote Post
m16
сообщение Feb 1 2006, 11:47
Сообщение #29


Местный
***

Группа: Свой
Сообщений: 242
Регистрация: 27-01-05
Пользователь №: 2 225



Цитата(Pyku_He_oTTyda @ Feb 1 2006, 13:21) *
m16
Торнутая в морду лица ссылка помоглаsmile.gif, мозги запудренные просветлились.

зачем так грубо. имхо если сам разобрался с карандашом то глубже оседает в извилинах.
http://www.gaw.ru/html.cgi/txt/app/micros/avr/avr318.htm
Go to the top of the page
 
+Quote Post
Pyku_He_oTTyda
сообщение Feb 2 2006, 06:14
Сообщение #30


Профессионал
*****

Группа: Свой
Сообщений: 1 751
Регистрация: 4-08-05
Из: Великие Луки
Пользователь №: 7 360



С СRС разобрался вчера на базе примера от Kovrov. Немного расписал поподробнее, что бы начинающим было понятнее.

.include "2313def.inc"

.cseg
.org 0

.def temp = R16
.def count = R17
.def BitCount = R18
.def HiCRC = R19
.def LoCRC = R20 ;здесь будет СRC8 блока памяти по окончании подпрограмы


;блок ссылок на обработчики прерываний
;=====================================

rjmp RESET ;reset handler
nop ;rjmp EXT_INT0 ;IRQ0 handler
nop ;rjmp EXT_INT1 ;IRQ1 handler
nop ;rjmp TIM_CAPT1 ;timer1 capture handler
nop ;rjmp TIM_COMP1 ;timrt1 compare handler
nop ;rjmp TIM_OVF1 ;timer1 overflov handler
nop ;rjmp TIM_OVF0 ;timer0 overflov handler
nop ;rjmp UART_RXC ;UART RX complete handler
nop ;rjmp UART_DRE ;UDR empty handler
nop ;rjmp UART_TXC ;UART TX complete handler
nop ;rjmp ANA_COMP ;analog comparator handler


;*******************************************************************************
; Вычисление CRC (Х8+X5+X4+1) блока памяти
; в XH:XL надо загрузить начальный адрес блока памяти
; в count количество байт
;
; Данныее должны находится в блоке памяти в следующем порядке:
; начальный адрес памяти - Family Code
; следующие шесть - HEX чисела в обратном порядке, написанному на ключе
; последний адрес - СRС
;
; В результате успешных действий в регистре LoCRC должны находится нули
;*******************************************************************************

CHECK_CRC:
ldi count,8 ; всего 8 байт

GetCRC_8:
ldi temp,0x18 ; загрузка полинома
mov HiCRC,temp ; в регистр HiCRC
clr LoCRC ; обнуление CRC регистра

CRC_Loop:
ldi BitCount,8 ; указываем 8 бит для подсчета
ld temp,X+ ; берем байт из буфера

Bit_Loop:
push temp ; сохранение байта в стеке
eor temp,LoCRC ; xor байта и регистра CRC
lsr temp ; сдвигаем младший бит получившегося байта в перенос
brcc Zero_0 ; проверяем младший разряд байта (перейти, если перенос очищен)
eor LoCRC,HiCRC ; если там 1, то CRC xor полином

Zero_0:
ror LoCRC ; если там 0, то просто сдвиг CRC регистра
pop temp ; возвращаем байт на место
lsr temp ; и сдвигаем его
dec BitCount ; декременируем значение регистра
brne Bit_Loop ; переход на цикл проверки слеующего бита

dec count ; декременируем значение счетчика байт
brne CRC_Loop ; переход на следующий байт буфера

tst LoCRC ;проверяем на ноль CRC
breq good ;если равно нулю, переходим на метку "good"

ret ;если результат не равен нулю,
;возвращаемся из подпрограммы подсчета CRC

;*******************************************************************************

good:
rjmp good

;====
;MAIN
;====

RESET:

ldi temp,low(RAMEND) ;определение начала
out SPL,temp ;стека и ОЗУ

clr r27
ldi r26,0x60 ;загрузка начального адреса блока памяти


rjmp CHECK_CRC


--------------------
Андрей Смирнов
Go to the top of the page
 
+Quote Post
Atashi
сообщение Feb 2 2006, 13:16
Сообщение #31


Участник
*

Группа: Новичок
Сообщений: 66
Регистрация: 30-04-05
Пользователь №: 4 630



Да, 01 участвует.

Вообще, алгоритм-то универсальный, любые дивайсы, любое кво байтов катят.
Go to the top of the page
 
+Quote Post
Kovrov
сообщение Feb 2 2006, 17:22
Сообщение #32


Мастер-фломастер
****

Группа: Свой
Сообщений: 611
Регистрация: 29-12-05
Пользователь №: 12 700



Цитата(Pyku_He_oTTyda @ Feb 1 2006, 08:57) *
Kovrov
Не обьясните, как начинающему на пальцах, как правильно определить буфер, например в 90S2313, и смоделировать программу в AVRstudio.
Особенно интересует, откуда берет значение строка

ld temp,X+ ; берем байт из буфера

да ни каких особо ухищрений не нужно просто определяешь область озу в тиньке
если 2313 то там 128 байт всего
для 1820 нужно (процесс чтения после конвертации - в смысле когда температуа измерилась)
в такой последовательности ты их (байты)будешь получать от 1820
первым идет:
(1 байт температура младший байт)
2- температура старший байт
3- юзерский байт 1
4- юзерский байт 2
5 байт конфигурации
6- не используется
7- не используется
8 - не используется
9 - контрольная сумма (ради чего весь сыр бор)
- 9й можешь не писать в буфер тогда буфер будет 8 байт всего
но по началу лучше пиши
;---------
вообщем берешь каждый считанный байт и кидаешь его в буфер
буфер определяешь нну например от начала памяти (начало у тиньки есть адрес $60)
поэтому буфер будет от $60... $68 - всего 9 байт (вместе с контр суммой)
все это хозяйство а имеено начало буфера
LDI XL,low($0060)
LDI XH,high($0060) ; определяешь начало буфера
и 8 байт всего
кстати для тини старший байт не используется(т.к 128 байт всего) поэтому LDI r16,high(xxxx) можно
неписать после прогона процедуры в темп 5 получается контр сумма
она должна быть равна 9 байту буфера если равна то все ок можно сказать что чтение с 1820 произошло успешно если не ровна то извините....


--------------------
Вон ПОПОВ, клоун клоуном, а радио изобрел!!
Go to the top of the page
 
+Quote Post
d__
сообщение Feb 2 2006, 17:42
Сообщение #33


Частый гость
**

Группа: Свой
Сообщений: 197
Регистрация: 26-08-04
Пользователь №: 548



Вот еще один вариант реализации на языке С.
Характерная особенность-подсчитывает частичную контрольную сумму--т.е. с приходом каждого байта обновляется контрольная сумма. Переведено на С из контрольного примера в даташите на языке ассемблера Z80. Почему частичная--так удобнее, получил байт -- обновил контрольную сумму. Общая метода такова--перед началом приема информационного пакета контрольная сумма обнуляется. Потом принимаются все байты информационного пакета, включая контрольную сумму, каждый байт проходит через данную подпрограмму, обновляя контрольную сумму. Если пакет принят без ошибок, то вычисленная контрольная сумма равна нулю.

#define POLY8 (0x8c) //x^8+x^5+x^4+x^0 position bits are mirrored
// because register is shifted right


unsigned char partdowcrc(unsigned int oldcrc,unsigned char val)
{
register char i;
oldcrc ^= val;
for(i=0;i<8;i++)
{
if((oldcrc &1 )!=0)oldcrc ^= (POLY8 << 1);
oldcrc >>=1;
}
return oldcrc;
}
Go to the top of the page
 
+Quote Post
Pyku_He_oTTyda
сообщение Feb 3 2006, 05:54
Сообщение #34


Профессионал
*****

Группа: Свой
Сообщений: 1 751
Регистрация: 4-08-05
Из: Великие Луки
Пользователь №: 7 360



Kovrov

Разве неправильно я расписал для 1990? При правильности считывания в LoCRC разве не должны быть нули? help.gif

;*******************************************************************************

; Вычисление CRC (Х8+X5+X4+1) блока памяти
; в XH:XL надо загрузить начальный адрес блока памяти
; в count количество байт
;
; Данныее должны находится в блоке памяти в следующем порядке:
; начальный адрес памяти - Family Code
; следующие шесть - HEX чисела в обратном порядке, написанному на ключе
; последний адрес - СRС
;
; В результате успешных действий в регистре LoCRC должны находится нули
;*******************************************************************************


--------------------
Андрей Смирнов
Go to the top of the page
 
+Quote Post
Kovrov
сообщение Feb 3 2006, 10:38
Сообщение #35


Мастер-фломастер
****

Группа: Свой
Сообщений: 611
Регистрация: 29-12-05
Пользователь №: 12 700



Цитата(Pyku_He_oTTyda @ Feb 3 2006, 08:54) *
Kovrov

Разве неправильно я расписал для 1990? При правильности считывания в LoCRC разве не должны быть нули? help.gif

че уже считаем для 1990? недавно тока температуру читали ;-)
нет нулей быть не должно за исключением если сумма равна нулю...
кстати мне попадался экземпляр 1990 у которого реально крк = 00!
можешь выложить суда содержимое буфера
кстати для 1990 ( а если точнее результат команды "read rom"$33 - это 7байт +crc

Сообщение отредактировал Kovrov - Feb 3 2006, 10:43


--------------------
Вон ПОПОВ, клоун клоуном, а радио изобрел!!
Go to the top of the page
 
+Quote Post
Pyku_He_oTTyda
сообщение Feb 3 2006, 11:38
Сообщение #36


Профессионал
*****

Группа: Свой
Сообщений: 1 751
Регистрация: 4-08-05
Из: Великие Луки
Пользователь №: 7 360



01 1E 06 CA 0C 00 00 70

Это конкретный ключ, проверил еще пяток, нули в LoCRC

01 код семейства, лежит в $60, остальное по порядку.
70 - CRC

Сообщение отредактировал Pyku_He_oTTyda - Feb 3 2006, 11:40


--------------------
Андрей Смирнов
Go to the top of the page
 
+Quote Post
Kovrov
сообщение Feb 3 2006, 17:59
Сообщение #37


Мастер-фломастер
****

Группа: Свой
Сообщений: 611
Регистрация: 29-12-05
Пользователь №: 12 700



Цитата(Pyku_He_oTTyda @ Feb 3 2006, 14:38) *
01 1E 06 CA 0C 00 00 70

Это конкретный ключ, проверил еще пяток, нули в LoCRC

01 код семейства, лежит в $60, остальное по порядку.
70 - CRC

только что прогнал через приведенную процедуру все совпало в смысле контро сумма = $70.


--------------------
Вон ПОПОВ, клоун клоуном, а радио изобрел!!
Go to the top of the page
 
+Quote Post
Kovrov
сообщение Feb 3 2006, 18:26
Сообщение #38


Мастер-фломастер
****

Группа: Свой
Сообщений: 611
Регистрация: 29-12-05
Пользователь №: 12 700



посмотрел на твой исходник
ты в твоем случае 8ой байт (крк) подставляешь в процедуру проверки и естественно если сумма совпала то
LOCRC = 0
только зачем лишний цикл?
проще поставить в count=7 а после сравнить $70и $70.
Твой вариант тоже верен.
а в чем проблема то? :-)


--------------------
Вон ПОПОВ, клоун клоуном, а радио изобрел!!
Go to the top of the page
 
+Quote Post
Pyku_He_oTTyda
сообщение Feb 6 2006, 05:49
Сообщение #39


Профессионал
*****

Группа: Свой
Сообщений: 1 751
Регистрация: 4-08-05
Из: Великие Луки
Пользователь №: 7 360



Проблемы нет, просто хотелось уточнить все до конца. Тем более Ваш пример мне очень помог! Большое спасибо!


--------------------
Андрей Смирнов
Go to the top of the page
 
+Quote Post
ilya514
сообщение Feb 7 2006, 13:21
Сообщение #40


Участник
*

Группа: Новичок
Сообщений: 27
Регистрация: 29-11-05
Пользователь №: 11 546



Цитата(Pyku_He_oTTyda @ Feb 3 2006, 14:38) *
01 1E 06 CA 0C 00 00 70

Это конкретный ключ, проверил еще пяток, нули в LoCRC

01 код семейства, лежит в $60, остальное по порядку.
70 - CRC

А как вручную посчитать crc для этого ключа?
Go to the top of the page
 
+Quote Post
Pyku_He_oTTyda
сообщение Feb 8 2006, 05:53
Сообщение #41


Профессионал
*****

Группа: Свой
Сообщений: 1 751
Регистрация: 4-08-05
Из: Великие Луки
Пользователь №: 7 360



И вопрос в догонку:
Если на шине присутствует подчиненный, то он должен в течение 60 мкс после освобождения ведущим шины установить низкий уровень длительностью не менее 60 мкс.

Как правильнее поступить:
1. Отследить наличие установки низкого уровня, по истечении 60мкс после освобождения линии ведущим?
2.Отследить не только наличие низкого уровня, но и измерить его длительнось?

По мне более правильным кажется второй вариант, но к примеру в AVR318 алгоритм такой:
Установка "0" мастером на 480мкс - освобождение шины - ждем 70мкс - чтение шины - ждем 410мкс - работаем дальше.
Вот как раз момент "чтение шины" не очень понятен, если не измерять длительность ответа, разве помехоустойчивость на высоте будет? Или с этим мирится и всю надежду возлажить на последующее чтение номера и подсчет CRC?


--------------------
Андрей Смирнов
Go to the top of the page
 
+Quote Post
add
сообщение Feb 8 2006, 07:12
Сообщение #42


Местный
***

Группа: Свой
Сообщений: 345
Регистрация: 10-10-05
Пользователь №: 9 459



Цитата(Pyku_He_oTTyda @ Feb 8 2006, 08:53) *
Вот как раз момент "чтение шины" не очень понятен, если не измерять длительность ответа, разве помехоустойчивость на высоте будет?

Можно "читать шину" несколько раз(как в UARTе) в интервале ответа (60-240мкс) набирая статистику, обеспечивая тем самым высокий процент достоверности. Окно (имп.сбр+ожид60мкс+240мкс ответ)правда всеравно придется выдерживать.


--------------------
Если задачу можно решить, то не надо тревожиться. А если нельзя решить, то тревожиться бесполезно.
Go to the top of the page
 
+Quote Post
Kovrov
сообщение Feb 8 2006, 07:34
Сообщение #43


Мастер-фломастер
****

Группа: Свой
Сообщений: 611
Регистрация: 29-12-05
Пользователь №: 12 700



Цитата(Pyku_He_oTTyda @ Feb 8 2006, 08:53) *
И вопрос в догонку:
Если на шине присутствует подчиненный, то он должен в течение 60 мкс после освобождения ведущим шины установить низкий уровень длительностью не менее 60 мкс.

Как правильнее поступить:
1. Отследить наличие установки низкого уровня, по истечении 60мкс после освобождения линии ведущим?
2.Отследить не только наличие низкого уровня, но и измерить его длительнось?


конечно! берешь таймер с тиком например мкс и зекаешь когда мастер сброс даст
сразу онулируешь тимер и следишь пока не кончиться ресет мастера
как кончился - смотришь че тамер на мерил если укладываешься в рамки то ок...
а вообще очень красиво и экономно засунуть его под EXT int и работать с его прерыванием
я так и делал очень приличная экономия!!
на счет 60 мкс - я не понял - речь идет о presence pulse?


--------------------
Вон ПОПОВ, клоун клоуном, а радио изобрел!!
Go to the top of the page
 
+Quote Post
Pyku_He_oTTyda
сообщение Feb 8 2006, 09:27
Сообщение #44


Профессионал
*****

Группа: Свой
Сообщений: 1 751
Регистрация: 4-08-05
Из: Великие Луки
Пользователь №: 7 360



Цитата
на счет 60 мкс - я не понял - речь идет о presence pulse?

да, подчиненный должен ответить, что он на линии, низким уровнем не менее 60мкс
Цитата
а вообще очень красиво и экономно засунуть его под EXT int и работать с его прерыванием
я так и делал очень приличная экономия!!

можно принцип немного подробнее?


--------------------
Андрей Смирнов
Go to the top of the page
 
+Quote Post
Kovrov
сообщение Feb 8 2006, 10:00
Сообщение #45


Мастер-фломастер
****

Группа: Свой
Сообщений: 611
Регистрация: 29-12-05
Пользователь №: 12 700



Presence pulsе делай по максимуму возможному а то у меня домофоны плохо открывались ;-)
насчет Ext int
заводишь это хохяйство на ногу внешнего прерывания
и настраиваешь прерывание на перепад 1-0
а пока ждешь прерывание контроллер переводишь в слип (холостой ход)
тоже самое делаешь когда принимаешь данные

Сообщение отредактировал Kovrov - Feb 8 2006, 10:03


--------------------
Вон ПОПОВ, клоун клоуном, а радио изобрел!!
Go to the top of the page
 
+Quote Post
Pyku_He_oTTyda
сообщение Feb 8 2006, 10:46
Сообщение #46


Профессионал
*****

Группа: Свой
Сообщений: 1 751
Регистрация: 4-08-05
Из: Великие Луки
Пользователь №: 7 360



Ага, понятно, спасибо!
А проснется процессор при первом подключении таблетки? На этот вопрос ответа не нашел толкового. Имеется ввиду, спит процессор, ждет внешнего прерывания по спаду, подносим таблетку - он просыпается и начинает работу. Конечно можно промоделировать, но хочется стабильного результата.
Как вы в домофоне делали, если не секрет?
Есть идея использовать WDR, но не очень нравится


--------------------
Андрей Смирнов
Go to the top of the page
 
+Quote Post
Kovrov
сообщение Feb 8 2006, 10:52
Сообщение #47


Мастер-фломастер
****

Группа: Свой
Сообщений: 611
Регистрация: 29-12-05
Пользователь №: 12 700



если на инт0 посадишь то вообще может от любого шороха проснуться!!!! ;-)
посмотри в дадашите на sleep mode select


--------------------
Вон ПОПОВ, клоун клоуном, а радио изобрел!!
Go to the top of the page
 
+Quote Post
PLATRO
сообщение Jun 13 2006, 17:58
Сообщение #48


Участник
*

Группа: Новичок
Сообщений: 17
Регистрация: 12-06-06
Пользователь №: 17 994



парни а ниукаво нету просто проги для подсчета CRC ? ну типо чтоб вводишь в нее байты а она CRC щитает ?
Go to the top of the page
 
+Quote Post
defunct
сообщение Jun 14 2006, 01:21
Сообщение #49


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(PLATRO @ Jun 13 2006, 20:58) *
парни а ниукаво нету просто проги для подсчета CRC ? ну типо чтоб вводишь в нее байты а она CRC щитает ?

Гм.. дык, CRC разные бывают от полинома зависит.
Вот функция на Delphi, подставляйте в нее нужный вам (Divisor) и будет вам CRC8 по требуемому полиному. Divisor задается как: bit15 <=> x^8, bit14 <=> x^7, .... , bit7 <=> x^0, остальные биты bit6..0 = 0.

Код
function CRC8( data: ShortString):byte;
// расчет CRC8 по образующему полиному x8 + x5 + x2 + 1
const
   Divisor = $9280; // [1001 0010 1]000 0000, в квадратных скобках образующий полином
var
   CodeWord : Cardinal;
   Temp  : Cardinal;
   i, j : integer;
begin
   if Length( data ) < 2 then
      raise Exception.Create('the data string must be at least 2 bytes long');
   Temp := byte(data[1]);
   for i := 2 to Length( data ) do
   begin
      CodeWord := Divisor;
      Temp := Temp shl 8 or byte(data[i]);
      for j := 15 downto 8 do
      begin
         if (Temp and (1 shl j) <> 0) then
            Temp := Temp xor CodeWord;
         CodeWord := CodeWord shr 1;
      end;
   end;
   Result := Temp and $FF;
end;


Строка data должна оканчиваться #0 обязательно, в этот 0 и помещается CRC.
При желании функция легко переделывается для расчета СRC16/CRC24
Go to the top of the page
 
+Quote Post
PLATRO
сообщение Jun 14 2006, 10:31
Сообщение #50


Участник
*

Группа: Новичок
Сообщений: 17
Регистрация: 12-06-06
Пользователь №: 17 994



да в том то и фишка что я знаю тока vb )) и компиляторов нету. мнебы прогу готовую в которую вводишь семь байт и она щитает CRC-8. понимаю канешно что может много хочу, но малоли у каво есть)
Go to the top of the page
 
+Quote Post
TomaT
сообщение Jun 14 2006, 10:42
Сообщение #51


Частый гость
**

Группа: Свой
Сообщений: 195
Регистрация: 25-01-06
Из: г. Троицк, МО
Пользователь №: 13 575



Вот, может поможет чем...
http://www.easics.com/webtools/crctool
Go to the top of the page
 
+Quote Post
PLATRO
сообщение Jun 16 2006, 11:57
Сообщение #52


Участник
*

Группа: Новичок
Сообщений: 17
Регистрация: 12-06-06
Пользователь №: 17 994



ну как я понял это штука тоже код на чомто генерит. мне просто нада чисто втупую пощитать crc. просто влом заморачиваца и втыкать в весь алгоритм. мне просто нада продублировать один ключик. я какбы знаю тока цыфры которые на корпусе написаны а crc не знаю. вот)
Go to the top of the page
 
+Quote Post
Nanobyte
сообщение Jun 16 2006, 13:03
Сообщение #53


За битами по регистрам гоняюсь
***

Группа: Свой
Сообщений: 457
Регистрация: 24-04-06
Из: Таганрог
Пользователь №: 16 446



Если это ключик от Dallas, то последние две цифры (8-й байт) это и есть CRC.


--------------------
Курсор влево, курсор вправо - считается хакерством. FORMAT C: производится без предупреждения
Go to the top of the page
 
+Quote Post
PLATRO
сообщение Jun 16 2006, 14:39
Сообщение #54


Участник
*

Группа: Новичок
Сообщений: 17
Регистрация: 12-06-06
Пользователь №: 17 994



вот там написано чтото вроде вот этого:
20 01
000008475135

где здесь CRC ?
Go to the top of the page
 
+Quote Post
Nanobyte
сообщение Jun 16 2006, 17:09
Сообщение #55


За битами по регистрам гоняюсь
***

Группа: Свой
Сообщений: 457
Регистрация: 24-04-06
Из: Таганрог
Пользователь №: 16 446



В Вашем случае:
01-Family code (DS1990)
20-CRC
00...35 - Serial Number


--------------------
Курсор влево, курсор вправо - считается хакерством. FORMAT C: производится без предупреждения
Go to the top of the page
 
+Quote Post
PLATRO
сообщение Jun 16 2006, 19:08
Сообщение #56


Участник
*

Группа: Новичок
Сообщений: 17
Регистрация: 12-06-06
Пользователь №: 17 994



Опа! Спасибо бааааальшое! smile.gif
Осталось только чтоб имитатор заработал smile.gif
Go to the top of the page
 
+Quote Post
Nanobyte
сообщение Jun 16 2006, 19:43
Сообщение #57


За битами по регистрам гоняюсь
***

Группа: Свой
Сообщений: 457
Регистрация: 24-04-06
Из: Таганрог
Пользователь №: 16 446



Посмотрите ещё и здесь:
Имитатор Touch-Memory
http://www.telesys.ru/projects/proj038/index.shtml


--------------------
Курсор влево, курсор вправо - считается хакерством. FORMAT C: производится без предупреждения
Go to the top of the page
 
+Quote Post
PLATRO
сообщение Jun 16 2006, 23:43
Сообщение #58


Участник
*

Группа: Новичок
Сообщений: 17
Регистрация: 12-06-06
Пользователь №: 17 994



да это слишком сложный. мне нада на один ключ
Go to the top of the page
 
+Quote Post

4 страниц V   1 2 3 > » 
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 23:39
Рейтинг@Mail.ru


Страница сгенерированна за 0.02328 секунд с 7
ELECTRONIX ©2004-2016