Организация прерываний

МК подгруппы PIC16F8X имеют четыре источника прерываний:

• внешнее прерывание с вывода RBO/INT;

• прерывание от переполнения счетчика/таймера TMRO;

• прерывание от изменения сигналов на линиях порта RB<7:4>;

• прерывание по окончании записи данных в EEPROM.

Все прерывания имеют один и тот же вектор/адрес — 0004п. Однако в управляющем регистре прерываний INTCON соответствующим битом-признаком записывается, от какого именно источника поступил запрос прерывания. Исключение составляет прерывание по завершении записи в EEPROM, признак которого находится в регистре EECON1.


Бит общего разрешения/запрещения прерывания GIE (INTCON <7>) разрешает (если =1) все индивидуально незамаскированные прерывания или запрещает их (если = 0). Каждое прерывание в отдельности может быть дополнительно разрешено/запрещено установкой/сбросом соответ­ствующего бита в регистре INTCON.

Бит GIE при сбросе обнуляется. Когда начинает обрабатываться пре­рывание, бит GIE обнуляется, чтобы запретить дальнейшие прерывания, адрес возврата посылается в стек, а в программный счетчик загружается адрес 0004h. Время реакции на прерывание для внешних событий, таких как прерывание от ножки INT или порта В, составляет приблизительно пять циклов. Это на один цикл меньше, чем для внутренних событий, та­ких как прерывание по переполнению от таймера TMRO. Время реакции всегда одинаковое.

В подпрограмме обработки прерывания источник прерывания может быть определен по соответствующему биту в регистре признаков. Этот флаг-признак должен быть программно сброшен внутри подпрограммы. Признаки запросов прерываний не зависят от соответствующих маскиру­ющих битов и бита общего маскирования GIE.

Команда возврата из прерывания RETFIE завершает прерывающую под­программу и устанавливает бит GIE, чтобы опять разрешить прерывания.

Логика прерываний контроллера изображена на рис. 5.14.

Рис.5.14.Логика прерываний микроконтроллера.

Внешнее прерывание на ножке RBO/INT осуществляется по фронту: либо по нарастающему (если в регистре OPTION бит INTEDG=1), либо по спадающему (если INTEDG=0). Когда фронт обнаруживается на нож­ке INT, бит запроса INTF устанавливается в единицу (INTCON <1>). Это прерывание может быть замаскировано сбросом управляющего бита INTE и ноль (INTCON <4>). Бит запроса INTF необходимо очистить прерыва­ющей программой перед тем, как опять разрешить это прерывание. Пре­рывание INT может вывести процессор из режима SLEEP, если перед вхо­дом в этот режим бит INTE был установлен в единицу. Состояние бита (НЕ также определяет, будет ли процессор переходить на подпрограмму прерывания после выхода из режима SLEEP.

Переполнение счетчика TMRO (FFh->OOh) устанавливает в единицу бит шпроса TOIF (INTCON<2>). Это прерывание может быть разрешено/зап­рещено установкой/сбросом бита маски TOIE (INTCON<5>). Сброс зап­роса TOIF - дело программы обработки.

Любое изменение сигнала на одном из четырех входов порта RB<7:4> устанавливает в единицу бит RBIF (INTCON<0>). Это прерывание может быть разрешено/запрещено установкой/сбросом бита маски RBIE (1NTCON<3>). Сброс запроса RBIF — дело программы обработки.

Признак запроса прерывания по завершении записи в EEPROM, EEIF (EECON1<4>) устанавливается в единицу по окончании автоматической шписи данных в EEPROM. Это прерывание может быть замаскировано сбросом бита EEIE (INTCON<6>). Сброс запроса EEIF - дело программы обработки.