МК PIC16F84. Обработка прерываний.
Суть показана на следующем рисунке:
При воздействии какого-то внешнего события процесс выполнения инструкций прерывается и начинает выполняться код обработчика прерываний. При возврате из обработчика продолжает выполняться основной код с места, в котором возникло прерывание.
В общем, существуют 2 способа ожидать прерывания (код сверху(1) и снизу(2) на следующем рисунке)
1) В цикле проверять наличие прерывания. Такой способ плох тем, что микроконтроллер не сможет заниматься ничем другим, кроме проверки наличия прерывания, что делает его применение очень ограниченным.
2) Поэтому используется второй вариант: при возникновении прерывания прервать выполнение текущего кода и перейти в обработчик прерывания
Виды прерываний для PIC16F84:
1) Окончание процедуры записи в EEPROM.
2) Переполнение таймера TMR0.
3) Изменение кода на входных портах RB4-RB7 (Port B).
4) Внешнее событие на входном порту RB0/INT.
Регистр INTCON содержит различные биты разрешений и флагов прерываний.
Обобщенная схема обработки прерываний для PIC16F84:
Синие контакты – те прерывание, которые разрешил пользователь (программист), зеленые – произошло какое-то внешнее событие. Таким образом, прерывание появляется, если пользователь разрешил его в коде И если произошло внешнее событие.
Пример обработки прерывания:
При обработке прерывания следует сохранять значения пользовательских переменных, аккумулятора и регистра статуса, так как код может прерваться в любой момент, а обработчик прерываний может изменить вышеперечисленные значения. В конце обработчика прерывания их надо восстановить.
Пример сохранения значения аккумулятора (пользовательские переменные и статус по аналогии):
Save: MOVF VAR_1,0 ; W=VAR_1
MOVWF VAR_1_TMP ; VAR_1_TMP=VAR_1
…
Restore:
MOVF VAR_1_TMP,0 ; W=VAR_1_TMP
MOVWF VAR_1 ; VAR_1=VAR_1_TMP