Счётчик нажатий


Главная / ЭКВМ / Программы для ЭКВМ / Работа с оборудованием

Нередко встречается задача подсчёта количества дискретных сигналов от механических, оптических или иных датчиков. Это может использоваться для учёта каких-либо объектов или процессов в системах автоматики, подсчёта числа посетителей, количества распадов и т.п.

Конечно, можно изготовить специализированное изделие, оснащённое дискретным входом, индикатором, контроллером, блоком питания etc; можно воспользоваться и существующими промышленными контроллерами. Но нетрудно выполнить такое устройство и на базе ЭКВМ.


Программа "Счётчик"

Счётчик

Программа подсчитывает количество импульсов по линии BUSY последовательного порта ЭКВМ. Цифровой выход датчика присоединяется непосредственно к порту. Для подсчёта используется прерывание порта.

Результат во время работы выводится в регистр X стека. Остальные регистры перед выводом обнуляются для удобства считывания информации.

Компактный язык ЭКВМ позволяет разместить программу в 37 байтах.

Файл schetchik.mkp (37 байт, КС 19319/157)

  0 1 2 3 4 5 6 7 8 9
00 Cx P П 20 1 PP П 91 48 PP П 91 30
10 PP П 90 90 2 9 B↑ 1 PP П 91 31
20 PP П 91 56 0 B↑ B↑ B↑ БП 27 P ИП
30 20 1 + P П 20 K ЭКР PP В/О      

Исходный текст для кросс-компилятора

Файл schetchik.mkl

.CHARSET 1251
; Файл schetchik.mkl

; Подсчёт количества сигналов по линии BUSY

SCH	.EQU	20	; 

.ORG 0
	CX
	P M SCH		; счётчик 
	
	1
	PP M 9148	; Сброс всех прерываний
	PP M 9130	; Разрешение прерываний
	PP M 9090	; Режим работы параллельного порта - статический

	.NUML BUSY
	ENT
	1
	PP M 9131	; Прерывание 1, приоритет 1, вектор BUSY
	PP M 9156	; Разрешить аппаратное прерывание сигнала BUSY

	0
	ENT ENT ENT	; Очистка стека
	
A1:	GOTO A1		; Бесконечный цикл

BUSY:
	P RM SCH
	1 + 
	P M SCH
	K SCR
	PP RTN
.END

Программа "Счётчик нажатий (ЭКР)"

Счётчик нажатий ЭКР

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

Быстродействие ЭКВМ достаточно велико, чтобы дребезг воспринимался как отдельные сигналы и инициировал цепочку последовательных вызовов прерывания порта.

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

Кроме того, добавим в строку комментариев подсказку. Для изменения текста достаточно откорректировать строку программы.

Несмотря на использование прерываний, алгоритм устранения дребезга при помощи таймера и вывод подсказки, программа имеет размер 82 байта (из них 16 байт - текстовая строка).

Файл schetchik1.mkp (82 байта, КС 13187/237)

  0 1 2 3 4 5 6 7 8 9
00 Cx P П 20 1 PP П 91 48 PP П 91 30
10 PP П 90 90 3 5 B↑ 1 PP П 91 31
20 PP П 91 56 6 6 PP П 90 26 0 B↑
30 B↑ B↑ K ЭКР БП 33 5 П 0 PP ИП 90 92
40 8 K AND F x=0 65 2 PP П 90 50 PP ИП 90
50 50 F x=0 48 F L0 37 0 B↑ B↑ P ИП 20
60 1 + P П 20 K ЭКР PP В/О 91h 'С' E7h 'ч' F1h 'ё' E2h 'т'
70 E7h 'ч' A8h 'и' AAh 'к' 20h ' ' ADh 'н' A0h 'а' A6h 'ж' A0h 'а' E2h 'т' A8h 'и'
80 A9h 'й' 00h                

Исходный текст для кросс-компилятора

Файл schetchik1.mkl

.CHARSET 1251
; Файл schetchik1.mkl

; Подсчёт количества сигналов по линии BUSY
; Сигнал от кнопки, возможен дребезг контактов
; Информация в строке комментариев

SCH	.EQU	20	; Регистр для счёта

.ORG 0
	CX
	P M SCH		; счётчик 
	
	1
	PP M 9148	; Сброс всех прерываний
	PP M 9130	; Разрешение прерываний
	PP M 9090	; Режим работы параллельного порта - статический

	.NUML BUSY
	ENT
	1
	PP M 9131	; Прерывание 1, приоритет 1, вектор BUSY
	PP M 9156	; Разрешить аппаратное прерывание сигнала BUSY

	.NUML STR
	PP M 9026	; Строка комментариев

	0
	ENT ENT ENT	; Очистка стека
	K SCR

A1:	GOTO A1		; Бесконечный цикл

BUSY:	5
	M0		; Если сигнал от кнопки - устранение дребезга повторным считыванием
BUSY1:	PP RM 9092	
	8
	K AND	
	F X=0 BUSYE	; Проверка BUSY
	2
	PP M 9050	; Задержка 0,02 с
