Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Конспект мпсу.doc
Скачиваний:
88
Добавлен:
22.09.2019
Размер:
6.71 Mб
Скачать

Тема 1.4 Режимы работы микропроцессорной системы

1.4.1 Программный обмен

1.4.2 Вызов подпрограмм

1.4.3 Прерывание программы

1.4.4 Упражнения. Подготовка к лабораторным работам №3, 4

1.4.1 Программный обмен

Программный обмен - это основной режим работы МПС. Логика программного обмена проста: МП выбирает из памяти очеред­ную команду программы и выполняет ее. Адрес выполняемой команды формируется в специальном регистре, называемом программным счетчиком РС (Program Counter) или просто счетчиком команд (СК). При включении МП СК обнуляется, поэтому первым адресом является 0, и первая команда программы всегда записывается в ячейку с нулевым адресом. После извлечения команды из памяти счетчик команд формирует следующий адрес, в простейшем случае к содержимому СК просто прибавляется 1. Более сложный вариант, если из памяти извлекается команда перехода. В этом случае адрес следующей команды указывается в самой команде или вычисляется.

Ниже представлены два фрагмент программ, написанных на языке ассемблера и листинги их перевода. В листинге для каждой команды указан адрес ячейки и машинный код команды, записанные в шестнадцатеричной системе счисления.

Во фрагменте 1 директива .org 0 предписывает записать первую команду в ячейку с адресом 0. Следующие команды займут соответственно ячейки с адресами 1 и 2. Команды будут выполняться по очереди и первым будет очищен регистр r0, затем r1 и r2.

Фрагмент 1:

.org 0 ;организовать запись следующей команды в ячейку

;с адресом 0

clr r0 ;очистить регистр r0

clr r1

clr r2

Адрес ячейки Код команды Команда

000000 2400 clr r0

000001 2411 clr r1

000002 2422 clr r2

Во фрагменте 2 поочередное (линейное) выполнение команд нарушают команды прыжков. Содержимое счетчика команд будет изменяться так: 0, 10, 1, 2,12, и регистры будут очищаться в таком порядке: r16, r0, r1. После этого программа закончится пустой командой. Регистр r2 останется неочищенным.

Фрагмент 2:

.org 0 ;организовать запись следующей команды в ячейку

;с адресом 0

rjmp 10 ;прыжок на ячейку с адресом 10 (000а)

clr r0 ;очистить регистр r0

clr r1

rjmp 12 ;прыжок на ячейку с адресом 12 (000с)

clr r2

.org 10 ;организовать запись следующей команды в ячейку

;с адресом 10

clr r16

rjmp 1 ;прыжок на ячейку с адресом 1

nop ;нет операции (пустая команда)

Адрес ячейки Код команды Команда

000000 c009 rjmp 10

000001 2400 clr r0

000002 2411 clr r1

000003 c008 rjmp 12

000004 2422 clr r2

.org 10

00000a (10) 2700 clr r16

00000b (11) cff5 rjmp 1

00000c (12) 0000 nop

1.4.2 Вызов подпрограмм

Если какой либо фрагмент повторяется в программе несколько раз, его удобно оформить в виде подпрограммы. Для этого повторяющиеся фрагменты удаляется из программы и записываются в виде отдельной программы – подпрограммы. В основной программе на место удаленного фрагмента записывается специальная команда CALL addr – вызов подпрограммы по указанному адресу (addr). Текст программы становится проще, программа становится более структурированной и занимает в памяти меньше места, хотя время выполнения программы при этом не уменьшается. Для выполнения подпрограмм МП должен иметь две специальные команды:

1) вызов подпрограммы (CALL addr);

2) возврат из подпрограммы (Return).

Рассмотрим механизм выполнения подпрограммы.

По команде CALL addr, адрес подпрограммы загружается в РС, обес­печивая в следующем командном цикле выборку первой команды подпрограммы. Пред­варительно текущее содержимое РС (адрес возврата) сохраняется в стеке. Подпрограмма выполняется как обычная программа, и по команде RETURN, завершающей подпрограмму, происходит выход из подпрограмма и возврат к основной программе. Адрес возврата извлекается из стека и записывается в Счетчик команд.

Одна и та же подпрограмма может быть вызвана любое количество раз из любого места основной программы. Кроме того, в подпрограмму могут быть вложено несколько других подпрограмм. Процедура вложения подпрограмм организуется с помощью стека. Стек организуется в ОЗУ.

Рисунок 1 - Вложение подпрограмм

Обращение к ячейкам стека производится с помощью специального регистра - указа­теля стека SP (Stack Pointer). По первой команде CALL адрес, следующий за командой (адрес возврата) Ai+1 , записывается в ячейке стека, на которую указывает указатель стека SP. После чего содержимое SP ав­томатически уменьшается на 1, адресуя следующую, еще ячейку стека и в эту ячейку записывается следующий адрес возврата Bi+1 и т.д. Таким образом, стек заполняется «свеху-вниз», и сколько бы ни было вложений, в нижней ячейке будет находится адрес возврата из последней подпрограммы. Возврат к основной программе происходит в обратном порядке: , адрес вершины стека показывает SP. Например, если стек начинается с адреса 07, то на рисунке 7 показана процедура его заполнения.

Адрес ОЗУ

Содержимое

Вершина стека

SP

$025f

Ai+1

SP-1

$025e

Bi+1

