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

2.3. Реализация программного обмена между центральным процессором и контроллером клавиатуры посредством контроллера прерываний

В данной лабораторной работе рассматривается следующая схема работы. Контроллер клавиатуры принимает скан-код нажатой клавиши и помещает его во внутренний буфер. Обычный скан-код представляет собой байтовое значение, младшие семь битов которого описывают код клавиши (0..127), а старший бит нажатие(0)/отпускание(1). Буфер клавиатуры доступен для чтения через порт 60h сокращенного пространства ввода-вывода. Контроллер клавиатуры также имеет и статусный и контрольный регистр, но в данной лабораторной работе предполагаем, что он настроен BIOSом на режим обмена по прерываниям и его перепрограммирование производиться не будет.

По появлению кода в буфере контроллер формирует сигнал запроса на прерывание, который попадает в контроллер прерываний. Контроллер прерываний необходим для того, чтобы принимать сигналы от пятнадцати источников прерываний и формировать один сигнал запроса на прерывание для процессора, с последующей выдачей номера источника в специальном шинном цикле определения номера вектора. Контроллер клавиатуры подключен ко входу IRQ1 ведущего контроллера прерываний.

Контроллер прерываний состоит из двух одинаковых микросхем, включенных каскадно. Каждая микросхема обеспечивает поддержку до восьми источников. В данной лабораторной работе будет использована только входная часть контроллера прерываний которая состоит из регистра IRR (Interrupt Request Register) и IMR (Interrupt Mask Register). Регистр IRR предназначен для запоминания запросов на прерывания от устройств и будет хранить соответствующий запрос, пока он не поступит на схему генерации соответствующего прерывания или этот регистр не будет прочитан процессором. Регистр IMR предназначен для блокирования прохождения запросов на прерывания от соответствующих устройств. Единичное значение соответствующего бита в регистре IMR блокирует прохождение прерывания на дальнейшую обработку по этой линии. Регистр IMR доступен через порт 21h для чтения и записи напрямую. Регистр IRR доступен только для чтения через порт 20h, но этот порт используется для обращения к нескольким регистрам контроллера прерываний, поэтому предварительно в этот порт должна быть отправлена команда на чтение регистра IRR, которая представляет собой код 0Ah.

Для обеспечения режима программного обмена, разрабатываемая программа должна обеспечить блокирование прохождения прерывания от клавиатуры через регистр IMR. Затем в цикле должен анализироваться регистр IRR на предмет появления запроса от клавиатуры. После появления запроса необходимо выбрать очередной символ из буфера клавиатуры и приступать к его анализу и обработке.

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

Кроме часов реального времени, ПЭВМ компьютер содержит устройство, называемое системным таймером. Это устройство подключено к линии запроса на прерывание IRQ0 и вырабатывает прерывание INT 8h приблизительно 18,2 раза в секунду (точное значение - 1193180/65536 раз в секунду).

При инициализации BIOS устанавливает свой обработчик для прерывания таймера. Этот обработчик каждый раз увеличивает на 1 текущее значение четырехбайтовой переменной, располагающейся в области данных BIOS по адресу 0000:046Ch - счетчик тиков таймера. Если этот счетчик переполняется (прошло более 24 часов с момента запуска таймера), в ячейку 0000:0470h заносится 1.

Другое действие, выполняемое стандартным обработчиком прерывания таймера - контроль за работой двигателей НГМД. Если после последнего обращения к НГМД прошло более 2 секунд, обработчик прерывания выключает двигатель. Ячейка с адресом 0000:0440h содержит время, оставшееся до выключения двигателя. Это время постоянно уменьшается обработчиком прерывания таймера. Когда оно становится равно 0, обработчик выключает двигатель НГМД.

Последнее действие, которое выполняет обработчик прерывания таймера - вызов прерывания INT 1Ch. После инициализации системы вектор INT 1Ch указывает на команду IRET, т.е. ничего не выполняется. Программа может установить собственный обработчик этого прерывания для того чтобы выполнять какие-либо периодические действия.

Необходимо отметить, что прерывание INT 1Ch вызывается обработчиком прерывания INT 8h до сброса контроллера прерывания, поэтому во время выполнения прерывания INT 1Ch все аппаратные прерывания запрещены. В частности, запрещены прерывания от клавиатуры.

Обработчик прерывания INT 1Ch должен заканчиваться командой IRET. Если же вы подготавливаете собственный обработчик для прерывания INT 8h, перед завершением его работы необходимо послать код EOI в контроллер прерываний. Это можно сделать, например, так:

mov al, 20h

out 20h, al

Рис.1. иллюстрирует механизм обработки прерывания таймера.