20.06.2018, 20:16 [+3 UTC]
в нашей команде: 2 851 чел. | участники онлайн: 4 (рекорд: 21)

:: РЕГИСТРАЦИЯ

:: задать вопрос

:: все разделы

:: правила

:: новости

:: участники

:: доска почёта

:: форум

:: блоги

:: поиск

:: статистика

:: наш журнал

:: наши встречи

:: наша галерея

:: отзывы о нас

:: поддержка

:: руководство

Версия системы:
7.47 (16.04.2018)

Общие новости:
13.04.2018, 10:33

Форум:
18.06.2018, 08:55

Последний вопрос:
20.06.2018, 15:21

Последний ответ:
20.06.2018, 09:02

Последняя рассылка:
20.06.2018, 03:15

Писем в очереди:
0

Мы в соцсетях:

Наша кнопка:

RFpro.ru - здесь вам помогут!

Отзывы о нас:
15.01.2012, 22:08 »
lamed
Большое спасибо! Как всегда, оперативно и понятно. [вопрос № 185183, ответ № 269593]
25.02.2016, 17:03 »
YwaN
Грамотная консультация. Хороший и отзывчивый специалист. [вопрос № 188847, ответ № 273404]

РАЗДЕЛ • Assembler

Создание программ на языке Assembler.

[администратор рассылки: Лысков Игорь Витальевич (Старший модератор)]

Лучшие эксперты в этом разделе

Зенченко Константин Николаевич
Статус: Модератор
Рейтинг: 274
cain52
Статус: 1-й класс
Рейтинг: 4
Лысков Игорь Витальевич
Статус: Старший модератор
Рейтинг: 0

Перейти к консультации №:
 

Консультация онлайн # 192871
Раздел: • Assembler
Автор вопроса: Ivan (1-й класс)
Отправлена: 11.03.2018, 12:15
Поступило ответов: 1

Уважаемые эксперты! Пожалуйста, ответьте на вопрос:
работаю поневоле в программе compmodel и возник вопрос по поводу работы с ВУ
даны блок таймеров и клавиатура и требуется определить время между двумя последовательными нажатиями на нее в программно-управляемом режиме и режиме прерывания
заранее спасибо

Состояние: Консультация закрыта

Ответ # 276286 от Лысков Игорь Витальевич (Старший модератор)

Здравствуйте, Ivan!
Вот Вам более интересный случай: работа клавиатуры по прерыванию. Таймер просто считывается.
Результат в регистре OR

Код (Assembler) :: выделить код
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 ;возврат из прерывания

А вот по опросу:
Код (Assembler) :: выделить код
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 ;на основной цикл


Консультировал: Лысков Игорь Витальевич (Старший модератор)
Дата отправки: 13.03.2018, 19:01

Рейтинг ответа:

0

[подробно]

Сообщение
модераторам

Отправлять сообщения
модераторам могут
только участники портала.
ВОЙТИ НА ПОРТАЛ »
регистрация »

Мини-форум консультации № 192871

Лысков Игорь Витальевич
Старший модератор

ID: 7438

# 1

= общий = | 12.03.2018, 13:05 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
Ivan:

Ну и в чем именно вопрос?
Давайте свои наработки. Что-то ж есть понятное...

=====
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен

Ivan
1-й класс

ID: 401885

# 2

= общий = | 12.03.2018, 18:40 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер

Честно говоря неочень понятно само задание. Посмотрел похожие задачи на вашем форуме и проштудировал "Архитектуру ЭВМ" Жмакина. но все равно не понимаю разницу между этими двумя режимами и как управлять таймерами. единственное задание которое вызвало ступор из всего объема задач по compmodel

Лысков Игорь Витальевич
Старший модератор

ID: 7438

# 3

= общий = | 12.03.2018, 18:59 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
Ivan:

