В Программе 14.4 используется подпрограмма GET_ANALOG из Программы 14.1, а также необходимая для ее работы подпрограмма формирования 17-мкс задержки. Однако, поскольку в данном случае интервал между вызовами подпрограммы достаточно велик, длительность задержки при необходимости можно уменьшить до 10 мкс.
; ************************************
; * ФУНКЦИЯ: Обработчик для обновления параметров ЭКГ *
; * ВХОД: По прерыванию от Таймера 0 *
; * ВЫХОД: Обновляет MAXIMUM и THRESHOLD: THRESHOLD+1 *
; * РЕСУРСЫ: П/п GET_ANALOG, возвращающая 8-битное значение *
**************************************
; Сначала сохраняем контекст
EKG_ISR movwf _work; Сохраняем W
swapf STATUS,w; и регистр STATUS
movwf _status
; ===========================
btf ss INTCON,T0IF; Это было прерывание от Таймера 0?
goto EKG_EXIT; ЕСЛИ нет, ТО выходим
bcf INTCON,T0IF; Сбрасываем флаг
movlw 1; Запускаем преобразование
call GET_ANALOG; по 1-му каналу
movwf TEMP; Сохраняем оцифрованное значение
subwf THRESHOLD,w; THRESHOLD — ANALOG
btf sc STATUS,С; ЕСЛИ нет заема, ТО
goto BELOW; не обновляем MAXIMUM
movf TEMP,w; ИНАЧЕ берем оцифрованное значение
movwf MAXIMUM; которое становится новым MAXIMUM
movwf PORTB; Выдаем наружу
bsf PORTA,5; Сообщаем об этом
movwf THRESHOLD; Теперь обновляем 2-байтный
clrf THRESHOLD+1; порог
goto EKG_EXIT; и выходим
; Сюда попадаем, если входной сигнал ниже порога
BELOW bcf PORTA,5; Сообщаем об отсутствии обновления
; Теперь уменьшаем порог на 1/64 до нуля
movf THRESHOLD,f; Целая часть порога равна нулю?
btfsc STATUS,Z; ЕСЛИ нет, ТО пропускаем
goto EKG_EXIT; ЕСЛИ да, ТО выходим
movlw h’04’; 1/64 = b’000001000’
subwf THRESHOLD+1,f; Вычитаем из байта дробной части
btfss STATUS,С; Пропускаем, если нет заема
decf THRESHOLD,f; ИНАЧЕ декрементируем целую часть
; ==========================
EKG_EXIT swapf _status,w; Восстанавливаем STATUS
movwf STATUS
swapf _work,f; Восстанавливаем W,
swapf _work,w; не затрагивая регистр STATUS,
retfie; и выходим из прерывания
В Программе 14.5 приведена программа на языке Си, реализующая тот же самый алгоритм. Директива #int_rtcc указывает компилятору интерпретировать описанную после нее функцию как процедуру обработки прерывания от часов реального времени (Таймера 0). Переменные threshold и maximum в функции ecg_isr () объявлены как