|
|
  |
DS18B20 вычисление CRC как это сделать?!, Почитал и даташит и апноты, там что то сказано, но не понял я. |
|
|
|
Jan 24 2006, 11:26
|

Участник

Группа: Свой
Сообщений: 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 в соответствии со сгенеренным верилогом (табличный) Не таблица енто отстой ПАМЯТЬ НЕ РЕЗИНОВАЯ !!! Если делать в тинька то лишние байты ох как нужны !!!!!  Таблица зато быстрей. Тут уж выбирай. К тому же можно табличную CRC, но обрабатывать по полбайта - таблица уменьшится с 256 до 16 байт (это для CRC8). В моем примере именно так и сделано для CRC16, правда там полубайты заранее разнесены по байтам, но кому надо - может переделать  ЗЫ. Народ! вы про тэги [code] [/code] не в курсе что-ли?
Сообщение отредактировал GxOST - Jan 24 2006, 11:28
--------------------
|
|
|
|
|
Jan 24 2006, 14:57
|

Частый гость
 
Группа: Участник
Сообщений: 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 байт
|
|
|
|
|
Jan 24 2006, 15:12
|

Участник

Группа: Свой
Сообщений: 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 байт  j<7, значит 7 не считается.
--------------------
|
|
|
|
|
Jan 24 2006, 15:55
|

Мастер-фломастер
   
Группа: Свой
Сообщений: 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 сразу суешь его в эту процедуру
--------------------
Вон ПОПОВ, клоун клоуном, а радио изобрел!!
|
|
|
|
|
Feb 1 2006, 06:52
|
Местный
  
Группа: Свой
Сообщений: 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
|
|
|
|
|
Feb 1 2006, 08:27
|

Участник

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

|
... давненько не был здесь; похоже, сомнения насчет 7/8/9 байтов где-то застряли. Придется объясниться. на таблетке ds1991 etс такая инфа набита: 01 - код семейства, потома 6 байтов кода, ище байт CRC: итого выходить осемь байта. Отчего и происходят мозоли, по авторитетному мнению г-на Пруткова.
|
|
|
|
|
Feb 1 2006, 11:47
|
Местный
  
Группа: Свой
Сообщений: 242
Регистрация: 27-01-05
Пользователь №: 2 225

|
Цитата(Pyku_He_oTTyda @ Feb 1 2006, 13:21)  m16 Торнутая в морду лица ссылка помогла  , мозги запудренные просветлились. зачем так грубо. имхо если сам разобрался с карандашом то глубже оседает в извилинах. http://www.gaw.ru/html.cgi/txt/app/micros/avr/avr318.htm
|
|
|
|
|
Feb 2 2006, 06:14
|

Профессионал
    
Группа: Свой
Сообщений: 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
--------------------
Андрей Смирнов
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|