Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
MUK_KR_Altera_2011.doc
Скачиваний:
38
Добавлен:
09.02.2015
Размер:
14.64 Mб
Скачать

3.5. Синтез счетчика по mod Мj

Требуемые коэффициенты Mj реализуются последовательным включением делителя на постоянный коэффициент Mk и управляемого 2-байтовыми данными 16-разрядного счетчика.

Рис. 3.14. Делитель на Mk= 25иMkeyb= 214.

Рис. 3.15. Временные диаграммы работы делителя на Mk= 25иMkeyb= 214

Рис. 3.16. Схема 16-разрядного делителя на M1j

Счетчик по mod Mk на МЭ lpm counter. Макроэлемент счетчика используется в режиме делителя на 2k; для Mk = 32 = 25 выходной сигнал снимается с выхода Q4 (схема представлена на рис. 3.14, а временные диаграммы – на рис. 3.15). Эта же схема формирует сигнал частоты  500 Гц для опроса шифратора клавиатуры, при этом коэффициент деления Mkeyb = 107/500 = = 20 000. Легко задать Mkeyb = 214 = 16 384, если использовать 16-разрядный

счетчик с выходом Q13, при этом частота выходного сигнала fkeyb = = = примерно 610 Гц.

Делитель на M1j строится по такому же принципу, что и делитель на M1i (16-разрядный счетчик с записью двухбайтовых чисел). На вход делителя поступает сигнал частоты f0/M0 = 10 МГц, выходной сигнал делителя – x1. Схема делителя на M1j показана на рис. 3.16.

3.6. Контроллер клавиатуры

Для управления имитатором используются 16 клавиш, каждой из которых приписан свой 4-разрядный двоичный код. При нажатии любой клавиши контроллер клавиатуры должен выдавать двоичный код этой клавиши и флаг клавиатуры, указывающий факт нажатия любой клавиши (сигнал квитирования), или сигнал запроса прерывания IR (interrupt request).

Шифратор клавиатуры. На рис. 3.17 изображена схема шифратора клавиатуры, содержащая счетчик по mod 16 (74169) и мультиплексор 161 (161mux). При замыкании клавиши k = 0, 1, , 15 выходной сигнал DO мультиплексора примет значение 1 в момент времени, когда счетчик установится в состояние k, что приведет к появлению значения сигнала IR = 1 и блокировке счета. Пока клавиша нажата, счетчик выдает число k = DO3DO2DO1DO0, а D-триггер – сигнал IR = 1. При отпускании клавиши сигнал IR установится в 0 и счетчик продолжит счет. Чем ниже частота задающего генератора, тем надежнее исключается «дребезг» контактов клавиш. На частоте генератора 500 Гц «дребезг» надежно устраняется. На рис. 3.18 – временные диаграммы для случая, когда нажата клавиша с номером 9.

Интерфейсные схемы шифратора клавиатуры подключают к системной шине данных 4-разрядный код нажатой клавиши помощью буфера данных, показанного на рис. 3.19, в. Перепадом сигнала IR с 0 на 1 D-триггер

Рис. 3.17. Схема шифратора клавиатуры

Рис. 3.18. Временные диаграммы работы шифратора клавиатуры

устанавливается в состояние 1 (рис. 3.19, б). С выхода триггера флаг клавиатуры FKB = DO4 = 1 подается на буфер данных 74244b вместе с 4-разрядным кодом клавиатуры DO3DO2DO1DO0. При выполнении команды IN CSKB с дешифратора адреса поступает значение сигнала = 0 (chip select keyboard), а с шины управления – значение = 0, что приводит к появлению значения сигнала== 0, разрешающего передачу по шине данных 5-разрядного кода в аккумулятор CPU.

а

б

в

г

Рис. 3.19. Интерфейсные схемы клавиатуры:а – формировательX2;б– флаг клавиатуры;в– формирователь шины данных для ввода;г – расположение клавиш

Анализ назначения нажатой клавиши. Функциональное назначение клавиш показано на рис. 3.19, г: клавиши k = 0, 1,  , 7 задают скорость движения цели vj (j = k), k = 8 и 9 – направление движения цели (клавиши 10 и 11 не используются), k = 12, 13, 14, 15 – период Ti сигнала G (i = 1, 2, 3, 4).

