Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабы / Lab_moto / 4.doc
Скачиваний:
17
Добавлен:
16.04.2013
Размер:
191.49 Кб
Скачать

1. Внешнее аппаратное прерывание irq.

Как уже было рассмотрено выше, для организации прерывания IRQ микроконтроллер имеет специальный внешний вход (вывод 2 микросхемы). Для подачи прерывания на этот вход на дополнительной плате установлена кнопка, схема подключения которой условно показана на рисунке :

Небольшой комментарий к схеме: на логическом элементе и конденсаторе собран блок, предотвращающий влияние дребезга контактов кнопки на сигнал прерывания, поступающий на вход микроконтроллера. Кроме того, в приведенных ниже экспериментах, нам также необходимо использовать светодиоды и переключатели, установленные на той же дополнительной плате и подключенные к параллельным портам ввода-вывода B и A соответственно. При настроенном на вывод порте В зажженый светодиод сигнализирует о том, что на соответствующей линии порта присутствует сигнал высокого логического уровня. Порт A автоматически настраивается на ввод при включении питания и должен использоваться только в этом режиме. Для настройки портов, необходимо записать в их регистры направления обмена информацией (ячейка $4 для порта A и $5 для B) нужные значения: для настройки какой-либо из линий порта на вывод, необходимо установить соответствующий бит регистра, для настройки на ввод-сбросить бит.

Микроконтроллер может воспринимать сигнал на входе IRQ двумя способами, в зависимости от состояния бита 1 в регистре конфигурации $3FDF (смотри теоретическую часть): либо только по отрицательному фронту сигнала (бит 1 сброшен), либо по отрицательному фронту и по низкому уровню сигнала (бит 1 установлен). Обычно используется первый способ (прерывание только по фронту).

Вектор прерывания IRQ (адрес, по которому происходит переход в случае обработки этого прерывания), располагается в ячейках $1FFA (старший байт адреса перехода) и $1FFB (младший байт).

Таким образом, для использования прерывания IRQ необходимо произвести следующие действия:

  • установить вектор прерывания IRQ на адрес подпрограммы обработки этого прерывания;

  • записать в регистр конфигурации значение, соответствующее выбранному способу обработки входного сигнала IRQ;

  • по адресу, куда указывает вектор IRQ, разместить подпрограмму обработки прерывания, которая должна заканчиваться командой RTI;

  • в основную программу вставить команду CLI для разрешения прерываний;

После этого, если в процессе выполнения основной программы нажать на кнопку IRQ, то работа основной программы приостановится, а управление будет передано подпрограмме обработки прерывания.

Все вышесказанное рассмотрим на примере программы, которая сначала зажигает 4 левых светодиода порта В, а затем, при каждом нажатии на кнопку IRQ, инвертирует их состояние.

Основная программа :

0300 LDA #$FF Программирование порта В

STA $05 на вывод.

LDA #$F0 Запись начального значения (11110000)

STA $01 в порт В.

LDX #$33 Используется для последующего анализа содержимого стека.

CLI Разрешение аппаратных прерываний.

030B BRA 30B Бесконечный цикл (ожидание прерывания).

Подпрограмма обработки прерывания :

0800 COM $01 Инверсия содержимого порта В.

0802 RTI Возврат из прерывания.

Системные установки в памяти :

1FFA #08 Установка вектора прерывания IRQ

1FFB #00 на подпрограмму обработки прерывания

по адресу $0800.

3FDF #00 Установка регистра конфигурации для

обнаружения прерывания по фронту.

Программа работает следующим образом :

После запуска основной программы с адреса $0300 зажигается старшая тетрада светодиодов, после чего программа входит в состояние ожидания запроса на прерывание (бесконечный цикл). Запрос осуществляется нажатием на кнопку IRQ. Так как прерывания разрешены, то происходит переход на подпрограмму обработки прерывания, адрес которой (вектор) должен быть записан в ячейках $1FFA, $1FFB (в нашем случае, там записан адрес $0800). При этом содержимое всех регистров (кроме SP) сохраняется в стеке (см. теоретическую часть). В подпрограмме обработки прерывания содержимое порта В, отображаемое светодиодами, инвертируется, и управление снова передается основной программе. При этом содержимое сохраненных регистров восстанавливается.

