Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
LAB4_W95.DOC
Скачиваний:
15
Добавлен:
16.04.2013
Размер:
176.13 Кб
Скачать

4.2. Практическая часть.

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

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

Небольшой комментарий к схеме: на логическом элементе и конденсаторе собран блок, предотвращающий влияние дребезга контактов кнопки на сигнал прерывания, поступающий на вход микроконтроллера. Кроме того, на плате имитатора установлены 8 светодиодов и 8 переключателей и подключенные к параллельным портам ввода-вывода 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 Установка регистра конфигурации для обнаружения прерывания по фронту.

Примечание. В связи с характерными особенностями эмуляции по адресу регистра конфигурации ($3FDF) необходимо перезаписывать информацию перед каждым запуском программы.

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

После запуска основной программы с адреса $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светодиоды будут то зажигаться, то гаснуть. Понятно, что вместо двух частей в подпрограмме обработки прерывания можно использовать три, четыре и больше частей так, что они будут последовательно ссылаться друг на друга.

Соседние файлы в предмете Отладка микроконтроллеров ЭВМ