and al,7
b3:
mov ds:[di],al ;сохранение нажатой цифры в ОЗУ по адресу ds:[di]
inc di ;di=di+1
loop b1 ;cx=cx-1, если cx>0, перейти на b1
;группировка цифр частоты сигнала в одно число
mov dx,0
mov cx,4
mov bl,10
mov si,4
mov ax,0
b4:
mul bl ;ax=ax*bl
mov dl,ds:[si] ;dl=очередной цифре (движемся от старших цифр к младшим)
add ax,dx ;ax=ax+dx
inc si ;si=si+1
loop b4 ;cx=cx-1, если cx>0, перейти на b4
mov freq,ax ;сохранение посчитаной частоты в переменной freq
;определение максимального числа выборок сигнала за период
mov ax,0
mov it,ax ;it=0
mov dx,0
mov ax,20000
mov bx,freq
div bx ;ax=20000/freq
mov max_it,ax ;сохранение максимального ко-ва выборок в переменной max_it
;обновление индикаторного ОЗУ
indicate:
mov bx,0
mov cx,8
mov al,10010000b ;команда записи в индикаторное ОЗУ с автоинкрементом адреса
mov es:[4001h],al
mov si,400h
mov di,0
c1:
mov bl,ds:[di] ;считывание очередной цифры
mov al,es:[si+bx] ;замена цифры на индикаторный код
cmp cx,6
jne c2
or al,80h ;если заменяется 2-я цифра амплитуды, включить на индикаторе точку
c2:
mov es:[4000h],al
inc di ;di=di+1
loop c1 ;cx=cx-1, если cx>0, перейти на с1
;вычисление следующего значения сигнала и выдача его на ЦАП
next_iter:
mov ax,it
inc ax ;увеличение номера текущей выборки
mov it,ax
cmp ax,max_it
jne mode ;если №текущей выборки <max_it, перейти на mode
mov ax,1 ;иначе, номер выборки=1
mov it,ax
mode:
mov al,tp
cmp tp,0
je meandr ;если tp=0, перейти на метку meandr
cmp tp,1
je triangle ;если tp=1, перейти на метку triangle
;для импульсного сигнала
mov ax,it
mov bx,max_it
dec bx ;bx=max_it-1
cmp ax,bx
jne d1 ;если № выборки не =bx, перейти на d1
mov ax,Umax ;иначе уровень сигнала, выдаваемый на ЦАП =Umax
jmp out_DAC ;перейти на out_DAC
d1:
mov ax,0 ;уровень сигнала, выдаваемый на ЦАП =0
jmp out_DAC ;перейти на out_DAC
meandr:
mov ax,it
mov bx,max_it
shr bx,1 ;bx=bx/2
cmp ax,bx
jb d2 ;если № выборки < max_it/2, перейти на d2
mov ax,Umax ;иначе уровень сигнала, выдаваемый на ЦАП =Umax
jmp out_DAC ;перейти на out_DAC
d2:
mov ax,0 ;уровень сигнала, выдаваемый на ЦАП =0
jmp out_DAC ;перейти на out_DAC
triangle:
mov dx,0
mov ax,it
mov bx,max_it
shr bx,1 ;bx=bx/2
cmp ax,bx
ja d3 ;если № выборки > max_it/2, перейти на d3
mov ax,Umax
mov bx,freq
mul bx
mov bx,it
mul bx
mov bx,10000
div bx ;ax=Umax*freq*it/10000
jmp out_DAC ;перейти на out_DAC
d3:
mov ax,it
sub ax,bx
mov bx,freq
mul bx
mov bx,Umax
mul bx
mov bx,10000
div bx
mov dx,Umax
sub dx,ax
mov ax,dx ;ax=Umax-Umax*freq*(it-max_it/2)/10000
out_DAC:
mov es:[3000h],ax ;запись посчитанного значения сигнала во внутр. регистр-защелку ЦАП
mov es:[3001h],ax ;запуск преобразования на ЦАП
iret ;разрешение аппаратных прерываний и возврат из подпрограммы обработки прерывания
В момент включения питания программа начинает выполняться, начиная с адреса 0FF0h ПЗУ. По этому адресу расположена команда передачи управления на основную программу, расположенную, начиная с адреса 500h.
Основная программа начинается с инициализации сегментных регистров и очистки переменных в ОЗУ. Далее инициализируется таймер. Нулевой канал программируется для работы в 3-м режиме с константой 3125 (на выходе – меандр с частотой 800Гц). Первый канал устанавливается во 2-й режим с константой 250 (на выходе импульсы длительностью 0,2мкс и частотой следования 20кГц).
После этого идет инициализация ВВ79: задается 8-разрядный, 8-символьный дисплей, ввод слева, внешняя дешифрация, запрет одновременного нажатия нескольких клавиш, деление тактовой частоты на 2 (При тактовой частоте 800Гц, программном делении ее на 2, 8-символьном дисплее обеспечивается загорание каждого индикатора 50 раз/сек. Учитывая инерционность индикаторов, свечение будет казаться непрерывным).
На этом инициализация системы завершается, разрешаются аппаратные прерывания и МП переходит в режим ожидания их.
Как только от таймера приходит лог. 1 на вход запроса прерывания МП, процессор передает управление по адресу 500h – на подпрограмму обработки прерывания. В ней сначала считывается слово-состояния контроллера ВВ79. В этом слове выделяются биты, отвечающие за количество символов, находящихся в клавиатурном ОЗУ. Если ОЗУ пусто, происходит переход на метку next_, а с нее – на метку next_iter. Дополнительная метка next_ введена в середину кода программы, поскольку МП К1810ВМ86 поддерживает условные переходы не дальше ±127 байт, что значительно меньше размера программы. Если в ОЗУ находится хотя бы один байт – происходит его считывание. По этому байту определяется какая клавиша была нажата. Если нажатая клавиша – цифра, то нажатие - игнорируется и происходит переход к вычислению следующего значения для ЦАП. Если была нажата одна из трех клавиш (Type, A, F), то после этого программа ожидает ввода нескольких цифр (этими цифрами заполняются соответствующих поля индикаторов). Также эти цифры группируются в отдельные числа, которые хранятся в ОЗУ и содержат информацию о типе генерируемого сигнала (tp), его амплитуде (Umax) и частоте (freq). Дополнительно для заданной частоты freq вычисляется количество выборок, которое должно укладываться в один период сигнала (max_it). Далее по программе, в зависимости от типа генерируемого сигнала, происходит определение нового значения, которое будет выводиться на ЦАП. Вывод на ЦАП происходит в 2 этапа: запись во внутренние регистры защелки и непосредственно запуск преобразования. На завершающей стадии разрешаются аппаратные прерывания и происходит возврат из подпрограммы обработки прерывания.
1. Освоение ассемблера: Метод. указания. М.М. Мичурина, И.Н. Сушкин. Красноярск ИПЦ КГТУ, 2002.
2. Цифровые устройства и микропроцессоры. Архитектура микропроцессоров Intel: Метод. указания. М.М. Мичурина. Красноярск ИПЦ КГТУ, 2004.
3. Микропроцессорный комплект К1810, Ю.М. Казаринов “Высшая школа”, М., 1990г.
4. Цифровые устройства и микропроцессоры: Метод. указания. М.М. Мичурина, И.Н. Сушкин. Красноярск ИПЦ КГТУ, 2001.
5. Контроллер клавиатуры и индикации: Метод. указания / Сост. М.М. Мичурина. Красноярск ИПЦ КГТУ, 2003. 19с.
6. Assembler. В. Юров. «Питер», СПб. 2001г.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.