Добавил:
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 ; (ACC) = (PREG) = 0

LT S31 ; (S31) -> регистр T

MPY B21 ; (S31)*(B21) -> PREG

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

MPY B11 ; (S21)*(B11) -> PREG

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

EXAR ; (ACC) <-> буфер BCC

LACC IN1,16 ; (IN1) -> ACC

LT S31 ; (S31) ->T

MPY A21 ; (S31)*(A21) -> PREG

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

MPY A11 ; (S21)*(A11) -> PREG

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

SACH S11 ; сохранение S11

LT S11 ;(S11) -> T

MPY B01 ;(S11)*(B01) -> PREG

EXAR ; (ACC) <-> буфер BCC

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

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

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

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

.sect "Vivod"

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

LACC OUT1

LDP #OUTAD

SACL OUTAD

OUT OUTAD,OUTPORT

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

RET

.end

3.3.3. Трансформированная форма

Структурная схема звена второго порядка в трансформированной форме приведена на рис. 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 ; промежуточное значение

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

.sect "Vectors"

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

B START

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

B BEGIN ; NT2

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

IN INAD,INPORT

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

LT INAD

MPY MM1

LDP #IN1

SPH IN1

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

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

* LACC INAD

* LDP #IN1

* SACL IN1

.sect "Filter"

* вычисление выходного отсчета

ZAP ; (ACC) = (PREG) = 0

LACC S21,16 ; S21 -> ACC

LT IN1 ; IN1 -> регистр T

MPY B01 ; (IN1)*(B01) -> PREG

APAC ; (PREG)+(ACC) -> ACC

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

LACC S11,16 ; S11 -> ACC

MPY B11 ; (IN1)*(B11) -> PREG

LTA OUT1 ; предыдущее (PREG)+(ACC) -> ACC, OUT1 -> T

MPY A11 ; (OUT1)*(A11) -> PREG

APAC ; (PREG)+(ACC) -> ACC

SACH S21 ; сохранение значения S21

MPY A21 ; (OUT1)*(A21) -> PREG

LTP IN1 ; предыдущее (PREG) - ACC, (IN1) - T

MPY B21 ; (IN1)*(B21) -> PREG

APAC ; (PREG)+(ACC) -> ACC

SACH S11 ; сохранение значения S11

.sect "Vivod"

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

LACC OUT1

LDP #OUTAD

SACL OUTAD

OUT OUTAD,OUTPORT

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

RET

.end