Коды этих трех групп клавиш различаются значением двух старших разрядов DO3DO2: 10 – направление движения; 00 и 01 – значение скорости vj; 11 – значение периода Ti. Для принятия решения маской 00001100 выделяются разряды DO3DO2, и содержимое аккумулятора сравнивается с числом 8: содержимое равно 8, если нажатая клавиша имеет коды 10 (клавиши направления движения); содержимое больше 8, если нажатая клавиша имеет коды 11 (клавиши значений периода Ti); содержимое меньше 8, если нажатая клавиша имеет коды 0(клавиши значений скорости vj). Программа обслуживания клавиатуры при использовании МЭ (два 16-разрядных счетчика для задания периода и один 16-разрядный счетчик для задания скорости движения vj и программного ввода данных с квитированием имеет вид (заданы адреса клавиатуры – 28h, триггера направления – 68h).

L1:

IN

port_KB

; А =  DO4DO3DO2DO1DO0

MOV

C,A

; запоминание кода в регистре C

ANI

10h

; A = 0 0 0 D4 0 0 0 0 (квитирование)

JZ

L1

; если D4 = IR = 0, повторный ввод

OUT

port_KB

; сброс флага клавиатуры DO4 (см. рис. 3.19, б)

MVI

A,0Fh

; A = 0 0 0 0 1 1 1 1

ANA

C

; 0 0 0 D3D2D1D0 – код нажатой клавиши

MOV

C,A

; запоминание в регистре C кода нажатой клавиши

ANI

0Ch

; A = 0 0 0 0 D3D2 0 0

CPI

8

; сравнение старших разрядов кода с числом 8

JZ

L2

; переход к заданию направления движения

JC

L3

; переход к заданию скорости движения

CALL

TAB

; подпрограмма чтения таблицы данных

OUT

port_dLT

; запись dML в регистр младшего байта счетчика M1i

INX

H

; адрес старшего байта dMM данных

MOV

A,M

; пересылка dMM в аккумулятор

OUT

port_dMT

; запись dMM в регистр старшего байта счетчика M1i

JMP

L1

; переход на ввод кода клавиши

L2:

MOV

A,C

; A = 0 0 0 0 D3D2D1D0 – код нажатой клавиши

OUT

port_X2

; запись D0 = DAL0 в триггер знака (см. рис. 3.19, а)

JMP

L1

L3:

CALL

TAB

; подпрограмма чтения таблицы данных

OUT

port_dLV

; запись dML в регистр младшего байта счетчика M1j

INX

H

MOV

A,M

; A = dMM

OUT

port_dMV

; запись dMM в регистр старшего байта счетчика M1j

JMP

L1

TAB:

LXI

H,700h

; rp H = 0700h

MOV

A,C

; A = 0 0 0 0 D3D2D1D0 – код нажатой клавиши

ADD

A

; A = A + A = 2C

MOV

C,A

; формирование в rp B числа, равного

MVI

B,0

; удвоенному коду клавиши

DAD

B

; HL = HL + BC = 0700h + 2C – адрес памяти

MOV

A,M

; A = dML – младший байт данных

RET

Для таблицы данных отведена область ПЗУ, начинается с адреса 0700h. Для хранения двухбайтовых чисел используются две соседние ячейки памяти с адресами A и A + 1. Подпрограмма TAB определяет адрес младшего байта данных и читает его из ПЗУ. Для определения адреса A по коду нажатой клавиши к начальному адресу 0700h прибавляется удвоенный код клавиши. Таким образом, по коду клавиши, например, с номером k = 2, задающей в соответствии с рис. 3.19, г скорость v2, определяются адреса двух ячеек памяти 0704h и 0705h, где хранятся соответственно младший и старший байты числа . При выполнении команды OUTport_KB на ЛЭ ИЛИ (см. рис. 3.19, б) поступают сигналы = 0 и= 0, на выходе ЛЭ вырабатывается сигнал= 0, устанавливающий триггер флага клавиатуры в состояниеQ = 0, что приводит к сбросу флага клавиатуры (сигнал DO4 = 0). При выполнении команды OUT CSX2 по сигналам =0 и= 0 вырабатывается сигнал= 0 (см. рис. 3.19, а), перепадом с 0 на 1 которого в триггер знака x2 записывается значение разряда BD0 = DO0.

Если ввод данных с клавиатуры производится по прерыванию (сигнал IR подается на вход RST7.5), тогда программа обработки прерываний должна начаться с запоминания содержимого регистровых пар, аккумулятора и регистра признаков. Затем следует ввод данных и их анализ.

PUSH

H

PUSH

B

PUSH

PSW

IN

CSKB

; А =  DO4DO3DO2DO1DO0

MOV

C,A

; запоминание кода в регистре C

MVI

A,0Fh

; A = 0 0 0 0 1 1 1 1

ANA

C

; 0 0 0 D3D2D1D0 – код нажатой клавиши

MOV

C,A

; запоминание в регистре C кода нажатой клавиши

ANI

0Ch

; A = 0 0 0 0 D3D2 0 0

CPI

8

; сравнение старших разрядов кода с числом 8

JZ

L2

; переход к заданию направления движения

JC

L3

; переход к заданию скорости движения

CALL

TAB

; подпрограмма чтения таблицы данных

OUT

port_dLT

; запись dML в регистр младшего байта (см. рис. 3.12)

INX

H

; адрес старшего байта dMM данных

MOV

A,M

; пересылка dMM в аккумулятор

OUT

port_dMT

; запись dMM в регистр старшего байта (см. рис. 3.12)

JMP

L1

L2:

MOV

A,C

; A = 0 00 0 D3D2D1D0 – код нажатой клавиши

OUT

port_X2

; запись D0 = DAL0 в триггер знака (см. рис. 3.19, а)

JMP

L1

L3:

CALL

TAB

; подпрограмма чтения таблицы данных

OUT

port_dLV

; запись dML в регистр младшего байта счетчика

; M1j, рис. 3.16

INX

H

MOV

A,M

; A = dMM

OUT

port_dMV

; запись dMM в регистр старшего байта счетчика

; M1j, рис. 3.16

JMP

L1

TAB:

LXI

H,700h

; rp H = 0700h

MOV

A,C

; A = 0 0 0 0 D3D2D1D0 – код нажатой клавиши

ADD

A

; A = A + A = 2C

MOV

C,A

; формирование в rp B числа, равного

MVI

B,0

; удвоенному коду клавиши

DAD

B

; HL = HL + BC = 0700h + 2C – адрес памяти

MOV

A,M

; A = dML – младший байт данных

RET

L1:

POP

PSW

POP

B

POP

H

EI

; разрешение всех прерываний (после следующей

; команды)

RET

; возврат из подпрограммы обработки прерываний

; RST 7.5

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]