Запустим программу (командой 'g 300'): на светодиодах отобразится информация 11110000. При каждом нажатии на кнопку IRQ содержимое светодиодов будет инвертироваться. Выйдем в монитор с помощью кнопки 'Abort'. Просмотрим содержимое стека-пять байт памяти в сторону уменьшения адресов от указателя стека SP (в мониторе указатель стека обозначается именем "S"). Например, если S=$FF, то надо дать команду монитора 'md FB'. Первые пять байт выведенной на экран строки будут соответствовать содержимому стека после перехода на подпрограмму обработки прерывания. Зная последовательность записи регистров в стек, можно определить их значения в момент прерывания. Содержимое регистров должно соответствовать значениям, полученным из анализа программы: A=$F0; X=$33; P=$030B; C=$E0 (значение регистра условий C может отличаться от $E0, однако бит I должен быть сброшен в любом случае, так как мы разрешаем прерывания командой CLI).

Теперь убедимся в возможности запрещения (маскирования) прерываний IRQ. Для этого, вместо команды CLI, запишем команду SEI, запрещающую прерывания. После этого запустим программу. Если теперь нажимать на кнопку IRQ, то состояние светодиодов не изменяется, то есть программа не реагирует на прерывание IRQ. Кстати, сразу после выхода из программы (кнопкой 'Abort'), можно посмотреть содержимое регистра условий C: бит I должен быть установленным, то есть аппаратные прерывания запрещены.

Теперь рассмотрим более сложный пример обработки прерывания. Для этого разберем программу, которая при нажатии на кнопку IRQ гасит светодиоды порта B, а при следующем нажатии-снова зажигает их. Основную программу (адреса $0300..$030B) оставим прежней, а в подпрограмму обработки прерывания внесем изменения:

Подпрограмма обработки прерывания :

0050 JMP $0800 Команда безусловного перехода по указанному адресу.

0800 LDA #$00 Гашение

STA $01 светодиодов.

LDA #$10 Изменение адреса перехода в команде JMP

STA $52 с $800 на $810.

RTI Возврат из прерывания.

0810 LDA #$FF Зажигание

STA $01 светодиодов.

LDA #$00 Изменение адреса перехода в команде JMP

STA $52 с $810 на $800.

RTI Возврат из прерывания.

Системные установки в памяти :

1FFA #$00 Установка вектора прерывания IRQ

1FFB #$50 на подпрограмму обработки прерывания

по адресу $0050H.

3FDF #$00 Установка регистра конфигурации для

обнаружения прерывания по фронту.

Рассмотрим работу программы. Как уже упоминалось, основная программа (настройка порта, зажигание тетрады светодиодов и бесконечный цикл ожидания) осталась прежней. Интерес вызывает подпрограмма обработки прерывания, которую можно разделить на две части: одна начинается с адреса $0800, другая-с $0810, а для передачи управления им используется команда JMP, расположенная в ОЗУ по адресу $0050. Нетрудно заметить, что, какая бы из подпрограмм ни вызывалась, она изменяет состояние светодиодов, а затем подменяет адрес перехода для команды JMP таким образом, что в следующий раз вызывается уже другая подпрограмма обработки прерывания, которая, в свою очередь, изменяет адрес перехода обратно, на первую подпрограмму. Для изменения адреса перехода используется ячейка $0052 ОЗУ, так как именно в ней располагается младший байт адреса перехода для команды JMP. Старший байт адреса перехода (ячейка $51) нам изменять не нужно: он постоянно равен #$08.

Теперь запустим программу командой 'g 300'. При каждом нажатии на кнопку IRQ светодиоды будут то зажигаться, то гаснуть. Понятно, что вместо двух частей в подпрограмме обработки прерывания можно использовать три, четыре и больше частей так, что они будут последовательно ссылаться друг на друга.

Соседние файлы в папке Lab_moto