Рабочий регистр и регистр STATUS сохраняются в памяти программ, как это было описано на стр. 217.
Основной код
Сбрасывается флаг внешнего прерывания INTF (INTCON[l]), чтобы избежать обработки ложного прерывания при возврате в фоновую программу. При наличии нескольких источников прерывания на данном этапе должен был бы производиться опрос различных флагов прерываний (см. стр. 219).
Основная задача обработчика прерываний заключается в инкрементировании регистра EVENT. Вычитая число 24 из копии этой переменной и контролируя заем (т. е. равенство С единице), программа определяет момент, когда число EVENT становится равно или даже больше 24. При этом инкрементируется переменная BATCH для передачи в фоновую программу информации о том, что прошли очередные 24 банки, a EVENT обнуляется. То есть регистр EVENT играет роль счетчика по модулю 24.
Восстановление контекста
При возврате из обработчика прерывания восстанавливаются исходные значения регистров W и STATUS, как было описано на стр. 218. Заключительная команда retfie не изменяет состояние флагов регистра STATUS.
На фабрике по производству пищевых продуктов банки с тушеной фасолью проходят по конвейеру через туннельную печь, как показано в верхней части Рис. 7.7, где их содержимое стерилизуется. Фотодетекторы используются для подсчета банок, вошедших в печь и вышедших из нее. При пересечении луча на выходе соответствующего фотодетектора устанавливается ВЫСОКИЙ уровень.
Вам требуется разработать интерфейс данной системы, управляемый прерываниями, объединив два сигнала для активизации одного входа INT микроконтроллера. Звуковой излучатель, подключенный к 0-му выводу порта В, должен подать звуковой сигнал, сигнализируя о заторе, если количество банок в печи станет больше четырех.
Решение
С аппаратной точки зрения в данном примере имеется две задачи. Первая — как определить, какой из детекторов, входной или выходной, сформировал запрос прерывания. Из Рис. 7.7 видно, что при перекрывании луча оба фотоэлемента формируют тактовый импульс, подаваемый на тактовый вход соответствующего D-триггера. Поскольку вход триггера подтянут к лог. 1, подача тактового импульса вызывает переключение триггера в состояние лог. 1. За счет объединения выходных сигналов обоих триггеров по ИЛИ при перекрытии любого луча на выводе INT формируется нарастающий фронт сигнала.
Рис. 7.7.
Состояние обоих внешних флагов IN и OUT можно считать соответственно с входов RA0 и RA1 порта А, что позволяет различать эти два события (вход банки в печь и ее выход) в обработчике прерывания. Соответствующий флаг затем можно сбросить, подав управляющий сигнал на вход сброса соответствующего триггера. Под эти сигналы задействованы еще две линии порта — RA2 и RA3 (CanceMN и Cancel_OUT соответственно).
Чтобы проиллюстрировать работу этого узла, предположим, что банка только что пересекла луч выходного детектора, как показано на Рис. 7.7. При этом произойдут следующие события:
1. Импульс, сформированный детектором, подается на триггер выходного датчика OUT.
2. Триггер переключается, что, в свою очередь, приводит к появлению ВЫСОКОГО уровня на выводе RA1, а также на входе INT/RB0 (через элемент ИЛИ). Последний сигнал является запросом внешнего прерывания.
3. Когда микроконтроллер передает управление на обработчик прерывания, тот проверяет состояние обоих триггеров, считывая биты RA1 и RA2 порта. В данном случае на выводе RA1 будет присутствовать ВЫСОКИЙ уровень, соответственно обработчик выдаст отрицательный импульс на вывод RA3.
4. Этот импульс сбросит триггер выходного датчика (OUT) и таким образом прекратит генерацию запроса прерывания от данного источника.
Осталась одна проблема: если событие наступит до того, как программа сбросит соответствующий внешний триггер, то это событие будет пропущено, поскольку с выхода элемента ИЛИ на вход INT будет подаваться сигнал НИЗКОГО уровня. В данной ситуации последующие фронты не будут сформированы, и система прерываний надолго окажется заблокированной! Эту ситуацию можно обойти программным способом, опрашивая оба внешних флага перед выходом из обработчика прерывания и выполняя соответствующие действия, если состояние обоих битов порта отлично от нуля.
Процедура обработки прерывания для данного случая приведена в Программе 7.3. Контекст программы сохраняется при входе в обработчик и восстанавливается при выходе из него так, как уже было описано на стр. 217.