Консультация № 192871
11.03.2018, 12:15
0.00 руб.
0 17 1
Уважаемые эксперты! Пожалуйста, ответьте на вопрос:
работаю поневоле в программе compmodel и возник вопрос по поводу работы с ВУ
даны блок таймеров и клавиатура и требуется определить время между двумя последовательными нажатиями на нее в программно-управляемом режиме и режиме прерывания
заранее спасибо

Обсуждение

давно
Посетитель
7438
7205
12.03.2018, 13:05
общий
Адресаты:
Ну и в чем именно вопрос?
Давайте свои наработки. Что-то ж есть понятное...
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
401885
7
12.03.2018, 18:40
общий
Честно говоря неочень понятно само задание. Посмотрел похожие задачи на вашем форуме и проштудировал "Архитектуру ЭВМ" Жмакина. но все равно не понимаю разницу между этими двумя режимами и как управлять таймерами. единственное задание которое вызвало ступор из всего объема задач по compmodel
давно
Посетитель
7438
7205
12.03.2018, 18:59
общий
Адресаты:
Работа в обоих режимах до определенного момента одинаковая: происходит ожидание некоторого события (то же нажатие на клавиатуру). Отличия начинаются, когда мы задаем, как реагировать на события.
В режиме по прерыванию происходит автоматический переход на подпрограмму обработки события.
В программно управляемом необходимо постоянно циклить и анализировать состояние клавиатуры.
Таймером управлять просто. В момент первого нажатия сбрасываем его в нуль. В момент второго нажатия считываем показание. Естественно, надо все правильно настроить.

