Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

TSAiU_Lektsia_7

.pdf
Скачиваний:
1
Добавлен:
26.01.2024
Размер:
533.83 Кб
Скачать

Лекция 7. Программирование контроллеров прерываний

7.1 Инициализация контроллеров прерываний

После включения питания БИОС выполняет инициализацию ПКП. При инициализации:

Устанавливается режим работы ПКП.

Номера типов прерываний.

Определяется ПКП1-ведущий, ПКП2-ведомый.

7.2Программирование контроллера прерываний в процессе обслуживания внешнего

устройства и работы системы

По окончании инициализации IMR обнуляется, следовательно, разрешаются ЗП на всех входах. Для программирования ПКП в работе системы используется 3 слова рабочих приказов:

- Operation Command Word (OCW).

1. OCW1 – разрешение или запрет отдельных входов ЗП. OCW1 использует нечетный адрес.

Регистр масок всегда доступен ЦП для чтения и для записи.

7

6

5

4

3

2

1

0

 

 

 

 

 

 

 

 

IM7

IM6

IM5

IM4

IM3

IM2

IM1

IM0

 

 

 

 

 

 

 

 

LPT1

HГMD

LPT2

COM1

COM2

Каскадирование

Клавиатура

Таймер

 

 

 

 

 

 

 

 

0

0

1

1

1

0

0

0

 

 

 

 

 

 

 

 

Слова рабочих приказов OCW2 и OCW3 используются для управления текущим режимом работы ПКП. Оба слова передаются по четному адресу.

Для отличия OCW2 от OCW3 и ICW1(Initialization Command Word) используются два бита с номерами 4 и 3:

D4

D3

 

 

1

X – ICW1

 

 

0

0 – OCW2

 

 

0

1 – OCW3

 

 

2. OCW2 используется при завершении процедуры обработки прерывания или смены текущего режима работы ПКП.

Формат OCW2:

7

6

5

4

3

2

1

0

OCW2 подается по четному

 

 

 

 

 

 

 

 

 

MODE

0

0

L2

L1

L0

адресу, для первого контроллера

 

 

 

OCW2

 

 

 

= 20h.

 

 

 

 

 

 

 

 

 

Если MODE=00100000 = 20h, устанавливается режим вложенных прерываний и сбрасывается бит в регистре ISR, соответствующий последнему обслуживаемому запросу.

Пример: поступил ЗП на вход IR5. ЦП начал обслуживание, бит IS5=1, затем пришел ЗП на вход IR4, устанавливается IS4=1. Режим вложенных прерываний сохраняется. Пришел ЗП на IR3, устанавливается IS3=1.

1

Если поступает команда Port[$20]:=$20;, бит IS3 сбросится в 0, если еще раз поступает эта же команда, то сбросится бит IS4=0, следующая аналогичная команда сбросит бит IS5=0.

Если установить режим MODE=10100000 = A0h, устанавливается режим циклических приоритетов, сбрасывается бит с максимальным приоритетом, входу присваивается самый низкий приоритет. Если установить MODE = 11000L2L1L0 режим адресуемых приоритетов, номеру входа,

определяемого полем L2L1L0,

присваивается низший приоритет.

3. OCW3 используется для установки дополнительных режимов работы или опроса состояния ПКП.

 

Формат OCW3:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

7

6

5

4

3

 

2

1

0

OCW2 подается по четному

 

0

SMM

0

1

 

p

RRC

адресу, для первого контроллера

 

 

 

 

Признак OSW3

 

 

 

 

= 20h.

 

 

 

 

 

 

 

 

 

 

 

SMM может принять только 2 значения (остальные не действуют).

SMM = 01101000 = 68h – незамаскированные запросы обслуживаются в порядке их поступления. SMM = 01001000 = 48h – восстанавливается приоритетное упорядочение запросов.

RRC = 00001010 = Ah – разрешение чтения регистра IRR. RRC = 00001011 = Bh – разрешение чтения регистра ISR.

После выполнения команды разрешения чтения регистра, чтение указанных регистров можно выполнять произвольное число раз до момента изменения OCW3. Чтение выполняется из того же адреса.

P=1→00001100 = Ch – разрешение чтения незамаскированного запроса с максимальным приоритетом.

Следующая операция чтения из регистра с четным адресом приводит к установке бита ISk с максимальным приоритетом, как будто получен сигнал INTA и передача ЦП в байта следующего формата I0000W2W1W0, где I показывает наличие ЗП (I=1, есть ЗП), а W2W1W0 показывают номер входа с наивысшим приоритетом.

Пример №1.

Port[$21]: = Port[$21] or 2;

OCW1, адрес нечетный. IMi=1 – запрет

 

 

