Меня интересует вот этот кусок:
Код:
;-- Перекладываем результат измерения в переменную --
MOVFW ADCResH
MOVWF DeltaHH
MOVFW ADCResL
MOVWF DeltaHL
;----------------------------------------------------
;-- 16-bit Subtraction-with-Borrow --
MOVFW SGndHL ; Вычитаем старшие 16 бит усредненного значения из измеренного
SUBWF DeltaHL, f
MOVFW SGndHH
SKPC
INCFSZ SGndHH, w
SUBWF DeltaHH, f
;------------------------------------
CLRC ; На всякий случай (сброс флага переноса).
CLRF DeltaLH ; Младшие байты очищаются
CLRF DeltaLL
;--- Сдвиг вправо для вичисления дельты медленного канала (канала "земли") ---
MOVFW AutoSpeed ; Константа для автоподстройки
MOVWF CntInt ; Задание значения счетчика разрядов сдвига
loop_D2:
BTFSC DeltaHH, 7 ; Если DeltaHH - не отрицательное число - пропустить
SETC ; в противном случае - установить флаг переноса
RRF DeltaHH, f ; Сдвиг вправо всех 4 байт...
RRF DeltaHL, f ; ... числа Delta ...
RRF DeltaLH, f ; ... с учетом переноса. Перенос из младшего байта не учитывается (т.к. байт был обнулен)
RRF DeltaLL, f ; ... с учетом переноса. Перенос из младшего байта не учитывается (т.к. байт был обнулен)
DECFSZ CntInt, f ; Декремент счетчика цикла с проверкой на равенство 0
GOTO loop_D2
;----------------------------------------------------------------------------
;-- Вычисление усредненного значения "канала земли" --
MOVFW DeltaHH ; Складываем старшие байты
ADDWF SGndHH, f ; Перенос игнорируем
MOVFW DeltaHL ; Складываем младшие байты
ADDWF SGndHL, f
SKPNC ; Если при сложении младших разрядов перенос не произошел - пропустить следующую команду
INCF SGndHH, f ; При переносе добавить "1" к старшему байту
MOVFW DeltaLH ; Складываем "самые" младшие байты
ADDWF SGndLH, f
BNC sum_ll ; Если при сложении младших разрядов перенос не произошел - пропустить следующую команду
INCF SGndHL, f ; При переносе добавить "1" к старшему байту
SKPNZ ; Если результат не 0 - пропустить следующую операцию
INCF SGndHH, f
sum_ll:
MOVFW DeltaLL
ADDWF SGndLL, f
BNC end_sum_gnd ; В отсутствии переноса перейти к концу операции
INCF SGndLH, f
BNZ end_sum_gnd
INCF SGndHL, f ; При переносе - инкрементировать младший байт усредненного значения
SKPNZ ; Если при инкременте результат не 0 - пропустить следующий оператор
INCF SGndHH, f ; В противном случае инкрементировать старший байт
end_sum_gnd
Ну в начале понятно, на основе сэмпла наподобие скользящего среднего получаем, а дальнейшие манипуляции не могу понять. Какова роль константы AutoSpeed? Роль SGnd понятна - это фон грунта, который вычитается. Но не пойму как вычисляется..