После отклика микроконтроллера на данное прерывание необходимо повторным чтением порта В снять внутренний сигнал, вызвавший установку бита RBIF. При этом в обоих D-защелках окажется одинаковое значение. И только затем можно будет сбросить флаг RBIF. Если этого не сделать, то сразу же после сброса флаг прерывания снова установится.
Приведем пример использования клавиатуры для вывода микроконтроллера из «спящего» режима (предполагается, что бит GIE сброшен, т. е. прерывания в программе не используются):
movf PORTB,w; Считываем порт В, чтобы сбросить защелки
bcf INTCON,RBIF; Сбрасываем флаг прерывания по изменению порта
bsf INTCON,RBIE; Разрешаем генерацию прерывания
sleep; Переходим в «спящий» режим
; ссс-п-и-и-и-и-м…
call DELAY; После «пробуждения» ждем некоторое время
movwf PORTB,w; перед сбросом защелок
bcf INTCON,RBIF; Сбрасываем флаг прерывания
bcf INTCON,RBIE; Запрещаем генерацию прерывания
В большинстве микроконтроллеров PIC имеется относительно мало линий портов ввода/вывода (см. Табл. 11.1). Даже в развитых моделях (например, PIC16F877), имеющих в общей сложности 33 линии ввода/вывода, этих ресурсов может в ряде случаев оказаться недостаточно, особенно если часть выводов будет задействована встроенными периферийными устройствами.
В качестве примера рассмотрим многофункциональную систему охранной сигнализации, которая может контролировать до восьми зон — скажем, этажей многоэтажного здания. В каждой зоне может быть расположено до восьми датчиков движения. Дисплей в виде восьми лампочек, расположенный на посту охраны, используется для индикации зоны, в которой было обнаружено проникновение.
Исходя из условий задачи, нам потребуется 72 линии ввода/вывода (64 входа и 8 выходов). Вместо того чтобы устанавливать в каждой зоне по микроконтроллеру, каждый из которых отсылал бы информацию центральному контроллеру[147], было принято решение
Один из возможных вариантов решения этой задачи изображен на Рис. 11.12. В данном случае порт В используется для реализации внешней шины данных, подключенной к восьми микросхемам параллельных регистров (буферов) с тремя состояниями (по одной для каждой зоны) и одному регистру индикации. Датчики каждой из зон подключаются к локальной шине через эти 8-битные буферы с тремя состояниями. Разрешение одного из восьми буферов осуществляется с использованием дешифратора 3 на 8, подключенного к порту А. К примеру, если RA[2:0] = b’111’ и RA3 = 0, то будет разрешен буферный регистр 7-й зоны, в результате чего с выводов порта В можно будет считать состояния восьми датчиков этой зоны.
Рис. 11.12.
Для управления лампочками бит RA3 необходимо установить в 1, а порт В сконфигурировать как выход. После этого содержимое порта можно будет занести в регистр, выставив на вывод RA0 напряжение НИЗКОГО, а затем ВЫСОКОГО уровня, формируя тем самым нарастающий фронт.
Количество выходных портов в этой системе можно увеличить до восьми, добавив в схему второй декодер 3 на 8, посредством которого будет осуществляться выбор требуемого порта при RA3 = 1. Правда, один или два дополнительных выходных порта можно добавить еще проще, подключив тактовые входы новых регистров к линиям RA1 и RA2. Один из этих портов, к примеру, может использоваться для индикации активного датчика раздела, а для управления звуковым излучателем, включающимся при обнаружении вторжения в любую из зон, можно использовать вывод RA4.
Чтобы продемонстрировать управление такой схемой, рассмотрим подпро грамму, код которой приведен в Программе 11.5. Эта подпрограмма считывает со стояние