В Программе 14.4 используется подпрограмма GET_ANALOG
из Программы 14.1, а также необходимая для ее работы подпрограмма формирования 17-мкс задержки. Однако, поскольку в данном случае интервал между вызовами подпрограммы достаточно велик, длительность задержки при необходимости можно уменьшить до 10 мкс.; ************************************
; * ФУНКЦИЯ: Обработчик для обновления параметров ЭКГ *
; * ВХОД: По прерыванию от Таймера 0 *
; * ВЫХОД: Обновляет MAXIMUM и THRESHOLD: THRESHOLD+1 *
; * РЕСУРСЫ: П/п GET_ANALOG, возвращающая 8-битное значение *
**************************************
; Сначала сохраняем контекст
EKG_ISR movwf _work;
Сохраняем Wswapf STATUS,w;
и регистр STATUSmovwf _status
; ===========================
btf ss INTCON,T0IF
; Это было прерывание от Таймера 0?goto EKG_EXIT
; ЕСЛИ нет, ТО выходимbcf INTCON,T0IF
; Сбрасываем флагmovlw 1
; Запускаем преобразованиеcall GET_ANALOG
; по 1-му каналуmovwf TEMP
; Сохраняем оцифрованное значениеsubwf THRESHOLD,w
; THRESHOLD — ANALOGbtf sc STATUS,С
; ЕСЛИ нет заема, ТОgoto BELOW
; не обновляем MAXIMUMmovf TEMP,w
; ИНАЧЕ берем оцифрованное значениеmovwf MAXIMUM
; которое становится новым MAXIMUMmovwf 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
; Восстанавливаем STATUSmovwf STATUS
swapf _work,f
; Восстанавливаем W,swapf _work,w
; не затрагивая регистр STATUS,retfie
; и выходим из прерыванияВ Программе 14.5 приведена программа на языке Си, реализующая тот же самый алгоритм. Директива #int_rtcc
указывает компилятору интерпретировать описанную после нее функцию как процедуру обработки прерывания от часов реального времени (Таймера 0). Переменные threshold и maximum в функции ecg_isr () объявлены как