Рисунок 2 - Работа стека

По команде RETURN проиcходит считывание из вер­шины стека последнего записанного адреса (Bi+1) и происходит выход из второй подпрограммы в первую, при этом содержимое SP уменьшается на 1, и по следующей команде RETURN в СК перепишется адрес (Ai+1), и произойдет выход из первой подпрограммы в основную программу.

Урок №10

1.4.3 Прерывание программы

Прерывание программы – это такой режим работы МП, когда возникает ситуация, требующая немедленного вмешательства. МП приостанавливает на время выполнение основной программы и переходит на выполнение подпрограммы обработки прерывания.

Источниками прерываний могут быть внешние или внутренние устройства МП, а также сбои, возникающие в работе МП, например, снижение напряжение питания ниже допустимого уровня.

Прерывание – наиболее эффективный способ обмена с внешними устройствами. Как правило, все внешние устройства работают на порядок медленнее, чем МП, поэтому используя режим прерывания МП, может совместить процедуру обмена с ВУ с выполнением основной программы.

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

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

Адрес возврата - адрес команды основной программы, к которой необходимо вернуться по завершении прерывания, он сохраняется в стеке.

Программа обработки прерывания (ПОП) – программа, которая должна быть выполнена после прерывания основной программы. Адрес этой программы указывается в векторе прерывания. ПОП заканчивается командой RETI – возврат из прерывания. По команде RETI из стека извлекается адрес возврата и происходит возврат к основной программе.

Приоритет прерывания – первоочередность обработки прерываний. Устройства с более высоким приоритетом, могут прервать выполнение ПОП с более низким приоритетом. Как правило, самый высокий приоритет имеет сигнал сброса МП.

Вектор прерывания – это ячейка (или несколько ячеек) в памяти программ, закрепленная за устройством прерывания. В эту ячейку записывается адрес начала ПОП данного устройства. Адрес ячейки называется адресом вектора прерывания или номером прерывания. Чем меньше адрес вектора, тем выше приоритет прерывания.

Таблица векторов – совокупность векторов всех устройств. Таблица векторов располагается в начале памяти программ.

Маскирование прерывания – запрет МК реагировать на прерывание. Маскирование может быть частным и глобальным, когда все прерывания запрещены. По умолчанию в МК все прерывания запрещены.

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

Рисунок 1 – Прерывание программы

Пример 1

Исследуйте структуру прерываний на примере фрагмента программы, в котором используется прерывание от внешнего устройства, подключенного к линии ввода pind,2.

Рисунок 2 – Логика прерывания программы от внешнего устройства int0

На рисунке 2 проиллюстрирована логика прерывания от внешнего устройства, подключенного к линии pind,2 микроконтроллера. Это прерывание носит имя int0 (interrupt – прерывание). Прерывание int0 имеет самый высокий приоритет, после прерывания по сбросу. За ним закреплен вектор с номером 0001. По сигналу прерывания МК прервет выполнение программы, запомнит адрес возврата в стеке, обратится к вектору и выполнит команду, записанную в него. В нашем примере в вектор записана команда rjmp prer – прыжок на строку программы, отмеченную этой меткой. Таким образом, программа обработки прерывания начинается с метки prer и заканчивается командой reti – возврат из прерывания. По команде reti МК извлечет из стека адрес возврата и вернется к выполнению основной программы.

.include "m8535def.inc" ;включение в программу файла описания имен

.org 0 ;вектор сброса

rjmp start

.org 0001 ;вектор int0

rjmp prer

.org $0020 ;начало основной программы

start:

;записываем адрес стека в указатель стека SP

ldi r16,$00

out sph,r16

ldi r16,$61

out spl,r16

;разрешаем прерывание от int0 (частное разрешение)

ldi r16,0b00000011

out mcucr,r16

;настраиваем уровень сигнала прерывания по фронту от 0 к 1

ldi r16,0b01000000

out gicr,r16

;глобальное разрешение прерывания

Sei

;очистим r0

clr r0

;фоновая команда, бесконечный цикл, мы ожидаем прерывания

loop:

rjmp loop

;программа обработки прерывания

.org $0030

prer:

inc r0

reti

Контрольные вопросы:

1 Назовите основные режимы работы микропроцессора

2 В чем суть программного режима. Как МП организует поочередное выполнение команд?

3 Как влияют на очередность выполнения команд команды перехода?

4 Что такое подпрограмма? С какой целью используются подпрограммы?

5 Объясните назначение стека в режиме вызова подпрограмм.

6 Что такое вложение подпрограмм?

7 Что является причиной прерывания программы. Чем прерывание отличается от вызова подпрограммы?

8 Объясните термины:

  • требование прерывания

  • адрес возврата

  • программа обработки прерывания

  • приоритет прерывания

  • вектор прерывания

  • таблица векторов

  • маскирование прерывания

  1. Объясните логику работы МП в режиме прерывания программы

  2. Объясните назначение и принцип работы стека в в режиме прерывания программы

  3. Как инициировать прерывание int0 от внешнего устройства?

Рекомендуемая литература:

Ю.В. Новиков, П.К. Скоробогатов. Основы микропроцессорной техники. Курс лекций. М.: Интернет-Университет информационных технологий, 2003.-440с.

с. 28-33

Микропроцессорные системы. Под редакцией Д.В. Пузанкова. – СПб.: Политехника, 2002.-935с.: ил.

с. 21-27