Регистр INTCON, формат которого показан на Рис. 7.3, содержит только бит глобального разрешения прерываний, а также используется для управления тремя основными источниками прерываний, а именно внешним прерыванием, прерыванием по переполнению Таймера 0, а также прерыванием по изменению состояния выводов порта В. Последний оставшийся бит EEIE (INTCON[6]) в модели PIC16F84 используется для хранения бита маски прерывания модуля EEPROM. По причине нехватки места соответствующий ему бит флага прерывания EEIF размещен в другом регистре, а именно в регистре EEC0N1[4] (4-й бит). В 18-выводных моделях среднего уровня того же поколения часто используется такой подход. Например, бит маски прерывания от модуля АЦП ADIE в модели PIC16C71 располагается в INTCON [6], а соответствующий флаг прерывания ADIF находится в регистре управления АЦП ADCONO[1].
Однако в общем случае система прерываний должна быть способна работать со множеством периферийных модулей, каждый из которых, в свою очередь, может иметь одно или несколько прерываний. Одним из вариантов решения такой задачи было бы перемещение битов флагов и масок прерываний в локальные регистры управления и состояния самого модуля, как это было сделано для модуля EEPROM модели PIC16F84. Более логичным, однако, было бы считать систему прерываний самостоятельным модулем и ввести группу дополнительных регистров, содержащих биты масок и флагов всех прерываний.
На Рис. 7.5 показана логика системы прерываний в моделях PIC16F627/8. Эти модели имеют помимо основных еще пять периферийных модулей, формирующих в общей сложности семь отдельных запросов на прерывание. Правая часть схемы, изображенной на рисунке, практически идентична приведенной на Рис. 7.3. Единственное отличие заключается в том, что в данном случае 6-й бит регистра INTCON называется PEIE (разрешение прерывания от периферийных устройств)[104]. Серым цветом в левой части Рис. 7.5 выделены семь дополнительных источников прерываний и логические элементы, используемые для разрешения прерываний от этих источников. Выходы указанных элементов объединены по ИЛИ для формирования одного-единственного сигнала, который, в свою очередь, управляется битом маски PEIE. Так что в этих моделях 6-й бит регистра INTCON выполняет функцию разрешения прерываний от всех дополнительных периферийных модулей.
Рис. 7.5.
Устройства среднего уровня имеют различные наборы периферийных устройств, однако все они используют бит PEIE в качестве дополнительного бита маски для разрешения/запрещения прерываний от этих модулей. Если данный бит установлен, то любое из этих периферийных устройств может быть использовано для вывода микроконтроллера из спящего режима независимо от состояния бита глобального разрешения прерываний GIE.
На Рис. 7.6 изображены два дополнительных регистра.
Рис. 7.6.
ЕЕ — Запись в EEPROM: СМ — Аналоговый компаратор: RC — Прием по USART: ТХ — Передача по USART: SSP — Синхронный последовательный порт: CCP1 — Захват/сравнение 1: TMR2 — Таймер 2: TMR1 — Таймер 1
Регистр флагов прерываний от периферийных устройств PIR1, расположенный в 0-м банке, который содержит семь флагов прерываний, и регистр разрешения прерываний от периферийных устройств PIE1, содержащий соответствующие биты маскирования прерываний. Для примера на рисунке также показано формирование сигнала прерывания, генерируемого при приеме символа со входа последовательного порта (см. Рис. 12.20 на стр. 419), который устанавливает флаг прерывания по приему символа RCIF, расположенный в 5-м бите регистра PIR1. Для разрешения генерации прерывания по этому событию и перехода процессора к обработчику прерывания нам необходимо установить три бита маски.
bsf STATUS,RP0; Переключаемся на 1-й банк, чтобы
bsf STATUS,RP1; обратиться к регистру PIE1
bsf PIE1,RCIE; Разрешаем прерывание по приему символа
bsf INTCON,PEIE; Разрешаем прерывания от периферийных устройств
bsf INTCON,GIE; Разрешаем работу системы прерываний
bcf STATUS,RP0; Возвращаемся в 0-й банк