Прерывания

 

Прерывания в PIC16C71 могут быть от четырех источников:

- внешнее прерывание с ножки RB0/INT,

- прерывание от переполнения счетчика/таймера RTCC,

- прерывание по окончании аналого-цифрового преобразовкания

- прерывание от изменения сигналов на ножках порта RB<7:4>. Все прерывания имеют один и тот же вектор/адрес - 0004h. Однако, в управляющем регистре прерываний INTCON записывается от какого именно источника поступил запрос прерывания соответствующим битом-флагом GIE. Такое прерывание может быть замаскировано индивидуально или общим битом GIE (1-запрещены, 0-разрешены). Единственным исключением является прерывание по концу аналого-цифрового преобразования. Этот флаг (ADIF) находится в другом регистре ADCON0.

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

Бит GIE обнуляется при сбросе. Когда начинает обрабатываться прерывание, бит GIE обнуляется, чтобы запретить повторные прерывания в момент выполнения текущего, и востанавливается по команде возврат из прерывания. ВНИМАНИЕ! Программа обработки прерывания не должна каким либо способом устанавливать бит GIE.

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

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

Управляющий регистр прерываний INTCON(Адрес: 0Bh. Значение при reset: 0000 000?) имеет следующее содержание:

 

7 6 5 4 3 2 1 0

GIE ADIE RTIE INTE RBIE RTIF INTF RBIF

 

RBIF - Флаг прерывания от изменения на порту RB.

Флаг устанавливается, когда сигнал на входе RB<7:4> изменяется.

Флаг сбрасывается программным способом.

 

INTF - Флаг прерывания INT.

Флаг устанавливается, когда на ножке INT появляется сигнал от внешнего источника прерывания.

Флаг сбрасывается программным способом.

 

RTIF - Флаг прерывания от переполнения RTCC.

Флаг устанавливается, когда RTCC переполняется.

Флаг сбрасывается программным способом.

 

RBIE - Бит разрешения/запрещения RBIF прерывания:

RBIE = 0: запрещает RBIE прерывание.

RBIE = 1: разрешает RBIE прерывание.

 

INTE - Бит разрешения/запрещения INT прерывания:

INTE = 0: запрещает INT прерывание.

INTE = 1: разрешает INT прерывание.

 

RTIE - Бит разрешения/запрещения RTIF прерывания:

RTIE = 0: запрещает RTIE прерывание.

RTIE = 1: разрешает RTIE прерывание.

 

ADIE - Бит разрешения/запрещения прерывания от аналого-цифрового

преобразователя:

ADIE = 0: запрещает ADIF прерывание.

ADIE = 1: разрешает ADIF прерывание.

 

GIE - Бит разрешения/запрещения всех прерываний:

GIE = 0: запрещает прерывания.

GIE = 1: разрешает прерывания.

Он сбрасывается автоматически при следующих обстоятельствах:

- по включению питания,

- по внешнему сигналу /MCLR при нормальной работе,

- по внешнему сигналу /MCLR в режиме SLEEP,

- по окончанию задержки таймера WDT при нормальной работе,

- по окончанию задержки таймера WDT в режиме SLEEP.

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

Переполнение счетчика RTCC (FFh->00h) установит бит запроса RTIF (INTCON<2>). Это прерывание может быть разрешено/запрещено установкой/сбросом бита маски RTIE (INTCON<5>).

Сброс запроса RTIF —дело программы обработки.

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

Сброс запроса RBIF —дело программы обработки.

Конец АЦП преобразования обозначается выработкой прерывания и установкой флага ADIF в регистре ADCCON управления АЦП. Этот флаг должен сбрасываться программой.

 

3.9. Порты ввода/вывода

 

Микроконтроллер имеет два порта: 5 битный порт RA и 8 битный порт RB с побитовой индивидуальной настройкой на ввод или на вывод. Эти же линии портов используются для подключения к АЦП и к линии внешнего прерывания. В этом случае число линий ввода/вывода общего пользования уменьшается.

Порт А - это порт шириной 5 бит, соответствующие ножки кристалла RA<4:0>. Линии RA<3:0> двунаправленные, а линия RA4 -выход с открытым стоком. Организация разрядов RA3:RA0 порта А приведена на рис.3.8. Адрес регистра порта А - 05h. Относящийся к порту А управляющий регистр TRISA расположен на первой странице регистров по адресу 85h. TRISA<4:0> - это регистр шириной 4 бита, он не управляет битом RA<5>, а только битами RA<4:0>. Ввод сигнала с вывода RA5 можно осуществлять, когда на него выведена "1".

 

 

