include "p16f877a.inc"
org 0; Вектор сброса
goto SET_UP; Переход на фоновую программу
org 4; Вектор прерывания
goto ECG_ISR; Обслуживаем прерывание от компаратора
SET_UP
bsf STATUSfRP0; Переключаемся в 1-й банк
movlw b’00000110’; Режим работы компаратора = 110, CIS = 0
movwf CMCON
call DEIAY_17US; Идем 17 мкс для установления напряжений
movf CMCON,f; Читаем СМСОN, чтобы сбросить признак изменения
bsf PIE2,CMIE; Разрешаем прерывания от компаратора
movlw b’10001110’; Модуль CVREF вкл. (1), внутр. ИОН (0)
movwf CVRCON; Верхний диапазон (0), CVR[3:0] = 1110
movlw b’00000101’; RA0/1 — аналоговые входы
movwf ADCON1; RA3 — вход опорного напряжения
movlw b’101111b’; RA4 — выход
movwf TRISA
clrf TRISB; Все выводы порта В — выходы
bcf STATUS,RP0; Возвращаемся в 0-й банк
movlw b’100000011; Включаем модуль АЦП (fosc/32)
movwf ADCONO
bcf PIR2,CMIF; Сбрасываем флаг прерывания от компаратора
bsf INTCON,PEIE; Разрешаем прерывания от периферийных устройств
bsf INTCON,GIE; Разрешаем работу системы прерываний
Выше приведена секция инициализация для нашей программы. В данном случае модули конфигурируются следующим образом:
1. Модуль аналогового компаратора работает в режиме b’110’, при этом CIS = 0. Для выдерживания интервала, требуемого для установления внутренних сигналов модуля, используется подпрограмма DELAY_17US (чтобы не писать отдельный код для формирования 10-мкс задержки). После этого выполняется чтение регистра CMCON для сброса признака изменения состояния компаратора. Затем сбрасывается флаг CMIF и разрешаются прерывания.
2. Модуль CVREF работает в режиме b’1110’ и использует верхний диапазон. Таким образом, он формирует опорное напряжение 3.4375 В.
3. Модуль АЦП работает в режиме Ь’0101’, при котором выводы RA0 и RA1 используются в качестве аналоговых входов, а вывод RA3 — для подачи внешнего опорного напряжения
4. PORTA[4] конфигурируется как выход. Остальные выводы порта А остаются входами для обеспечения функциональности аналоговых входов AIN0, AIN1 и AIN3. Все выводы порта В конфигурируются как выходы.
Код собственно программы приведен в Программе 14.6. В процедуре MAIN микроконтроллер просто переключается в «спящий» режим до момента изменения состояния аналогового компаратора, по которому генерируется прерывание. После возврата управления в фоновую процедуру старший байт трехбайтной переменной, в которой находится вычисленное значение мощности, копируется в порт В, а затем описанный процесс повторяется.