BUSY2:	PP RM 9050
	F X=0 BUSY2
	FL0 BUSY1

	0
	ENT ENT 	; Очистка стека

	P RM SCH
	1 + 
	P M SCH
	K SCR
BUSYE:
	PP RTN

STR:	.TEXT "Счётчик нажатий\0"
.END

Программа "Счётчик нажатий (ГРФ)"

Счётчик нажатий ГРФ

Удалим с экрана лишнюю информацию о состоянии регистров стека, для чего воспользуемся обращением к функциям графического экрана.

Для иллюстрации возможностей ЭКВМ выровняем выводимое значение по центру. Текстовое сообщение может быть любым.

Программа, использующая функции графического экрана, занимает 136 байт.

Файл schetchik3.mkp (136 байт, КС 28224/152)

  0 1 2 3 4 5 6 7 8 9
000 Cx P П 20 1 PP П 91 48 PP П 91 30
010 PP П 90 90 0 9 8 B↑ 1 PP П 91
020 31 PP П 91 56 6 0 P П 21 2 PP П
030 90 10 2 0 B↑ 2 4 PP П 90 00
040 0 0 8 2 PP П 90 21 1 PP П 90
050 03 3 2 P ИП 21 PP П 90 00 P ИП 20
060 PP П 90 23 0 P П 22 K ГРФ P ИП 22 F x=0
070 28 БП 67 3Ch 38h 33h 2Eh 2Ah 25h 21h
080 1Ch 18h 91h 'С' E7h 'ч' F1h 'ё' E2h 'т' E7h 'ч' A8h 'и' AAh 'к' 20h ' '
090 ADh 'н' A0h 'а' A6h 'ж' A0h 'а' E2h 'т' A8h 'и' A9h 'й' 00h 5 П 0
100 PP ИП 90 92 8 K AND F x=0 35 2 PP П 90
110 50 PP ИП 90 50 F x=0 11 F L0 00 P ИП 20
120 1 + P П 20 F lg K [x] 7 3 + K ИПРГ
130 P П 21 1 P П 22 PP В/О        

Исходный текст для кросс-компилятора

Файл schetchik3.mkl

.CHARSET 1251
; Файл schetchik3.mkl

; Подсчёт количества сигналов по линии BUSY
; Сигнал от кнопки, возможен дребезг контактов
; Для вывода информации используется грфический экран

; Регистры памяти
SCH	.EQU	20	; Регистр для счёта
POSX	.EQU	21	; Горизонтальная позиция числа
FSCH	.EQU	22	; Признак нажатия

.ORG 0
	CX
	P M SCH		; счётчик 

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

	.NUMT BUSY
	ENT
	1
	PP M 9131	; Прерывание 1, приоритет 1, вектор BUSY
	PP M 9156	; Разрешить аппаратное прерывание сигнала BUSY
	
	60 P M POSX	

A0:	; Вывести результат на графический экран
	2 
	PP M 9010	; Инициализация графического экрана

	20 ENT 24
	PP M 9000	; Позиция 24,20
	
	.NUM STR
	PP M 9021	; Вывод строки

	1
	PP M 9003	; Шрифт 1
	
	32
	P RM POSX
	PP M 9000	; Позиция POSX,32

	P RM SCH
	PP M 9023	; Вывод числа

	0 
	P M FSCH	; Очистить признак

	K GRPH

A1:	P RM FSCH
	F X=0 A0	; Если установлен - перерисовать
	GOTO A1		; Бесконечный цикл

TPOSX:	.DB 60, 56, 51, 46, 42, 37, 33, 28, 24
STR:	.TEXT "Счётчик нажатий\0"

;======================= Прерывание последовательного порта
BUSY:	5
	M0		; Если сигнал от кнопки - устранение дребезга повторным считыванием
BUSY1:	PP RM 9092	
	8
	K AND	
	F X=0 BUSYE	; Проверка BUSY
	2
	PP M 9050	; Задержка 0,02 с
BUSY2:	PP RM 9050
	F X=0 BUSY2
	FL0 BUSY1

	P RM SCH
	1 + 
	P M SCH

	F LG
	K INT
	.NUMT TPOSX	; Таблица позиций числа в зависимости от числа десятичных разрядов
	+
	K PRGM
	P M POSX	; Позиция по X
	1
	P M FSCH	; Признак
BUSYE:
	PP RTN
.END

Программа "Счётчик нажатий (ГИ)"

Счётчик нажатий ГИ

Для следующей программы воспользуемся возможностями графического интерфейса пользователя.

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

Программа с использованием графического интерфейса занимает 165 байт.

Файл schetchik2.mkp (165 байт, КС 22298/140)

  0 1 2 3 4 5 6 7 8 9