Работа в обоих режимах до определенного момента одинаковая: происходит ожидание некоторого события (то же нажатие на клавиатуру). Отличия начинаются, когда мы задаем, как реагировать на события.
В режиме по прерыванию происходит автоматический переход на подпрограмму обработки события.
В программно управляемом необходимо постоянно циклить и анализировать состояние клавиатуры.
Таймером управлять просто. В момент первого нажатия сбрасываем его в нуль. В момент второго нажатия считываем показание. Естественно, надо все правильно настроить.

Пробуйте. Пишите сюда. В беде не оставим, подправим smile .
Если уж совсем ничего не получится, нарисую Вам программку... smile

=====
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен

Лысков Игорь Витальевич
Старший модератор

ID: 7438

# 4

= общий = | 12.03.2018, 19:01 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
Ivan:

Согласен, задание неочевидное, но вполне решаемое smile

=====
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен

Ivan
1-й класс

ID: 401885

# 5

= общий = | 12.03.2018, 19:07 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер

хорошо. завтра попробую какую нибудь программу из себя выдавить) обидно так из за одного задания застревать. хотел все сдать досрочно по этому предмету а попалось вот такое безобразие)

Лысков Игорь Витальевич
Старший модератор

ID: 7438

# 6

= общий = | 12.03.2018, 19:18 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
Ivan:

Ну и славно! Завтра все и закончим! smile

=====
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен

Ivan
1-й класс

ID: 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

Лысков Игорь Витальевич
Старший модератор

ID: 7438

# 8

= общий = | 13.03.2018, 19:04 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
Ivan:

Здравствуйте, Ivan!
Пока отвечу в мини-форуме, почему-то ответ не отправляется...

Вот Вам более интересный случай: работа клавиатуры по прерыванию. Таймер просто считывается.
Результат в регистре OR

Код (Assembler) :: выделить код
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 ;возврат из прерывания

А вот по опросу:
Код (Assembler) :: выделить код
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 ;на основной цикл

=====
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен

Ivan
1-й класс

ID: 401885

# 9

= общий = | 13.03.2018, 19:15 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер

а это же оба режима сразу рассмотрены да? и программно-управляемый и с прерываниями?

Лысков Игорь Витальевич
Старший модератор

ID: 7438

# 10

= общий = | 13.03.2018, 19:28 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
Ivan:

Ну да, в первом исходнике - по прерыванию, во втором - по опросу (программно-управляемый) smile

=====
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен

Ivan
1-й класс

ID: 401885

# 11

= общий = | 13.03.2018, 19:30 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер

спасибо вам большое! очень выручили. хорошо что к вам попал)

Лысков Игорь Витальевич
Старший модератор

ID: 7438

# 12

= общий = | 13.03.2018, 19:33 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
Ivan:

Кстати, в программке по прерыванию можно немного упростить:

Код (Assembler) :: выделить код
KEYBOARD: ;прерывание от клавиатуры 
IN 21 ;читаем состояние счетчика таймера 1 
OUT ;показываем значение таймера в регистре OR 
RDI #0 ;обнуляем счетчик
Ну будем подтверждать 0... smile

=====
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен

Ivan
1-й класс

ID: 401885

# 13

= общий = | 15.03.2018, 18:19 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер

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

Гордиенко Андрей Владимирович
Модератор

ID: 17387

# 14

= общий = | 15.03.2018, 18:40 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
Ivan:


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

С этим вопросом Вам нужно обратиться к администрации портала.

=====
Facta loquuntur.

Ivan
1-й класс

ID: 401885

# 15

= общий = | 15.03.2018, 18:46 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер

а к кому именно?

Гордиенко Андрей Владимирович
Модератор

ID: 17387

# 16

= общий = | 15.03.2018, 18:52 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
Ivan:

© Цитата: Ivan
а к кому именно?

Наверное, к первому лицу в списке. smile

=====
Facta loquuntur.

 

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

Яндекс Rambler's Top100

главная страница | поддержка | задать вопрос

Время генерирования страницы: 0.15444 сек.

© 2001-2018, Портал RFPRO.RU, Россия
Калашников О.А.  |  Гладенюк А.Г.
Версия системы: 7.47 от 16.04.2018