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

  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 ;разрешение аппаратных прерываний и возврат из подпрограммы обработки прерывания


7. Алгоритм работы программы

В момент включения питания программа начинает выполняться, начиная с адреса 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 этапа: запись во внутренние регистры защелки и непосредственно запуск преобразования. На завершающей стадии разрешаются аппаратные прерывания и происходит возврат из подпрограммы обработки прерывания.


8. Список литературы

1. Освоение ассемблера: Метод. указания. М.М. Мичурина, И.Н. Сушкин. Красноярск ИПЦ КГТУ, 2002.

2. Цифровые устройства и микропроцессоры. Архитектура микропроцессоров Intel: Метод. указания. М.М. Мичурина. Красноярск ИПЦ КГТУ, 2004.

3. Микропроцессорный комплект К1810, Ю.М. Казаринов “Высшая школа”, М., 1990г.

4. Цифровые устройства и микропроцессоры: Метод. указания. М.М. Мичурина, И.Н. Сушкин. Красноярск ИПЦ КГТУ, 2001.

5. Контроллер клавиатуры и индикации: Метод. указания / Сост. М.М. Мичурина. Красноярск ИПЦ КГТУ, 2003. 19с.

6. Assembler. В. Юров. «Питер», СПб. 2001г.