Пробуйте. Пишите сюда. В беде не оставим, подправим .
Если уж совсем ничего не получится, нарисую Вам программку...
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
7438
7205
12.03.2018, 19:01
общий
Адресаты:
Согласен, задание неочевидное, но вполне решаемое
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
401885
7
12.03.2018, 19:07
общий
хорошо. завтра попробую какую нибудь программу из себя выдавить) обидно так из за одного задания застревать. хотел все сдать досрочно по этому предмету а попалось вот такое безобразие)
давно
Посетитель
7438
7205
12.03.2018, 19:18
общий
Адресаты:
Ну и славно! Завтра все и закончим!
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
401885
7
13.03.2018, 17:03
общий
Здравствуйте. вот код. честно говоря в нем вообще неуверен и так до конца и не разобрался как программно управлять клавиатурой и таймером. помогите пожалуйста с программой(

RDI #42
WR 100
RDI #47
WR 102
RDI #101
OUT 1
RDI #11
RDI #1000
OUT 22
RDI #101
OUT 20
EI ;разрешаем прерывания
LOOP: ;основной цикл
IN 2 ;состояние клавиатуры
RDI #101
RDI #201
OUT 20
K:IN 2
JZ K ;пусто - на основной цикл
RDI #101
RDI #1000
OUT 20
давно
Посетитель
7438
7205
13.03.2018, 19:01
общий
это ответ
Здравствуйте, Ivan!
Вот Вам более интересный случай: работа клавиатуры по прерыванию. Таймер просто считывается.
Результат в регистре OR[code lang=asm h=200]RDI #21 ;задаем адрес отработки прерывания клавиатуры
WR 100 ;фиксированный адрес ячейки 0 прерывания (клавиатуры)
;метка KEYBOARD:
;При необходимости изменить, берем адрес из окна "Программа"!

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

RDI #1000 ;команда останова таймера
OUT 22 ;команда таймеру 1
RDI #0 ;обнулим счетчик
OUT 21 ;таймера 1
OUT ;обнулим регистр OR

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

LOOP: ;основной цикл
JMP LOOP ;пустой

KEYBOARD: ;прерывание от клавиатуры
IN 21 ;читаем состояние счетчика таймера 1
OUT ;то показываем значение таймера в регистре OR
RDI #0 ;обнуляем счетчик
OUT 21 ;таймера 1
RDI #1001 ;каждые 1 мс, инкремент, без прерывания, запускаем счет
OUT 22 ;работаем с таймером 1
RDI #101 ;сброс флага переполнения 1 таймера (на всякий случай)
OUT 20
RDI #101 ;команда сброса
OUT 1 ;для клавиатуры
RDI #103 ;восстанавливаем посимвольный режим
OUT 1 ;клавиатуры
IRET ;возврат из прерывания
[/code]
А вот по опросу:[code lang=asm h=200]RDI #101 ;команда сброса
OUT 1 ;для клавиатуры
RDI #10 ;режим
OUT 1 ;для клавиатуры - разрешение и работа по опросу
RDI #103 ;для клавиатуры - посимвольный режим
OUT 1

RDI #1000 ;команда останова таймера
OUT 22 ;команда таймеру 1
RDI #0 ;обнулим счетчик
OUT 21 ;таймера 1
OUT ;обнулим регистр OR

LOOP: ;основной цикл
IN 2 ;состояние колавиатуры
JZ LOOP ;пусто - на основной цикл
SBI #10 ;есть код в буфере
JNZ LOOP ;на основной цикл

IN 21 ;читаем состояние счетчика таймера 1
JZ START ;если счетчик пустой, то просто запускаем таймер
OUT ;если таймер уже работает, то показываем значение таймера в регистре OR
START: ;(пере)запускаем таймер с 0
RDI #0 ;обнуляем счетчик
OUT 21 ;таймера 1
RDI #1001 ;каждые 1 мс, инкремент, без прерывания, запускаем счет
OUT 22 ;работаем с таймером 1
RDI #101 ;сброс флага переполнения 1 таймера (на всякий случай)
OUT 20

RDI #101 ;сбрасываем клавиатуру
OUT 1
RDI #103 ;восстанавливаем посимвольный режим
OUT 1
JMP LOOP ;на основной цикл
[/code]
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
7438
7205
13.03.2018, 19:04
общий
Адресаты:
Здравствуйте, Ivan!
Пока отвечу в мини-форуме, почему-то ответ не отправляется...

Вот Вам более интересный случай: работа клавиатуры по прерыванию. Таймер просто считывается.
Результат в регистре OR[code lang=asm h=200]RDI #21 ;задаем адрес отработки прерывания клавиатуры
WR 100 ;фиксированный адрес ячейки 0 прерывания (клавиатуры)
;метка KEYBOARD:
;При необходимости изменить, берем адрес из окна "Программа"!

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

RDI #1000 ;команда останова таймера
OUT 22 ;команда таймеру 1
RDI #0 ;обнулим счетчик
OUT 21 ;таймера 1
OUT ;обнулим регистр OR

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

LOOP: ;основной цикл
JMP LOOP ;пустой

KEYBOARD: ;прерывание от клавиатуры
IN 21 ;читаем состояние счетчика таймера 1
JZ START ;если счетчик пустой, то просто запускаем таймер
OUT ;если таймер уже работает, то показываем значение таймера в регистре OR
START: ;запускаем таймер с 0
RDI #0 ;обнуляем счетчик
OUT 21 ;таймера 1
RDI #1001 ;каждые 1 мс, инкремент, без прерывания, запускаем счет
OUT 22 ;работаем с таймером 1
RDI #101 ;сброс флага переполнения 1 таймера (на всякий случай)
OUT 20
RDI #101 ;команда сброса
OUT 1 ;для клавиатуры
RDI #103 ;восстанавливаем посимвольный режим
OUT 1 ;клавиатуры
IRET ;возврат из прерывания
[/code]
А вот по опросу:[code lang=asm h=200]RDI #101 ;команда сброса
OUT 1 ;для клавиатуры
RDI #10 ;режим
OUT 1 ;для клавиатуры - разрешение и работа по опросу
RDI #103 ;для клавиатуры - посимвольный режим
OUT 1

RDI #1000 ;команда останова таймера
OUT 22 ;команда таймеру 1
RDI #0 ;обнулим счетчик
OUT 21 ;таймера 1
OUT ;обнулим регистр OR

LOOP: ;основной цикл
IN 2 ;состояние колавиатуры
JZ LOOP ;пусто - на основной цикл
SBI #10 ;есть код в буфере
JNZ LOOP ;на основной цикл

IN 21 ;читаем состояние счетчика таймера 1
JZ START ;если счетчик пустой, то просто запускаем таймер
OUT ;если таймер уже работает, то показываем значение таймера в регистре OR
START: ;(пере)запускаем таймер с 0
RDI #0 ;обнуляем счетчик
OUT 21 ;таймера 1
RDI #1001 ;каждые 1 мс, инкремент, без прерывания, запускаем счет
OUT 22 ;работаем с таймером 1
RDI #101 ;сброс флага переполнения 1 таймера (на всякий случай)
OUT 20

RDI #101 ;сбрасываем клавиатуру
OUT 1
RDI #103 ;восстанавливаем посимвольный режим
OUT 1
JMP LOOP ;на основной цикл
[/code]
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
401885
7
13.03.2018, 19:15
общий
а это же оба режима сразу рассмотрены да? и программно-управляемый и с прерываниями?
давно
Посетитель
7438
7205
13.03.2018, 19:28
общий
Адресаты:
Ну да, в первом исходнике - по прерыванию, во втором - по опросу (программно-управляемый)
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
401885
7
13.03.2018, 19:30
общий
спасибо вам большое! очень выручили. хорошо что к вам попал)
давно
Посетитель
7438
7205
13.03.2018, 19:33
общий
Адресаты:
Кстати, в программке по прерыванию можно немного упростить:
[code lang=asm]KEYBOARD: ;прерывание от клавиатуры
IN 21 ;читаем состояние счетчика таймера 1
OUT ;показываем значение таймера в регистре OR
RDI #0 ;обнуляем счетчик[/code]Ну будем подтверждать 0...
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
401885
7
15.03.2018, 18:19
общий
а вам на форум не нужен консультант по python? Так уж получилось что в нем неплохо разбираюсь и готов предложить свои услуги
давно
Мастер-Эксперт
17387
18345
15.03.2018, 18:40
общий
Адресаты:

Цитата: Ivan
а вам на форум не нужен консультант по python? Так уж получилось что в нем неплохо разбираюсь и готов предложить свои услуги

С этим вопросом Вам нужно обратиться к администрации портала.
Об авторе:
Facta loquuntur.
давно
Посетитель
401885
7
15.03.2018, 18:46
общий
а к кому именно?
давно
Мастер-Эксперт
17387
18345
15.03.2018, 18:52
общий
Адресаты:
Цитата: Ivan
а к кому именно?

Наверное, к первому лицу в списке.
Об авторе:
Facta loquuntur.
Форма ответа