клавиатуры.

 

 

 

 

Port[$21]: = Port[$21] and not 2;

IMi =0 – разрешение работы клавиатуры.

 

 

 

 

Пример №2.

 

 

 

 

 

 

Port[$20]: =

Сброс бита с самым высоким приоритетом ISi. Завершение обслуживания

 

Port[$20] ;

прерывания, соответствующего последнему запросу.

 

 

 

 

 

Пример №3.

 

 

 

 

 

 

 

Port[$20]:=$A;

 

Разрешение чтения регистра IRR.

 

 

 

 

Writeln( ‗содержимое регистра IRR=‘),

Чтение регистра IRR

port[$20];

 

 

 

 

 

 

 

7.3 Методика программирования обмена данными с прерыванием программы

Содержит две части:

Подготовка к обмену с прерываниями выполняется в фоновой программе.

Обслуживание ВУ в режиме прерывания фоновой программы. Подготовка к обмену с прерываниями включает:

2

1.Резервирование памяти для совместного использования фоновой и оперативной программ:

Память для хранения данных. Оперативная программа использует еѐ для ввода данных в ВУ или вывода данных из ВУ. Фоновая программа – для подготовки данных для ВУ или обработки полученных данных.

Переменная программный счетчик. Содержит текущее количество слов, переданное между фоновой и оперативной программами в том или ином направлении. Оперативная программа модифицирует программный счетчик в каждом цикле обмена. Фоновая программа использует программный счетчик для проверки завершения обмена.

Переменная указатель длины массива данных. Фоновая программа в этой переменной указывает общее количество слов, предназначенных для передачи. Оперативная программа должна запретить прерывание при передаче установленного объема данных.

2.Установка ВП на оперативную программу обслуживания устройства.

3.Разрешение прерывания ВУ. Определяет момент начала совместной работы фоновой и

оперативной программ.

Обслуживание ВУ в режиме прерываний (вторая часть) выполняется оперативной программой, которая в каждом цикле обмена данными должна выполнять следующие действия:

1.Сохранение регистров процессора, которые будут модифицированы во время еѐ выполнения.

2.Инкремент (декремент) программного счетчика.

3.Обмен данными с памятью.

4.Сброс ЗП в интерфейсе ВУ, если он не сбрасывается аппаратными средствами.

5.Восстановление регистров ЦП, восстановление СК, РСП.

6.При передаче установленного фоновой программой обмена данных оперативная программа должна запретить прерывание ВУ.

Для ЭВМ семейства IBM PC:

В регистре флагов IF=1, чтобы восстановить режим вложенных прерываний и разрешить прерывание от устройств с большими приоритетами. Оперативная программа должна сбрасывать бит ISi=0, чтобы разрешить прерывание от данного устройства и устройств с меньшими приоритетами.

7.4Реализация методики обмена данными с прерыванием программы в автоматизированных

системах на основе ЭВМ семейства IBM в среде Borland Pascal

Установка ВП на программу обслуживания ВУ выполняется с помощью стандартной процедуры Borland Pascal из модуля DOS.* (для Windows WinDOS.*). (* расширения могут быть различными в зависимости от модели памяти).

Procedure SetIntVec(IntNo:byte; IntProcAddr: pointer);, где IntNo —номер типа прерывания, IntProcAddr

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

Как только установили новый ВП, старый будет утерян Для его сохранения и последующего восстановления используем стандартную процедуру из того же модуля: Procedure GetIntVec(IntNo:byte; var OldIntProcAddr: pointer);

Процедура обслуживания прерываний:

Procedure IntADC; interrupt;

Здесь ключевое слово ; interrupt; приводит к генерации машинных команд, обеспечивающих сохранение в стеке всех регистров ЦП при входе в процедуру и восстановление их при еѐ завершении. Заканчивается процедура командой IRET—возврат из прерывания (а не командой RET—возврат из подпрограммы) которая восстанавливает из стека содержимое СК и Flags.

3

7.5 Техническая реализация интерфейса для обмена данными с прерыванием программы

ЗП T ЗП

из ВУ

IRi=IR3

 

 

 

 

ФРП 30Fh

Рис. 7.1 Схема реализации обмена данными с прерыванием программы

За время T (Рис. 7.1) оперативная программа должна завершить работу. Программа, обслуживающая ЗП может закончиться раньше, но не позже. Сигнал ЗП устанавливается фронтом.

Пример: Ввод в ОЗУ 100 значений из модуля АЦП, в диапазоне ±5 В через 32 канал мультиплексора с прерыванием от таймера в режиме подключения входных сигналов с общей землей.

Program Demo_interrupt; Uses Dos, timer154;

Const BA=$300; {базовый адрес} Nmas=100; {длина массива}

