Используемые в программе процедуры и макрокоманды

Proc _Reg

Цифровой регулируемый привод, таймерное исполнение!

Zad5: ;задача 5 в меню каркасной программы

mov [I],0 ;инициализация переменных, I(k)

mov [I1],0 ;I(k-1)

mov [Nupr],0 ;управление на ЦАП

mov [Y],0 ;Y(k)

mov [Y1],0 ;Y(k-1)

mov [X],4000 ;задание скорости на входе фильтра

mov ax,[X] ;

sar ax,3 ; ;ах=4000/8=500

mov [C],ax ;С=500

TaimIni 2735, Privod;f0=438Гц = 1/Т 0 ; Т 0 = 0,00228с,

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

; цикл фоновой (прерываемой) программы

ckl:

DisplBin 320,Y ;индикация переменных, задание

DisplBin 350,Nos ;обратная связь

DisplBin 380,Nras ;рассогласование

DisplBin 410,Nu ;управление

KeyTest ;клавиатура нажималась? jz ckl ;переход по нулю

ExitInt ;выход из прерываний

WriteReg 0D000h, Nul ;обнулить ЦАП, останов привода jmp menu ;выход в меню

;=========================================

;обработчик таймерных прерываний

Privod:push ax ;сохранение регистров фоновой программы

push cx

push dx

Call _Fz ;фильтр, расчет задания, результат в Y

Call _Fos ;формирование обратной связи Nos

Call _Reg ;ПИ-регулятор, выход в Nu

mov al,20h ;код 20h – в регистр al

out 20h,al ;al – в порт с адресом 20h

pop dx ;восстановить регистры

pop cx

pop ax

sti ;разрешить прерывания процессору

iret ;возврат в фоновую программу

;===========================

;Используемые процедуры

PROC _Fz ;формирование задания, выход фильтра

mov ax,0

add ax,[C] ;ax=500

add ax,[Y] ;ax=500+y(k-1)

mov bx,[Y1]

sar bx,3 ;bx=1/8[y(k-1)]

sub ax,bx ;ax=500 + y(k-1) -1/8[y(k-1)]

mov [Y],ax ;Y(k) – новое значение задания скорости

mov [Y1],ax ;Y(k-1) ← Y(k) для нового цикла

ret ;возврат из процедуры

;================================================

;процедура формирования обратной связи с АЦП

PROC _Fos ;формирование обратной связи

ReadReg 0F400h, Nos ;чтение АЦП в переменную Nos ret

ENDP

;==========================================

;процедура регулятора скорости

mov dx,0 ;делимое в dx,ax

mov ax,[Nras] ;

mov bx,[a] ;делитель a=7 в регистре bx

div bx ;деление dx:ax на bx; в ах –частное, в dx–остаток

add ax,[I1] ;ax=Nras/a+I(k-1)

mov [I],ax ;I(k) – интегральная часть

mov [I1],ax ;I(k-1)=I(k)

add ax,[Nras] ;добавить пропорциональную часть

mov [Nu],ax ;Nu=ax – управление для ЦАП

WriteReg 0D100h ;переслать в ЦАП

ret ;возврат из процедуры

ENDP

;================================================

;Сегмент данных

DATASEG ;начало сегмента данных

INCLUDE "pr_menu.dat" ;файл с данными для меню

 

;Область для сохранения параметров системы.

oldip8 dw 0 ;старое смещение вектора прер.

oldcs8 dw 0 ;старый сегмент вектора прер.

;область сегмента данных – управление приводом

X dw 0 ;задание на входе фильтра

Y dw 0 ;выход фильтра y(k)

Y1 dw 0 ;выход фильтра y(k-1)

C dw 0 ;константа

I dw 0 ;компонент интеграла I(k)

I1 dw 0 ;компонент интегралаI(k-1)

Nos dw 0 ;значение обр.связи в k интервале

Ras dw 0 ;рассогласование

Nu dw 0 ;управление (на ЦАП)

a dw 7 ;коэффициент а=7 алгоритма

Nul dw 0 ;нулевая константа для ЦАП

;конец сегмента данных

ENDS

;===============================================

STACK 200h ;начало сегмента стека размером 200h

;===============================================

END Start ;конец программы, стартовый адрес

;===============================================

Процедуры

_DisplBin –вывод на экран однословного двоичного числа со знаком путем прямой записи в видеопамять. Требует установки: в di –адреса знакоместа на мониторе, в переменной Atr – атрибута символов.

_PrintBin –вывод двоичного числа в десятичной форме.

_TestKey – вывод на монитор кодов и сканкодов клавиатуры в десятичной форме.