Приём сигнала BUSY


Главная / ЭКВМ / Программы / Примеры

Линия BUSY параллельного порта (готовность принтера) используется в ЭКВМ для приёма дискретных сигналов от внешних устройств. В ЭКВМ линия BUSY выводится на контакт 11 разъёма ИПР, контакт 25 разъёма ВУ, вывод 21 контроллера 5.130.027.

Данный сигнал используется как входной устройствами УСОМК. На него также выведен сигнал секундных импульсов PPS ряда приёмников ГЛОНАСС/GPS серии АСПМК.

Сигнал может приниматься как в режиме считывания состояния, так и вызывать прерывание программы пользователя.


Считывание состояния

Для считывания состояния необходимо выполнить чтение содержимого регистра функции R9092 и проверить содержимое бита 3. Нулевое значение будет указывать на наличие сигнала, к примеру, на замыкание линии "Вход" устройства УСОМК. Единичное значение - на его отсутствие.

Пример программы, которая непрерывно считывает состояние сигнала (13 байт):
1
РР П 9090
PP ИП 9092
8
К AND
К ЗН
К ЭКР
БП 04

Запись единицы в R9090 используется для установки статического режима порта. Считывание данных о состоянии из регистра R9092 возможно и в других режимах, но только если порт включен - то есть регистр R9090 содержит ненулевое значение.

Команда "РР ИП 9092" ("PP RM 9092" в латинской транскрипции) выполняет считывание состояния порта.

Командами "8 KAND" выполняется проверка состояния бита 3 - десятичному числу 8 соответствует 0100 в двоичном представлении. Команда "K AND" выполняет операцию логического И над байтами в регистрах стека X и Y.

Команда "К ЗН" определяет знак числа, здесь она используется для превращения любого положительного числа, включая 8, в единицу. Нулевое значение сохраняется.

Команда "К ЭКР" обновляет экран.

Команда "БП 04" - безусловный переход на адрес 04 текущей страницы. В данном случае, на команду считывания состояния порта.

Поскольку програма работает в бесконечном цикле, самостоятельно она не остановится. Завершение работы возможно нажатием клавиши "С/П".

Пример программы, которая ожидает поступление сигнала (13 байт):
1
РР П 9090
PP ИП 9092
8
К AND
К ЗН
F x=0 04
С/П

Вместо бесконечного цикла с выводом считанного состояния на экран здесь записана команда условного перехода "F x=0 04". При нулевом значении в регистре стека X программа выполняет команду останова "С/П".

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


Настройка прерывания

Недостатки программ с непрерывным опросом состояния могут быть устранены использованием механизма прерываний.

Для настройки следует записать номер используемого прерывания в регистр R9156. Запись нулевого значения запрещает прервание. Прерывание возникает при переходе сигнала BUSY из состояния логической 1 в 0.

В регистр R9131...R9146, соответствующий номеру используемого прерывания, предварительно следует записать вектор (адрес начала подпрограммы-обработчика) через регистр Y и его приоритет через регистр X стека. Нулевой приоритет запрещает прерывание с данным номером. Кроме того, все прерывания должны быть разрешены записью ненулевого значения в регистр общего разрешения R9130.

Пример программы с использованием прерывания, которая ожидает поступление сигнала (19 байт):
18
B↑
1
РР П 9090
РР П 9130
РР П 9131
РР П 9156
БП 16
С/П

Здесь: 18 - адрес начала программы прерывания. Он поднимается в регистр стека Y командой "B↑".

Единица используется для инициализации остальных регистров, рассмотренных ранее. В частности, как значение номера прерывания и его приоритета.

После разрешения использования параллельного порта и инициализации механизма прерываний программа зацикливается при помощи команды "БП 16", которая выполняет переход сама на себя.

Программа прерывания состоит из единственной команды "С/П", которая останавливает выполнение программы.

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

Примечание. Корректно выполненная подпрограмма прерывания должна завершаться командой "РР В/О" и передавать флаг завершения основной программе в любом из регистров памяти данных, кроме R0...RE (R0...R14), значение которых восстанавливается при выходе из прерывания.


Приём сигнала PPS от приёмника ГЛОНАСС/GPS

В качестве более сложного и полезного примера рассмотрим программу, которая принимает определённое пользователем количество секундных импульсов от приёмника АСПМК, сопровождает их звуковыми сигналами, выводит количество оставшихся импульсов на экран и одновременно управляет дискретными выходами порта. При этом, программа корректно использует механизм прерываний.

При отсутствии приёмника входной сигнал можно проимитировать кнопкой, замыкающей вход BUSY и GND.

Перед запуском программы в регистр стека X записывается количество импульсов, которые программа будет подсчитывать. Запуск программы выполняется нажатием клавиш "В/О", "С/П".

После запуска программа ожидает прихода очередного импульса по линии BUSY, который вызывает прерывание. В прерывании программа уменьшает введённое число на единицу и выводит его на экран.

Приём импульса сопровождается звуковым сигналом частотой 1000 Гц и подолжительностью 100 мс, которые аналогичны сигналам частоты по ГОСТ 8.323-78, излучаемым специализированными радиостанциями.

Одновременно с выдачей звукового сигнала программа включает канал AUTOFEED параллельного порта ("выход 1"), по окончании сигнала - выключает его. Для выключения канала используется прерывание по срабатыванию таймера 2, который инициализируется при записи в регистр R9052.

По окончании счёта импульсов программа на одну секунду включает канал SELECT_IN параллельного порта ("выход 2"). Чтобы предотвратить несвоевременное выключение канала, предварительно ожидается окончание текущего звукового сигнала, после чего запрещаются все прерывания.

