MAIN sleep
; Ждемnop
movf POWER,w
; Берем старший байт значенияmovwf PORT В
; и выводим его в порт Вgoto MAIN
; **************************************
* ФУНКЦИЯ: Обработчик прерывания, в котором вычисляется энергия разряда дефибриллятора *
* ВХОД: По прерыванию от модуля компараторов *
* ВЫХОД: Обновляется значение POWER:3 *
* РЕСУРСЫ: П/п GET_ANALOG, возвращающая 8-битное значение, *
* РЕСУРСЫ: п/п SQUARE, выполняющая умножение 8x8 битов *
; ***************************************
Сначала сохраняем контекст
ECG_ISR movwf _work
; Сохраняем Wswapf STATUS,w
; и регистр STATUSmovwf status
; ==============================
btfss PIR2,CMIF
; Это прерывание от компаратора?goto ECG_EXIT
; ЕСЛИ нет, ТО выходимclrf POWER
; Обнуляем регистры результатаclrf POWER+1
clrf POWER+2
; Младший байтclrf COUNT
; Обнуляем счетчик (256 итераций)bcf PORTA,4
; Формируем на RA4bsf 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
; Восстанавливаем регистр STATUSmovwf STATUS
swapf _work,f
; Восстанавливаем W, не затрагиваяswapf _work,w
; регистр STATUS,retfie
; и выходим из прерыванияПосле сохранения контекста обработчик прерывания сначала проверяет источник прерывания, а затем сбрасывает счетчик итераций цикла и три регистра, используемые для накопления суммы из 256 квадратов отсчетов напряжения. После этого на выводе RA4 формируется короткий импульс, извещая внешние устройства о начале разряда.