Разработка корреляционного фильтра. Разработка функциональной схемы, страница 3

    - хранимые постоянно –  понадобится выделить отдельный   регистр для каждой такой переменной;

    - хранимые кратковременно – несколько таких переменных можно сохранять в одном регистре по очереди, не допуская перекрытия  отрезков времени хранения.

Список переменных

Диаграммы распределения регистров и ячеек памяти

1

2

3

4

5

6

7

8

IO(PORT1)

MX0

MY0

MR

DM(sin)

MX1

MY1

MR

DM(COS)

3.8 Расчет параметров таймера

Для обработки отсчетов в нужный момент времени в программе на языке ассемблера необходимо использовать цикл ожидания. Для этого следует задействовать таймер, установив нужные параметры в его регистры.

Таймер процессора ADSP-2189M содержит два 16-битных регистра TCOUNT и  TPERIOD и один 8-битный регистр TSCALE. Эти регистры отвечают за работу таймера и отображены на область памяти: TPERIOD по адресу 0х3FFD, TCOUNT по адресу 0х3FFC, TSCALE по адресу 0х3FFB.

TSCALE – регистр масштаба (в работе TSCALE=0).

TCOUNT – регистр счета (до включения таймера он должен быть равен TPERIOD)

TPERIOD - регистр периода, который хранит период формирования прерываний.

Рассчитаем параметры таймера исходя из параметров канала:

Скорость передачи  V – 200 Бод 

Частота поднесущей  Fнес - 3.2 кГц

Частота дискретизации  Fдискр - 25.6 кГц

Число периодов колебания сигнала с несущей частотой 3.2 кГц на одно сообщение находится так:

        

Число отсчетов сигнала на одном периоде колебания равно:

         

Таким образом, количество отсчетов, необходимое для передачи одного сообщения, равно:

                         

128 – идеальный  вариант,  когда  рассогласование  отсутствует.

Рассчитаем значения регистров TPERIOD и TSCALE исходя из условия, что  прерывания таймера должны происходить с частотой дискретизации 25.6 кГц.

         

Приняв TSCALE=0, а частоту кварцевого резонатора 12,5 МГц,  получим:

   

Таким  образом,  TPERIOD =487.

3.9 Текст программы Main

#define PORT1 0x200

#define PORT2 0x200

#define m 512

#define samples 4

#define sin 0x0357

#define cos 0x0358

.section/pm pm_da;

.VAR/CIRC sinus[256]="sin256.dat";

.EXTERN korr;

.section/pm interrupts;                                        

_reset: JUMP start; NOP; NOP; NOP;            // прерывание по сбросу процессора

RTI; NOP; NOP; NOP;            

RTI; NOP; NOP; NOP;

RTI; NOP; NOP; NOP;

RTI; NOP; NOP; NOP;

RTI; NOP; NOP; NOP;

RTI; NOP; NOP; NOP;

RTI; NOP; NOP; NOP;

RTI; NOP; NOP; NOP;

RTI; NOP; NOP; NOP;

JUMP korr; NOP; NOP; NOP;          // прерывание от таймера

RTI; NOP; NOP; NOP;

.section/pm program;

start:          AX0=487;                              // Установка таймера с частотой 25,6 кГц

DM(0x3FFC)=AX0;              // установить TCOUNT=487

DM(0x3FFD)=AX0;              // установить TPERIOD=487

AX0=0;

DM(0x3FFB)=AX0;       

I5=sinus;                                      // начальный адрес массива sin_mas

L5=LENGTH(sinus);                   // длина кольцевого буфера

M5=64;                                        // шаг Pi/2

M7=32;                                        // шаг Pi/4