Через одну секунду после включения SELECT_IN ("выход 2") программа запрещает использование параллельного порта, что вызывает автоматическое отключение всех каналов.

При вводе перед запуском в регистр стека X нецелого значения количества импульсов программа отбрасывает дробную часть. При вводе нулевого значения срабатывает только канал SELECT_IN и программа завершается. При вводе отрицательного значения программа выполняет счёт импульсов, уменьшая отрицательное число на единицу при каждом импульсе (с возрастанием абсолютного значения). В таком случае программа самостоятельно не останавливается, для останова требуется нажать клавишу "С/П".

Если импульсы принимаются от сигнала PPS приёмника АСПМК, то они следуют один раз в секунду, позволяя использовать программу в качестве таймера.

Для временного прекращения счёта можно аккуратно отсоединить приёмник ГЛОНАСС/GPS от ЭКВМ или перерезать нужный провод в кабеле (как правило - белый или зелёный).

Для завершения программы достаточно нажать клавишу "С/П".


Программа с дополнительными функциями управления занимает 88 байт, поэтому нагляднее представить её в виде таблицы.

Программа pps.mkp (88 байт, КС 11605/109)

  0 1 2 3 4 5 6 7 8 9
0000 K [x] P П 40 1 0 П 4 ВП 2 П 5 1
0010 PP П 90 90 PP П 91 48 7 1 PP П
0020 91 31 PP П 91 56 8 5 B↑ 2 PP П
0030 91 32 PP П 91 52 9 0 5 0 П 7
0040 + П 8 4 0 П 9 + П A PP П 91 30
0050 K ИП 9 F x=0 50 K ИП 8 F x=0 53 PP П 91 30 3
0060 K П A ИП 4 F x2 K П 7 K ИП 7 F x=0 64 PP П 90 90
0070 С/П ИП 5 ИП 4 K П 8 5 K П A Cx B↑ B↑ K ИП 9
0080 1 - K П 9 K ЭКР PP В/О 7 K П A PP В/О    

Программа состоит из следующих блоков:

Адреса Выполняемые действия
00-49 Установка режимов работы, инициализация прерываний и заполнение регистров константами.
50-52 Основной цикл программы, выполняющий проверку количества импульсов.
53-58 Проверка окончания звукового сигнала и отключение прерываний.
59-66 Формируется секундный импульс в линии SELECT_IN
67-70 Отключение каналов порта и выход из программы.
71-84 Прерывание порта. Включение звукового сигнала, включение AUTOFEED, декремент значения счётчика импульсов и вывод его на экран с предварительной очисткой стека.
85-87 Прерывание таймера 2, окончание звукового сигнала. Выключение каналов параллельного порта.

В программе использованы некоторые приёмы оптимизации, которые поясняются комментариями в тексте для кросс-компилятора pps.mkl:



.CHARSET 1251
; приём сигнала PPS от приёмника АСПМК-3
; через линию BUSY параллельного порта 
; звуковое подтверждение и управление каналами порта
; с использованием прерываний

SCHET	.EQU	40	; (устанавливается также в R9)

	.ORG 0
	K INT
	P M SCHET	; количество принимаемых импульсов (из RX)
	10 M4		; 100 мс - длительность звукового сигнала
	EE 2 M5		; 1000 Гц - частота звукового сигнала

	1 PP M 9090	; статический режим параллельного порта
	PP M 9148	; сброс всех прерываний

	.NUML PPS
	<->		; RX=1 RY=PPS
	PP M 9131	; Прерывание 1, приоритет 1, вектор PPS
	PP M 9156	; Разрешить аппаратное прерывание параллельного порта (BUSY)

	.NUML TIMER
	ENT
	2
	PP M 9132	; Прерывание 2, приоритет 2, вектор TIMER
	PP M 9152	; Разрешить аппаратное прерывание таймера 2 (звуковой сигнал)

	9050 M7		; для косвенной адресации R9050
	+ M8		; (+2) для косвенной адресации R9052
	40 M9		; для косвенной адресации R40 (SCHET) 
	+ MA		; для косвенной адресации R9092

	PP M 9130	; разрешение прерываний (RX!=0)

A1:	KRM9		; R40 = SCHET
	F X=0 A1	; цикл по значению счётчика импульсов

A2:	KRM8		; R9052
	F X=0 A2	; задержка включения канала 2 до окончания сигнала
	PP M 9130	; запретить прерывания (RX=0) 
	3 KMA		; R9092 - включить канал 2 (SELECT_IN)
	RM4 FX^2	; RX=100
	KM7		; таймер 0 - 1 с

A3:	KRM7
	F X=0 A3	; проверка таймера 0

	; завершение программы
	PP M 9090	; выключить параллельный порт (RX=0)
			; каналы отключаются автоматически
	R/S		; останов программы

PPS:	; прерывание BUSY
	RM5 RM4
	KM8		; R9052 - звук
	5 KMA		; R9092 - включить канал 1 (AUTOFEED)
	CX
	ENT ENT		; очистка стека в прерывании - для вывода
	KRM9		; R40 = SCHET
	1 -		; декремент счётчика
	KM9		; R40 = SCHET
	K SCR		; вывод SCHET на экран	
	PP RTN		; возврат из прерывания


TIMER: ; прерывание таймера 2 (звук)
	7 KMA		; R9092 - отключить каналы управления 1-3
	PP RTN		; возврат из прерывания

.ENDP


НПП "СЕМИКО" (383) 271-01-25 (многоканальный)