count: word = 0;{программный счетчик}

var U: array [0..Nmas] of integer; {массив данных}

T: word; {период таймера} i: integer; OldIntVec: pointer; {старый вектор прерывания}

Procedure IntADC; interrupt; (Оперативная программа) Begin asm sti end; {IF=1}

Inc(count);

Port[BA+4]:=$FF; {запуск АЦП на измерение}

Asm nop end;

While (port[BA+2] and 8) <> 0 do; U[count]:=PortW[BA];

Port[$20]:=$20; {OCW2, сброс бита IR3, разрешение прерываний от этого входа и входов с высшим приоритетом}

If count=Nmas then port [$21]:=port[$21] or 8; End;

Begin (Основная программа)

Port[BA+$F]:=0; {ФРП=0}

Port[$21]:=Port[$21] or 8; {запрет прерывания ПКП}

Port[BA+2]:=$FF; {режим}

Wait ({задержка ≈4мкс});

GetIntVec($B, OldIntVec); SetIntVec($B, IntADC);

Writeln(‗Укажите интервал дискретизации сигнала‘); readln(T);

Set_Time(T);

Port[BA+$F]:=1; {ФРП=1} Port[$21]:=Port[$21] and NOT 8; {IM3=0}

{Фоновая программа}

Port[BA+$F]:=0; {}

SetIntVec ($B, OldIntVec);{ Вывод данных и обработка данных }

End.

4

7.6 Категории прерываний ЭВМ семейства IBM

Все прерывания процессора делятся на 3 категории:

1.Внешние или аппаратные прерывания.

2.Прерывания по особой ситуации или внутренние прерывания.

3.Программные прерывания.

1.Внешние или аппаратные прерывания генерируются ВУ в ответ на некоторые события, требующие внимания ЦП.

2.Внутренние прерывания возникают, когда ЦП наталкивается на абсолютно бессмысленные команды.

Пример: IntNo=0 – прерывание при делении на 0.

IntNo=1 – прерывание при установленном флаге TF=1 в регистре флагов.

IntNo=2 – NMI NoneMaskedInterrupt, немаскируемое прерывание.

Программные прерывания не возникают неожиданно они возникают, если какая-то программа вызывает это прерывание и служит для вызова других программ, которые находятся в: ПЗУ – BIOS, ОЗУ – DOS.

Основные черты программных прерываний

Программные прерывания функционируют так же, как и аппаратные прерывания. Программные прерывания не разделены по приоритетам и могут вызываться друг из друга. Аппаратное прерывание тоже может получить управление при выполнении программного прерывания.

Для вызова программных прерываний имеется ассемблерная команда INT <номер типа прерывания>. Реакции ЦП на эту команду:

1.Сохраняет свое состояние.

2.Определяет адрес ВП.

3.Загружает в СК содержимое ВП.

4.Приступает к выполнению соответствующей процедуры.

Вязыках высокого уровня также можно использовать программные прерывания. Они становятся доступны при объявлении в программе модуля DOS.* (или WinDOS.*).

Procedure Intr(IntNo:byte; var Regs: registers); (в Windows: var Regs:TRegisters).

Тип Registers имеет тип:

Type Registers=record case integer of

0: (AX, BX, CX, DX,BP, SI, DI, DS, ES, Flags: word); 1: (AL, AH, BL, BH, CL, CH, DL, DH: byte) end;

Для Windows: Type TRegisters вместо Type Registers.

Один и тот же номер типа может содержать несколько функций. В регистре AH можно указать номер функции, в регистре AL – номер подфункции.

Краткий обзор функций BIOS

№ Типа прерывания

Функция или группа функций

 

 

5

Печать графической копии экрана

 

 

11h

Оборудование RAM

 

 

12h

Объем памяти

 

 

13h

Управление НТМД

 

 

14h

Управление последним портом

 

 

16h

Управление клавиатурой

 

 

19h

Перезапуск системы

 

 

33h

Управление мышкой

 

 

5

Пример программного прерывания: Определение наличия сопроцессора.

Program Intr_copr; uses Dos; Var R: registers;

Begin Intr($11, R);

If (R.AX and 2)<>0 then Writeln (‗Есть сопроцессор‘) else Writeln(‗Сопроцессор отсутствует‘); end. Для обращения к функциям DOS используется процедура Procedure MSDOS (var Regs: registers);, которая соответствует функции Intr с номером типа $21.

Пример. Получить версию операционной системы.

Uses WinDOS, winCRT; Var R:TRegisters;

Begin R.AH=$30; MSDOS(R); Writeln(‗Версия ОС=‘, R.AL, ‗:‘, R.AH); End.

6

Соседние файлы в предмете Технические средства автоматизации и управления