000 Cx P П 20 2 PP П 90 10 1 PP П 91
010 48 PP П 91 30 PP П 90 90 PP П 92 00
020 1 2 7 PP П 92 01 Cx PP П 92 02
030 PP П 92 03 0 6 2 B↑ 1 PP П 91
040 31 PP П 91 56 6 0 P П 21 6 4
050 PP П 92 08 0 P П 22 P ИП 22 F x=0 48
060 БП 56 5 П 0 PP ИП 90 92 8 K AND P x=0
070 01 01 2 PP П 90 50 PP ИП 90 50 F x=0
080 76 F L0 64 P ИП 20 1 + P П 20 F lg
090 K [x] 1 0 2 + K ИПРГ P П 21 1 P П
100 22 PP В/О 3Ch 38h 33h 2Eh 2Ah 25h 21h 1Ch
110 18h 91h 'С' E7h 'ч' F1h 'ё' E2h 'т' E7h 'ч' A8h 'и' AAh 'к' 20h ' ' ADh 'н'
120 A0h 'а' A6h 'ж' A0h 'а' E2h 'т' A8h 'и' A9h 'й' 00h 00h 1 K |x|
130 FFh 00h 08h 09h 09h 09h 09h 0Ch 0Bh 00h
140 00h 00h 21h 65h 00h 60h 18h 14h 53h 10h
150 01h 11h 65h 01h 60h 3Ch 20h 68h 00h 21h
160 5Ch 10h 00h 20h FFh          

Исходный текст для кросс-компилятора

Файл schetchik2.mkl

.CHARSET 1251
; Файл schetchik2.mkl

; Подсчёт количества сигналов по линии BUSY
; Сигнал от кнопки, возможен дребезг контактов
; Для вывода информации используется интерфейс пользователя

; Команды экранных форм:
TAB	.EQU	96
LDX	.EQU	104
LDY	.EQU	105
TYPE	.EQU	101
ATYPE	.EQU	78
LDADR	.EQU	77
SQU	.EQU	89
FRAME	.EQU	91
DRAWP	.EQU	84
DRAWB	.EQU	86
TXTP	.EQU	83
TXTB	.EQU	85
TXTK	.EQU	87
PREXP	.EQU	92
PRFORM	.EQU	93
PRHEX	.EQU	94
MCALL	.EQU	102
RETUM	.EQU	103
JNEZ	.EQU	1
JM	.EQU	56
END	.EQU	255

; Регистры памяти
SCH	.EQU	20	; Регистр для счёта
POSX	.EQU	21	; Горизонтальная позиция числа
FSCH	.EQU	22	; Признак нажатия

.ORG 0
	CX
	P M SCH		; счётчик 
	2 
	PP M 9010	; инициализация графического экрана

	1
	PP M 9148	; Сброс всех прерываний
	PP M 9130	; Разрешение прерываний
	PP M 9090	; Режим работы параллельного порта - статический
	PP M 9200	; 1 - разрешение интерфейса

	.NUMT TFORM
	PP M 9201	; главная таблица форм TFORM

	CX
	PP M 9202	; стартовое меню - 0
	PP M 9203	; активный элемент - 0

	.NUMT BUSY
	ENT
	1
	PP M 9131	; Прерывание 1, приоритет 1, вектор BUSY
	PP M 9156	; Разрешить аппаратное прерывание сигнала BUSY
	
	60 P M POSX	

A0:	64 PP M 9208	; Нарисовать форму
	0 P M FSCH	; Очистить признак

A1:	P RM FSCH
	F X=0 A0	; Если установлен - перерисовать
	GOTO A1		; Бесконечный цикл

;======================= Прерывание последовательного порта
BUSY:	5
	M0		; Если сигнал от кнопки - устранение дребезга повторным считыванием
BUSY1:	PP RM 9092	
	8
	K AND	
	P X=0 BUSYE	; Проверка BUSY
	2
	PP M 9050	; Задержка 0,02 с
BUSY2:	PP RM 9050
	F X=0 BUSY2
	FL0 BUSY1

	P RM SCH
	1 + 
	P M SCH

	F LG
	K INT
	.NUMT TPOSX	; Таблица позиций числа в зависимости от числа десятичных разрядов
	+
	K PRGM
	P M POSX	; Позиция по X
	1
	P M FSCH	; Признак

BUSYE:
	PP RTN
;======================
TPOSX:	.DB 60, 56, 51, 46, 42, 37, 33, 28, 24
STR:	.TEXT "Счётчик нажатий\0"

;======================	Главная таблица форм
TFORM:	.DB 0
	.DA F0
	.DB END
	
;====================== Форма F0
	.BASE
F0:	.DB 0		;максимальный номер элемента 
	.DBB F0DE, F0PI, F0PO, F0PL, F0PR, F0RI, F0KM

F0DE:	.DB 0	;таблица флагов действий
F0PI:	
F0PO:	
F0PL:	
F0PR:	.DB 0,0

F0KM:	.DBB F0KM0

F0RI:	; рисунок экранной формы
	.DB TYPE, 0			; шрифт 0

	.DB TAB, 24, 20 		; позиция
	.DB TXTP, 16			; TXTP - строка в области памяти программ
	.DA STR			

	.DB TYPE, 1			; шрифт 1

	.DB TAB, 60, 32 		; позиция
	.DB LDX				; Позиция по X из POSX
	.DA POSX

	.DB PREXP, 16 			; Вывод результата SCH
	.DA SCH
F0KM0:	.DB END
	
.END

Файлы программ доступны на странице "Работа с оборудованием"


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