Защелка для бита данных Ко входу модуля АЦП

D Q   C /Q   C
от шины данных

Vdd

XOR
n
p

Вывод порта
WR Port
       
 
   
p

 


Это один из бит TRIS рег

от W рег

       
 
   
 
D Q   C R /Q   C

 


  AND
по команде"TRIS f"

n

Reset

 

на шину Vss

           
   
 
   
 
 

 


RD TRIS

 

Защелка на вход

 
 

 


RD Port

на вход счетчика RTCC

 
 

 


Рис. 3.8. Организация разрядов RA3/RA0 порта А

 

Если бит управляющего регистра TRISA имеет значение равное "1", то соответствующая линия будет устанавливаться на ввод. Ноль переключает линию на вывод и одновременно выводит на нее содержимое соответствующего бита регистра защелки.

Выводы RA<3:0> могут быть также использованы как каналы аналоговых входов AIN3 -AIN0. Вывод RA3 также используется для обеспечения внешнего опорного напряжения для АЦП Vref. Чтобы определить конфигурацию ножек как цифровую (то есть порт) или как аналоговую, надо установить два бита в управляющем регистре ADCON1 (адрес 88h). Когда выводы определены как аналоговые входы, значение регистра TRISA не будет играть никакой роли. После сброса при включении питания выводы RA<3:0> конфигурируются как аналоговые входы.

Вывод RA4/RT СС(TOCKI) имеет несколько другую схему. Она приведена ниже на рис. 3.9.

 

 

Защелка для бита данных

D Q   C /Q   C
от шины данных


n

Вывод порта RA4/RTCC(TOCI)
WR Port
p

 


Это один из бит TRIS рег

от W рег

D Q   C R /Q   C
       
 
   
 

 


  AND
по команде"TRIS f"

n

Reset i

 

на шину Vss

       
   
 
 

 


RD TRIS

 

Защелка на вход

 
 

 


RD Port

на вход счетчика RTCC

 
 

 


Рис. 3.9. Организация разрядов RA4 порта А

 

Порт В -это двунаправленный порт, шириной в восемь бит (адрес регистра 06h). Относящийся к порту В управляющий регистр TRISB расположен на первой странице регистров по адресу 86h. Если бит управляющего регистра TRISB имеет значение "1", то соответствующая линия будет устанавливаться на ввод. Ноль переключает линию на вывод и одновременно выводит на нее содержимое соответствующего регистра защелки.

У каждой ножки порта В имеется небольшая активная нагрузка (около 250 мкА) на линию питания. Она автоматически отключается, если эта ножка запрограммирована как вывод. Более того, управляющий бит RBPU OPTION<7> может отключить (RBPU=1) все нагрузки. Сброс при включении питания также отключает все нагрузки.

Четыре линии порта В (RB<7:4>) имеют способность вызвать прерывание при изменении значения сигнала на любой из них. Если эти линии настроены на ввод, то они опрашиваются и защелкиваются в цикле чтения Q1. ВНИМАНИЕ! При узких импульсах на входе, опрос процессором может "промахиваться" мимо фронтов. Такие импульсы советуем регистрировать через RTCC.

Новая величина входного сигнала сравнивается со старой в каждом командном цикле. При несовпадении значения сигнала на ножке и в защелке, генерируется высокий уровень. Выходы детекторов "несовпадений" RB4, RB5, RB6, RB7 объединяются по ИЛИ и генерируют прерывание RBIF (запоминаемое в INTCON<0>).

Любая линия, настроенная как вывод, не участвует в этом сравнении.

Прерывание может вывести кристалл из режима SLEEP. В подпрограмме обработки прерывания следует сбросить запрос прерывания одним из следующих способов:

1) Запретить прерывания при помощи обнуления бита RBIE в INTCON<3>.

2) Прочитать порт В. Это завершит состояние сравнения.

Прерывание по несовпадению и программно устанавливаемые внутренние активные нагрузки на этих четырех линиях могут обеспечить простой интерфейс например с клавиатурой, с выходом из режима SLEEP по нажатию клавиш.

вывод RB0 совмещена с входом внешнего прерывания INT.