Сообщение от realid
|
Каким образом? Если ваша программа пропускает замыкание, то это ваша ошибка.
|
Уважаемый, прочитай еще раз мой пост#61. Там написано что я отбраковываю такой ключ по умолчанию, а коллега выше предлагает пропускать.
Вот пример из моей проги.
;----------------------------------------------------------------------------
;подпрограмма проверки CRC для полинома CRC=X8+X5+X4+1
;применяется в ключах и девайсах Dalls iButton
;данная подпрограмма полностью исключает реакцию на замыкание или
;скользящее прикосновение ключа, принимает в дальнейшую обработку только исправный код
;----------------------------------------------------------------------------
CHECK_CRC MOVF CRC_iButton,f ; Проверяем CRC на ноль на случай если
BTFSC STATUS,Z ; какой-то мудак замкнул контакты нашего гнезда (в других случаях это невозможно)
GOTO Mistake ; и возращаемся в основную программу к точке "ошибка чтения" или "руки прочь от гнезда"
CLRF CRC_M ; очищаем результирующий регистр (в конце в нем останется результат деления)
MOVLW 0x38 ; указываем начальный адрес данных которые требуется проверить
MOVWF FSR ; в регистр FSR
L_CRC
MOVF INDF,w ; загружаем байт данных в аккумулятор W
CALL CRC_ROUT ; вызываем подпрограмму CRC_ROUT
INCF FSR,f ; переходим к следующему байту
MOVF FSR,w ; проверяем не дошли ли мы до последнего байта это тот что перед CRC_iButton
XORLW 0x3F ; (внимание нельзя допустить что бы произошло сравнение CRC и CRC) результат будет 0
BTFSS STATUS,Z ; если не дошли то
GOTO L_CRC ; переходим к следующему байту
MOVFW CRC_iButton ; если дошли то производим сравнение CRC_iButton и вычисленного
XORWF CRC_M,w ; а если не ноль то перед нами живой ключик
BTFSS STATUS,Z ; его и сравним с результатом деления
GOTO Mistake ; если не совпало значит есть неверный байт
GOTO Passed ; если совпало ключ считан верно
CRC_ROUT
MOVWF CRC_L ; сохраняяем байт во временном регистре
MOVLW 0x08 ; записываем количество ходов для преобразований
MOVWF COUNT ; в регистр счетчик
MOVF CRC_L,w ; снова берем байт
L1_CRC
XORWF CRC_M,w ; ксорим его с результирующим регистром
MOVWF TMP0 ; сохраняем результат во временном регистре
RRF TMP0,w ; сдвигаем в право
MOVF CRC_M,w ; подгружаем результирующий регистр
BTFSC STATUS,C ; проверяем был ли перенос 1 из младшего разряда TMP0
XORLW 0x18 ; если да то число нечетное и его ксорим с числом 0x18 (что такое незнаю но работает)
MOVWF TMP0 ; если нет число четное, ксорить его ненадо оставляем как было
RRF TMP0,w ; и просто сдвигаем в право
MOVWF CRC_M ; результат сохраняем в CRC_M
BCF STATUS,C ; здесь обнуляется флаг переноса если он был или небыл что бы в следующем цикле не ошибиться
RRF CRC_L,f ; сдвигаем исходный байт
MOVF CRC_L,w ; грузим его в аккумулятор
DECFSZ COUNT,f ; и если счетчик не дошел еще до 0
GOTO L1_CRC ; повторяем цикл
RETLW 0 ; если дошел переходим к следующему байту