include "p16f877a.inc"
org 0
; Вектор сбросаgoto SET_UP
; Переход на фоновую программуorg 4
; Вектор прерыванияgoto ECG_ISR
; Обслуживаем прерывание от компаратораSET_UP
bsf STATUSf
RP0; Переключаемся в 1-й банкmovlw b’00000110’
; Режим работы компаратора = 110, CIS = 0movwf CMCON
call DEIAY_17US
; Идем 17 мкс для установления напряженийmovf CMCON,f
; Читаем СМСОN, чтобы сбросить признак измененияbsf PIE2,CMIE
; Разрешаем прерывания от компаратораmovlw b’10001110’
; Модуль CVREF вкл. (1), внутр. ИОН (0)movwf CVRCON
; Верхний диапазон (0), CVR[3:0] = 1110movlw 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 микроконтроллер просто переключается в «спящий» режим до момента изменения состояния аналогового компаратора, по которому генерируется прерывание. После возврата управления в фоновую процедуру старший байт трехбайтной переменной, в которой находится вычисленное значение мощности, копируется в порт В, а затем описанный процесс повторяется.