Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Консп лек по ЭиУА.doc
Скачиваний:
1
Добавлен:
01.04.2025
Размер:
934.4 Кб
Скачать

11.2 Подсчет посетителей с помощью прерываний

Рассмотрим задачу подсчета числа посетителей в небольшом магазине. Одним из возможных решений является использование пары маломощный лазер — фотоэлемент, расположенных по бокам от входной двери. При пересечении луча покупателем на управляющий микроконтроллер поступит сигнал в виде прямоугольного импульса, как показано на рисунке 11.1. В этот момент микроконтроллер может быть занят выполнением своей основной задачи, например, организацией обмена данными между торговым терминалом и основным компью­тером склада.

Рисунок 11.1- Контроль числа посетителей магазина

Предположим, что при каждом проходе покупателя в магазин инкрементируется регистр, который мы назовем EVENT. Разумеется, покупатели будут еще и выходить из магазина, однако, если проход достаточно узкий, мы можем просто разделить общее количество проходов на два, чтобы получить реальное число по­сетителей. Таким образом, максимальное число посетителей, регистрируемое системой, составит 128. В подпрограмме обработчика прерываний применяется команда SWAPF, поскольку она не меняет состояние регистра STATUS.

Фрагменты программы подсчета числа посетителей.

include <p16F877.inc>

_STATUS EQU h'51'; регистр, для сохранения состояния Status.

EVENT EQU h'52'; счетчик событий при прерываниях.

_WORK EQU h'53'; регистр, для сохранения состояния аккумулятора W.

org h’000’; адрес вектора сброса.

GOTO MAIN; записываем по адресу h’000’.

org h’004’; адрес вектора прерывания.

GOTO PERS_COUNT; записываем по адресу h’004.

MAIN; метка фоновой (основной) программы.

BSF INTCON, INTE; разрешаем внешние прерывания.

BSF INTCON, GIE; разрешаем работу прерываний.

CLRF EVENT; очищаем счетчик событий (посетителей).

. . . .

GOTO$; конец главной программы.

PERS_COUNT; подпрограмма - обработчик прерываний.

BCF INTCON, INTE; запрещаем внешние прерывания.

MOVWF _WORK; сохраняем значение W в регистре _WORK.

SWAPF STATUS, W

MOVWF _STATUS; сохраняем значение регистра Status.

BCF INTCON, INTF; сбрасываем флаг внешнего прерывания.

INCF EVENT, F; регистрация очередного посетителя.

SWAPF _STATUS, W; возвращаем значение регистра Status.

MOVWF STATUS

SWAPF _WORK, F

SWAPF _WORK, W; возвращаем значение аккумулятора W.

BSF INTCON, INTE; разрешаем внешние прерывания.

RETFIE; возврат в фоновую программу из обработчика.

END

Процедуры обработки и других прерываний аналогичны обыч­ным подпрограммам, однако необходимо помнить следующее:

- обработчик прерывания должен завершаться командой Retfie.

- аккумулятор (W), а также все РСН, изменяемые в обработчике прерывания, должны быть сохранены при входе в обработчик. И при выходе из него восстановлены, если они используются в фоновой программе.

- параметры не могут передаваться обработчику прерываний или из обработчика прерывания через рабочий регистр (W). Вместо этого, при необходимости, следует использовать глобальные переменные (данные, расположенные в памяти по известному адресу).

- обработчики прерывания должны быть как можно быстрее, т.е. быть короткими и должны выполнять минимальный набор операций.