MAIN sleep; Ждем
nop
movf POWER,w; Берем старший байт значения
movwf PORT В; и выводим его в порт В
goto MAIN
; **************************************
* ФУНКЦИЯ: Обработчик прерывания, в котором вычисляется энергия разряда дефибриллятора *
* ВХОД: По прерыванию от модуля компараторов *
* ВЫХОД: Обновляется значение POWER:3 *
* РЕСУРСЫ: П/п GET_ANALOG, возвращающая 8-битное значение, *
* РЕСУРСЫ: п/п SQUARE, выполняющая умножение 8x8 битов *
; ***************************************
Сначала сохраняем контекст
ECG_ISR movwf _work; Сохраняем W
swapf STATUS,w; и регистр STATUS
movwf status
; ==============================
btfss PIR2,CMIF; Это прерывание от компаратора?
goto ECG_EXIT; ЕСЛИ нет, ТО выходим
clrf POWER; Обнуляем регистры результата
clrf POWER+1
clrf POWER+2; Младший байт
clrf COUNT; Обнуляем счетчик (256 итераций)
bcf PORTA,4; Формируем на RA4
bsf PORTA,4; синхроимпульс
bcf PORTA, 4
ACQUIRE clrw; Канал 0 (W = h'00')
call GET_ANALOG; Запускаем преобразование
addlw -BASELINE; Определяем разность с базовым напряжением
bcfsc STATUS,С; ЕСЛИ заем (С==0), ТО обходим,
goto ECG_CONTINUE; так как разность положительна
xorlw b’11111111’; ИНАЧЕ инвертируем и прибавляем
ECG_CONTINUE
call SQR; Возводим в квадрат
movf SQUARE+1,w; Берем младший байт квадрата напряжения
addwf POWER+2,f; Прибавляем к младшему байту результата
btfss STATUS,С; Проверяем перенос
goto NEXT_BYTE; ЕСЛИ нет, ТО складываем след, байты
movlw 1; Инкрементируем средний байт результата
addwf POWER+1,f
btfsc STATUS,С; Был перенос?
incf POWER,f; ЕСЛИ да, ТО инкрементируем старший байт
NEXT BYTE
movf SQUARE,w; Берем старший байт квадрата напряжения
addwf POWER+1,f; Прибавляем к среднему байту результата
btfsc STATUS,С; Проверяем перенос
incf POWER,f; ЕСЛИ нет, ТО инкрементируем старший байт
call DELAY_470US; Ждем перед следующей выборкой
incfsz COUNT,f; Инкрементируем счетчик цикла и повторяем
goto ACQUIRE; операции, если он не равен 0
;========================
EGG_EXIT sf STATUS,RP0; Сначала сбрасываем признак изменения
movf CMCON,f; состояния компаратора,
bcf STATUS,RP0; читая CMCON из 1-го банка,
bcf PIR2,CMIF; и сбрасываем флаг прерывания
swapf _status,w; Восстанавливаем регистр STATUS
movwf STATUS
swapf _work,f; Восстанавливаем W, не затрагивая
swapf _work,w; регистр STATUS,
retfie ; и выходим из прерывания
После сохранения контекста обработчик прерывания сначала проверяет источник прерывания, а затем сбрасывает счетчик итераций цикла и три регистра, используемые для накопления суммы из 256 квадратов отсчетов напряжения. После этого на выводе RA4 формируется короткий импульс, извещая внешние устройства о начале разряда.