При изменении выходного сигнала компаратора устанавливается флаг прерывания от компаратора CMIF, расположенный у микроконтроллера PIC16F687XA в регистре PIR[2], а при установленном бите маски CMIE (Р1Е2[6] для PIC16F87XA) будет сгенерировано прерывание от компаратора, если, разумеется, бит глобального разрешения прерываний также установлен в 1. Поскольку эта линия прерывания используется обоими компараторами, программа должна хранить информацию о предыдущих значениях битов C1OUT и C2OUT, чтобы иметь возможность определить, состояние какого из компараторов действительно изменилось. Эта информация может обновляться в обработчике прерывания. После чтения регистра CM CON несоответствие между новым и предыдущим состояниями компаратора, вызвавшее установку флага прерывания, будет устранено — точно так же, как и в случае прерывания по изменению состояния выводов порта В, описанного на стр. 347. Только после выполнения этой операции можно сбрасывать флаг CMIF. Если режим компаратора изменяется «на лету», то перед этим изменением следует запретить прерывание от компаратора. Выждав после изменения режима не менее 10 мкс (в течение этого времени стабилизируются значения сигналов), регистр CMCON необходимо повторно считать для сброса возможного несоответствия, а затем сбросить флаг CMIF перед повторным разрешением работы системы прерываний.
Поскольку модуль компаратора не использует системный тактовый сигнал, активный компаратор можно задействовать для вывода микроконтроллера из «спящего» режима при переходе внешнего сигнала через пороговое значение
Необходимо отметить, что включенный компаратор потребляет ток, который намного больше базового значения потребления в «спящем» режиме. Например, типичный ток потребления микроконтроллеров PIC12F629/675 в «спящем» режиме составляет 2.9 нА при напряжении 5 В (995 нА mах), а модуль компаратора в среднем потребляет 11.5 мкА (16 мкА mах). Так что если компараторы не используются во время «сна» микроконтроллера, то они должны быть выключены.
В режиме b’110’ каждый из компараторов может контролировать один из двух сигналов, определяемый состоянием бита входного ключа компаратора CIS (CMCON[3]), который при включении питания сбрасывается в 0. Неинвертирующие входы обоих компараторов в этом режиме подключены к внутреннему источнику опорного напряжения, формируемого модулем
Этот модуль CVR имеется во всех моделях микроконтроллеров с модулем компаратора. Как видно из Рис. 14.7, данный модуль представляет собой аналоговый мультиплексор с подключенной к нему резистивной цепочкой, на выходе которого в соответствии со значениями битов CVR[3:0] регистра управления CVRCON (CVRCON[3:0]) может быть сформировано одно из 16 различных напряжений. Модуль опорного напряжения включается при установке бита разрешения CVREN (CVRCON[7]). При этом цепочка последовательно соединенных резисторов, номинальное сопротивление каждого из которых равно 2 кОм, подключается к шине питания
Рис. 14.7.
В распоряжении пользователя имеется два диапазона опорного напряжения. Конкретный диапазон задается битом CVRR (CVRCON[5]), который подключает или отключает дополнительный резистор сопротивлением 8
где
Погрешность установки напряжения составляет 1/2 шага, но в реальности абсолютное значение выходного напряжения модуля прямо пропорционально напряжению питания, величина которого обычно задается не слишком точно. Кроме того, значение VDD может изменяться при уходе напряжения источника питания или батареи из-за температуры или тока нагрузки. Даже любая помеха по шине питания отразится на опорном напряжении, хотя действие помех в какой-то степени можно ослабить посредством фильтрующих конденсаторов и корректной разводкой линий питания. Поэтому в тех случаях, когда требуется точное значение напряжения, часто используются внешние прецизионные источники опорного напряжения. В частности, при работе модуля компаратора в режиме Ь’100’ этот источник подключается к выводу RA3 (см. Рис. 14.20).
Предположим, что мы собираемся получить пороговое напряжение величиной 3.4 В (Рис. 14.5) при VDD = 5 В. Нам придется использовать верхний диапазон, т. е. CVRR = 0. Вычислим значение битов CVR[3:0]:
5 х (0.25 +
0.25 +
Таким образом, наиболее близкое к заданному напряжение получится при