Организация прерываний
МК подгруппы 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 - дело программы обработки.