Разработка генератора сигналов с возможностью выбора типа сигнала (меандр, импульсный или треугольный), страница 2

12-разрядный ЦАП DAC813 преобразует 12-ти битовый параллельный код в выходное униполярное напряжение. Время преобразования составляет 3,3 – 5мкс. В данном ЦАП есть возможность защелкивания раздельно младших 8 бит и старших 4-х. Преобразование осуществляется в 2 этапа: на первом – во внутренние регистры-защелки записываются цифровые данные (длительность записи не менее 55нс); на втором этапе в течение 50нс осуществляется перезапись данных из раздельных 4-х и 8-ми битовых регистров-защелок в общий 12-разрядный регистр–защелку, сразу после чего начинается преобразование данных, которое может длиться до 5мкс.

Для формирования на ШД номера прерывания, младшие 8 разрядов через резисторы R6-R13 (номиналом 1кОм каждый) соединены с источником питания. Они формируют на младших разрядах ШД сигнал слабой 1. Этот сигнал никак не влияет на работу МПС, но в момент считывания номера прерывания на ШД формируется число 255.


5. Перечень элементов

Обозначение

Наименование (тип)

Количество

Диод

VD1

Д9

1

Индикаторы

L0-L7

TDSG1150

8

Кварцевый резонатор

ZQ1

Кварц 15МГц

1

Конденсаторы

C1

К15-5-10пФ±20%

1

С2

К53-1-10мкФ±20%

1

Микросхемы

DD1

К1810ГФ84

1

DD2

DAC813

1

DD3

КМ155ИД12

1

DD4

К1810ВМ86

1

DD5

К1810ВИ54

1

DD6, DD7

КР580ИР82

2

DD8, DD9

КР580ВА86

2

DD10, DD11

К573РФ2

2

DD12

КР531ИД7

1

DD13

К155ЛИ1

1

DD14

К155ЛЛ1

1

DD15, DD16

К537РУ9А

2

DD17

КР580ВВ79

1

DD18

К155ЛН1

1

Резисторы

R1

МЛТ-0,25-200кОм±10%

1

R2, R3-R10, R11-R18

МЛТ-0,25-1кОм±10%

17

R19-R26

МЛТ-0,25-20кОм±10%

8

Транзисторы

VT1-VT8

2N1613

8


6. Программа

;вектор 255-го прерывания

03fch: 500h

03feh: 0h

;точка старта при включении процессора

0ff0h: jmp far ptr start

;таблица замены цифр на индикаторные коды

400h:

db 00111111b ;код цифры 0

db 00000110b ;код цифры 1

db 01011011b ;код цифры 2

db 01001111b ;код цифры 3

db 01100110b ;код цифры 4

db 01101101b ;код цифры 5

db 01111101b ;код цифры 6

db 00000111b ;код цифры 7

db 01111111b ;код цифры 8

db 01101111b ;код цифры 9

;переменные в ОЗУ

1000h: tp db 0

1001h: Am db 3 dup (0)

1004h: Fr db 4 dup (0)

1008h: Umax dw 0

100ah: freq dw 0

100ch: it dw 0

100eh: max_it dw 0

420h:

start:

;инициализация стека

  mov ax,100h

  mov ds,ax

  mov ss,ax

  mov sp,0fffh

  mov ax,0

  mov es,ax

  mov di,0

  mov cx,10h

clear:

  mov ds:[di],al ;очистка переменных в ОЗУ

  loop clear

;инициализация таймера ВИ54

  mov bx,3125

  mov al,00010110b ;0-й канал во 3-й режим с 2-байтной константой

  mov es:[2003h],al

  mov es:[2000h],bl

  mov es:[2000h],bh

  mov bl,250

  mov al,01110100b ;1-й канал в 2-й режим с 1-байтной константой

  mov es:[2003h],al

  mov es:[2001h],bl

