Консультация № 189366
14.05.2016, 21:01
0.00 руб.
0 8 1
Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос:

Программа CompModel некого Жмакина
Задание: программа ввода символов с клавиатуры с выводом на дисплей. Используемые ВУ: клавиатура, дисплей, таймер. Пояснение: очистка буфера клавиатуры после ввода 50 символов или каждые 10 с.
Необходимо решение с использованием обработчика прерывания.

Заранее благодарю!

С уважением,
Влад Шмелёв.

Обсуждение

давно
Посетитель
7438
7205
15.05.2016, 00:40
общий
15.05.2016, 00:42
Адресаты:
Здравствуйте, Влад!
Нарисую я Вам прогаммку по свободе, завтра, максимум послезавтра...
Самостоятельно не пробовали что-то написать?
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
400320
4
15.05.2016, 08:39
общий
Я написал вариант в режиме программного контроля:

INIT_DISPLAY: RD #101
OUT 11
RD #102
OUT 11
RD #11
OUT 11

INIT_TIMER: RDI #1000
OUT 22
RD #0
OUT 21
RDI #1001
OUT 22

INIT_KEYBOARD: RD #101
OUT 1
RD #10
OUT 1

PROGRAM: IN 21
SBI #1000
JNS INIT_TIMER
IN 0
JZ PROGRAM
OUT 10
IN 2
JNZ INIT_KEYBOARD
JMP PROGRAM

Вроде, все хорошо работает. Но как использовать прерывания и как они вообще работают - я, к сожалению, разобраться не могу.
давно
Посетитель
7438
7205
15.05.2016, 11:49
общий
Адресаты:
Если есть описание, загрузите в мои файлы и дайте ссылочку
Нет, сделаю завтра. На работе у меня есть описание этого "квазиассемблера"
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
400320
4
15.05.2016, 11:57
общий
Вот описание алгоритма. https://rfpro.ru/upload/10141
А вот книга, которой я руководствовался: http://www.kraszdrav.ru/assets/documents/jmakin_Architecture_EOM.pdf - 8 глава, начиная с 235 страницы.
давно
Посетитель
7438
7205
16.05.2016, 19:44
общий
это ответ
Здравствуйте, vl-shmelev!
Где-то так... Если что непонятно - спрашивайте в мини-форуме...
[code lang=asm h=200]
RDI #42 ;задаем адрес отработки прерывания клавиатуры
WR 100 ;фиксированный адрес ячейки 0 прерывания (клавиатуры)
RDI #47 ;задаем адрес отработки прерывания таймера
WR 102 ;фиксированный адрес ячейки 2 прерывания (таймера)
;При необходимости изменить, берем адреса из окна "Программа"!

RDI #101 ;команда сброса
OUT 11 ;для дисплея
OUT 1 ;и клавиатуры
RDI #11 ;режимы
OUT 11 ;для дисплея - разрешение и автоинкемент адреса
OUT 1 ;для клавиатуры - разрешение и работу по прерыванию
RDI #103 ;для клавиатуры - посимвольный режим
OUT 1

RDI #1000 ;останов
OUT 22 ;таймера 1
RDI #10000 ;10000 мс = 10 сек
OUT 21 ;для таймера 1
RDI #1111 ;каждые 1 мс, декремент, по прерыванию, начало счета
OUT 22 ;работаем с таймером 1
RDI #101 ;сброс флага переполнения 1 таймера
OUT 20

EI ;разрешаем прерывания

LOOP: ;основной цикл
IN 2 ;состояние колавиатуры
JZ LOOP ;пусто - на основной цикл
SBI #10 ;есть код в буфере
JZ LOOP ;на основной цикл
RDI #101 ;ошибка переполнения - сбрасываем клавиатуру
OUT 1
RDI #103 ;восстанавливаем посимвольный режим
OUT 1
JMP LOOP ;на основной цикл

;Т.к. у нас основной цикл непустой,
;в анализе переполнения буфера клавиатуры используется аккумулятор
;то в прерываниях необходимо сохранить аккумулятор
KEYBOARD: ;прерывание от клавиатуры
WR R0 ;сохраним аккумулятор в регистре
IN 0 ;читаем код
OUT 10 ;на экран
RD R0 ;восстанавливаем аккумулятор
IRET ;возврат из прерывания

TIMER: ;прерывание от таймера
WR r1 ;сохраним аккумулятор
RDI #101 ;сброс флага переполнения 1 таймера
OUT 20
RDI #10000 ;устанавливаем таймер 1 на 10 сек
OUT 21
RDI #101 ;сброс клавиатуры
OUT 1
RDI #103 ;восстанавливаем посимвольный режим
OUT 1
RD R1 ;восстанавливаем аккумулятор
IRET
[/code]
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
400320
4
16.05.2016, 23:34
общий
Спасибо большое, но возникли вопросы: когда срабатывают прерывания, что является условием выполнения прерывания? И почему таймер продолжает отсчет после нуля?
давно
Посетитель
7438
7205
17.05.2016, 10:42
общий
17.05.2016, 10:53
Адресаты:
Прерывания срабатывают, когда выполнены три условия:
1)разрешены все прерывания, флаг I взводится командой EI
2)разрешено прерывание данного конкретного устройства.
Клавиатура - флаг I в регистре CR
Таймер - флаг EI в соответствующем регистре CTnR, n=1,2,3
3)флаг, указывающий, что произошло необходимое событие
Клавиатура - флаг готовности Rd в регистре SR, который взводится в зависимости от режима работы клавиатуры или после каждого нажатия (посимвольный ввод), или после ввода всей строки
Таймер - соответствующий флаг FTn в регистре переполнения FT, который взводится в момент перехода счетчика таймера 0-99999 или 99999-0, в зависимости от направления счета

Таймер считает/не считает исключительно биту T в регистрах CTnR
Если взведено, то будет считать, невзирая ни на что.
При срабатывании прерывания необходимо обязательно перенастроить таймер на нужное значение.
В реальных процессорах/контроллерах все работает аналогично.
Просто из-за того, что все происходит очень быстро, то ничего не заметно.
Здесь же из-за инертности системы, особенно в пошаговом режиме, видно, как таймер считает дальше. Но это не должно Вас смущать. Это нормально.
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
400320
4
17.05.2016, 10:53
общий
Большое спасибо!
Форма ответа