Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЦПОС - Методические указания к курсовому проект...doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
961 Кб
Скачать
☆

In inad,inport ; прием отсчета через порт ввода

* умножение входного отсчета на масштабный множитель

LT INAD

MPY MM1

LDP #IN1

SPH IN1 ; запись отсчета во входную ячейку первого звена

*при значении множителя ММ=1 необходимо убрать умножение на него;

* для этого вместо последних 4-х команд вставить команды

* LACC INAD

* LDP #IN1

* SACL IN1

.sect "Filter"

* программа реализации фильтра - вычисление выходного отсчета

ZAP ;

LT IN1

MPY B01 ; (Xn) = (IN1), (PREG) = (Xn)*(B01)

LTA S11 ; (X(n-1)) -> T, предыдущее (PREG)+(ACC) -> ACC

MPY B11 ; (PREG) = (X(n-1))*(B11)

LTA S21 ; (X(n-2)) -> T, предыдущее (PREG)+(ACC) -> ACC

MPY B21 ; (PREG) = (X(n-2))*(B21)

LTA S31 ; (Y(n-1)) -> T, предыдущее (PREG)+(ACC) -> ACC

MPY A11 ; (PREG) = (Y(n-1))*(A11)

LTA S41 ; (Y(n-2)) -> T, предыдущее (PREG)+(ACC) -> ACC

MPY A21 ; (PREG) = (Y(n-2))*(A11)

APAC ; предыдущее (PREG)+(ACC) -> ACC

SACH OUT1 ; сохранение выходного отсчета

DMOV S31 ; сдвиг (S31) -> S41

DMOV OUT1 ; сдвиг (OUT1) -> S31

DMOV S11 ; сдвиг (S11) -> S21

DMOV IN1 ; сдвиг (IN1) -> S11

.sect "Vivod"

; Вывод выходного отсчета фильтра

LACC OUT1

LDP #OUTAD

SACL OUTAD

OUT OUTAD,OUTPORT

CLRC INTM ; разрешение прерывания для следующего отсчета

RET

.end

3.3.2. Каноническая форма

Структурная схема звена второго порядка в канонической форме приведена на рис. 4.б. Обозначения переменных, используемые в программе, соответствуют обозначениям на этом рисунке.

* Программа реализации БИХ фильтра в канонической форме

.version 50

.global BUFFER2

.mmregs

* Задание значений символов, используемых в программе

OUTPORT .set 51h

INPORT .set 50h

.data

; данные для фильтра

INAD .word 0

OUTAD .word 0

MM1 .word 32768*74/100 ; масштабный множитель первого звена 0,74

.sect "KOF_VAR"

; Коэффициенты фильтра, к-ты Ai записываются с противоположным знаком

; Первое звено

B01 .word 32768*2793/10000 ; B01 = 0,2793

B11 .word (32768*307/10000) ; B11 = 0,0307

B21 .word 32768*2793/10000 ; B21 = 0,2793

A11 .word 32768*5586/10000 ; A11 = 0,5586

A21 .word -(32768*8289/10000) ; A21 = -0,8289

; переменные фильтра

; Первое звено

In1 .Word 0 ; входной отсчет первого звена

S11 .word 0 ; промежуточное значение

S21 .word 0 ; задержанное на такт промежуточное значение

S31 .word 0 ; задержанное на 2 такта промежуточное значение

OUT1 .word 0 ; выходной отсчет первого звена

.sect "Vectors"

* Таблица векторов прерываний

B START

B BEGIN ; INT1 внешние прерывания

B BEGIN ; INT2

B BEGIN ; INT3

B BEGIN ; TINT прерывание по таймеру

.sect "Init_main"

* Инициализация процессора и основная программа

START:

* установка режимов работы

SETC INTM ; запрет прерываний на время установки режимов работы

CLRC OVM ; режим переполнения

SPM 1 ; режим сдвига значений при передаче (PREG) -> АЛУ

SETC SXM ; режим расширения знака

LDP #0 ; установка разрешения необходимых прерываний

SPLK #0Fh,IMR

CLRC INTM ; разрешение прерываний

LOOP:

NOP ; основная программа – бесконечная петля ожидания

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

B LOOP

* подпрограмма прерывания, которая состоит из трёх основных частей

.sect "Vvod"

* прием очередного отсчета

BEGIN:

* ввод отсчета

LDP #INAD