;инициализация ВВ79

  mov al,0 ;8-элементный, 8-символьный дисплей, ввод слева, внешн. дешифрация, запрет одновременного нажатия 2-х клавиш

  mov es:[4001h],al

  mov al,00100010b ;коэффициент деления тактовой частоты =2

  mov es:[4001h],al

  sti ;разрешение аппаратных прерываний

wt:

  wait ;ожидание аппаратного прерывания

  jmp wt ;переход на метку wt

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

500h:

  mov al,es:[4001h] ;считывание слова-состояния ВВ79

  and al,0fh

  jz next_ ;если клавиатурное ОЗУ пусто, перейти на метку next_

  mov al,01010000b ;команда чтения символов из клавиатурного ОЗУ

  mov es:[4001h],al

  mov al,es:[4000h] ;считывание кода нажатой клавиши

  cmp al,7

  ja next_ ;если нажата цифра, проигнорировать нажатие и перейти на next_

  cmp al,1

  je A ;если нажата клавиша A (код =1), перейти на метку A

  cmp al,2

  je F ;если нажата клавиша F (код =2), перейти на метку F

;изменение типа генерируемого сигнала

typ:

  mov al,es:[4001h] ;считывание слова-состояния ВВ79

  and al,0fh

  jz typ ;если в клавиатурном ОЗУ нет символов, вновь считываем слово-состояния

  mov al,es:[4000h] ;считывание кода нажатой клавиши

  cmp al,10

  ja typ ;если нажата цифра >2, проигнорировать нажатие

  cmp al,8

  jb typ ;если нажата не цифра, проигнорировать нажатие

  and al,7 ;отбрасывание ненужной информации

  mov tp,al ;сохранение в переменной tp типа сигнала (0-меандр, 1-треугольный, 2-импульсный)

  jmp indicate ;переход на метку indicate

;изменение амплитуды генерируемого сигнала

A:

  mov cx,3

  mov di,1

a1:

  mov al,es:[4001h] ;считывание слова-состояния ВВ79

  and al,0fh

  jz a1 ;если в клавиатурном ОЗУ нет символов, вновь считываем слово-состояния

  mov al,es:[4000h] ;считывание кода нажатой клавиши

  cmp al,8

  jb a1 ;если нажата не цифра, проигнорировать нажатие

  cmp al,10h

  jb a2 ;если нажата цифра в первом ряду, перейти на a2

  and al,7

  add al,5

  jmp a3

a2:

  and al,7

a3:

  mov ds:[di],al ;сохранение нажатой цифры в ОЗУ по адресу ds:[di]

  inc di ;di=di+1

  loop a1 ;cx=cx-1, если cx>0, перейти на a1

;группировка цифр амплитуды в одно число

  mov dx,0

  mov cx,3

  mov bl,10

  mov si,1

  mov ax,0

a4:

  mul bl ;ax=ax*bl

  mov dl,ds:[si] ;dl=очередной цифре (движемся от старших цифр к младшим)

  add ax,dx ;ax=ax+dx

  inc si ;si=si+1

  loop a4 ;cx=cx-1, если cx>0, перейти на a4

  mov Umax,ax ;сохранение посчитаной амплитуды в переменной Umax

  jmp indicate ;переход на метку indicate

next_:

  jmp next_iter ;переход на метку next_iter

;изменение частоты генерируемого сигнала

F:

  mov cx,4

  mov di,4

b1:

  mov al,es:[4001h] ;считывание слова-состояния ВВ79

  mov al,0fh

  jz b1 ;если в клавиатурном ОЗУ нет символов, вновь считываем слово-состояния

  mov al,es:[4000h] ;считывание кода нажатой клавиши

  cmp al,8

  jb b1 ;если нажата не цифра, проигнорировать нажатие

  cmp al,10h

  jb b2 ;если нажата цифра в первом ряду, перейти на b2

  and al,7

  add al,5

  jmp b3

b2: