Программирование последовательных портов и режима работы таймера. Изучение принципов и основных режимов функционирования последовательных портов процессора ADSP-2181

Страницы работы

Фрагмент текста работы

Федеральное агентство по образованию

РГРТУ

Кафедра ТОР

Лабораторная работа №4.

«Программирование последовательных портов и режима работы таймера».

                                                                                        Выполнил:

                                                                                        ст. гр. 4110

                                                                                       

                                                                                         Проверила:

                                                                                              

Рязань 2008

Цель работы: изучение принципов и основных режимов функционирования последовательных портов процессора ADSP-2181, алгоритма его взаимодействия с кодеком AD1847, исследование режимов работы AD1847 , фильтрации аудиосигналов и вывод результатов на осциллограф.   

Значения регистров.

Регистр автобуферизации SPORT0:

B#0000001010000111

Управляющий регистр SPORT0:

B#1000011000001111

Значение регистра imask при инициализации AD1847 для разрешения прерывания на передачу SPORT0 и от IRQE:

B#0001010000                0x50

Значение регистра imask при инициализации AD1847 для  разрешения прерывания на передачу SPORT0 и от таймера:

B#0001000001                0x41

Значение регистра imask перед ожиданием прерывания для разрешения прерывания на передачу SPORT0 и от IRQE:

B#0000110000                0x30

Значение регистра imask  перед ожиданием прерывания для разрешения прерывания на передачу SPORT0 и от таймера:

B#0000100001                0x21

Импульсные характеристики фильтров.

НЧ-фильтр (fir 3).

1.jpg

ВЧ-фильтр(fir 2).

2.jpg

Текст программы на языке Ассемблер.

/****** ОПИСАНИЕ ПЕРЕМЕННЫХ В ПАМЯТИ ДАННЫХ ******/

.section/dm data1;                                        

.var/circ  buf1[57];           //Буфер, для записи сигналов,примнимаемых от кодека

.var/circ  rx_buf[3];                                                                    //приемный буфер AD1847

.var/circ  tx_buf[3] = 0xc000, 0x0000, 0x0000;  //передающий буфер AD1847    

.var/circ  init_cmds[13]=                                                                                         //регистры управления AD1847:

0xc003,                                             //регистр управления левого входа 

0xc103,                                             //регистр управления правого входа

0xc288,                                             //регистр управления левого внешнего входа AUX1

0xc388,                                             //регистр управления правого внешнего входа AUX1

0xc488,                                             //регистр управления левого внешнего входа AUX2

0xc588,                                             //регистр управления правого внешнего входа AUX2

0xc680,                                             //регистр управления левого ЦАП

0xc780,                                             //регистр управления правого ЦАП

0xc856,                                             //регистр формата данных AD1847

0xc909,                                             //регистр конфигурации интерфейса

0xca00,                                             //регистр управления выводом AD1847

0xcc40,                                             //регистр различной информации AD1847                                                       

0xcd00;

.var stat_flag;                                   //флаг состояния (используется для разграничения

//режимов начальной инициализации и непосредственно

//выполнения программы)

.var fir_flag;                                     //флаг, используемый при работе таймера

/****** ОПИСАНИЕ ПЕРЕМЕННЫХ В ПАМЯТИ ПРОГРАММ ******/

.section/pm data2;

.var/circ coef[]="fir3.dat";                                          //НЧ-фильтр

.var/circ coef2[]="fir2.dat";                         //ВЧ-фильтр

/****** ОПИСАНИЕ ПРЕРЫВАНИЙ ******/

.section/pm IVreset;                                                     //Запуск программы после Reset

jump start; rti; rti; rti;

.section/pm IVirq2;                                                                     //IRQ2

rti; rti; rti; rti;

.section/pm IVirql1;                                                                    //IRQL1(по уровню)

rti; rti; rti; rti;

.section/pm IVirql0;                                                                    //IRQL0(по уровню)

rti; rti; rti; rti;

.section/pm IVsport0xmit;                                                                  //Передача SPORT0

ar=dm(stat_flag);

ar=pass ar;

if eq rti;

jump next_cmd;

.section/pm IVsport0recv;                                                                //Прием SPORT0

jump input_samples; rti; rti; rti;

// .section/pm IVirqe;                                                                                 //IRQE  (по фронту)

//            jump switch_fir; rti; rti; rti;

.section/pm IVirqe;                                                                                    //IRQE  (по фронту)

rti; rti; rti; rti;     

.section/pm IVbdma;                                                                              //Прерывания BDMA

rti; rti; rti; rti;

.section/pm IVirq1;                                                                                    //Передача SPORT1 / IRQ1

rti; rti; rti; rti;

.section/pm IVirq0;                                                                                    //Прием SPORT1 / IRQ0

rti; rti; rti; rti;

.section/pm IVtimer;                                                                   //Таймер

jump switch_fir; rti; rti; rti;          

.section/pm IVpwrdwn;                                                              //Понижение потребляемой мощности

rti; rti; rti; rti;

/****** ПРОГРАММА ******/

.section/pm program;                                                                 

start:

i0 = rx_buf;                                                                   //Принимающий буфер AD1847                 

l0 = length(rx_buf);                        

i1 = tx_buf;                                                                    //Передающий буфер AD1847  

l1 = length(tx_buf);

i3 = init_cmds;                                                              //Управляющие слова для AD1847

l3 = length(init_cmds);

m1 = 1;

i2 = buf1; l2 = length(buf1); m2=1;                          //Буфер принимаемых сигналов

i7 = coef; l7 = length(coef); m7=1;                           //Буфер коэффициентов фильтра

/*----------------------- ИНИЦИАЛИЗАЦИЯ ADSP 2181 -----------------------*/

// КОНФИГУРАЦИЯ ПОСЛЕДОВАТЕЛЬНОГО ПОРТА SPORT0:

ax0=B#0000001010000111;                                                   

dm(0x3ff3)=ax0;                                           //Регистр автобуферизации SPORT0

ax0=0;

dm(0x3ff4)=ax0;                            //Генерирование сигнала кадровой синхронизации RFS

//(RFSDIV не используется)       

dm(0x3ff5)=ax0;                                           //Определение частоты тактовой синхронизации SCLK

//(SCLKDIV не используется)    

ax0=B#1000011000001111;                                    

dm(0x3ff6)=ax0;                                           // Управляющий регистр SPORT0

ax0=0x0007;                                   // 0000 0000 0000 0111

dm(0x3ff7)=ax0;                                           //Разрешение многоканальной передачи              биты 15-0

dm(0x3ff8)=ax0;                                           //слова через SPORT0                                                               биты 31-16

dm(0x3ff9)=ax0;                                           //Разрешение многоканального приема                биты 15-0

dm(0x3ffa)=ax0;                                           //слова через SPORT0                                                               биты 31-16

// КОНФИГУРАЦИЯ ПОСЛЕДОВАТЕЛЬНОГО ПОРТА SPORT1:

ax0=0;

dm(0x3fef)=ax0;                                           //Регистр автобуферизации SPORT1

dm(0x3ff0)=ax0;                                           //Генерирование сигнала кадровой синхронизации RFS

dm(0x3ff1)=ax0;                                           //Определение частоты тактовой синхронизации SCLK

dm(0x3ff2)=ax0;                                           //Управляющий регистр SPORT1

// УСТАНОВКА ТАМЕРА:            

/*ax0=0;                                                          //Таймер не будет использоваться

dm(0x3ffd)=ax0;                                           //TPERIOD

dm(0x3ffc)=ax0;                                           //TCOUNT

dm(0x3ffb)=ax0;                                           //TSCALE

*/

// УСТАНОВКА СИСТЕМЫ И ПАМЯТИ:

ax0=0;

dm(0x3ffe)=ax0;                                           //Регистр DM_wait

ax0=0x1000;                                   //Доступен SPORT0

dm(0x3fff)=ax0;                                            //Регистр управления системой, с помощью которого

//осуществляется АКТИВИЗАЦИЯ последовательных портов                                                      

ifc=0x00ff;                                       //Очистка очереди прерываний - 0000 0011 1111 1111

nop;

icntl=0;                              //Вложенные прерывания запрещены

mstat=B#1000000;

/*------------------------ ИНИЦИАЛИЗАЦИЯ AD 1847 ------------------------*/

ax0=1;                                                            

dm(stat_flag)=ax0;                         //Очистка флага

imask=B#0001000001;                               

ax0=dm(i1,m1);                //Запись управляющего слова из буфера tx_buf

//(первого элемента из буфера tx_buf)

tx0=ax0;                                                          //Запись в регистр передачи данных TX0, при этом

//вызывается прерывание по передаче

//Если флаг=0, то-вылет; нет, то-переход на next_cmd

check_init:

ax0 = dm(stat_flag);        //Ожидание до целой выборки

af=pass ax0;            //Буфер переслать к кодеку вместе с next_cmd                       

if ne jump check_init;

ay0=2;                                                            

check_acih:                                                    //Автокалибровка для правого канала

ax0=dm(rx_buf);         //Ожидание инициализации пока кодек выйдет

ar=ax0 and ay0;         //из режима автокалибровки                  

if eq jump check_acih;

check_acil:                                                     //Автокалибровка для левого канала

ax0=dm(rx_buf);                                           //Ожидание инициализации пока кодек выйдет                             

ar=ax0  and ay0;                             //из режима автокалибровки                            

if ne jump check_acil;    

idle;

ay0 = 0xbf3f;                                                        

ax0=dm(init_cmds + 6); //Включение левого ЦАП 

ar  = ax0 and ay0;

dm(tx_buf) = ar;

idle;

ax0=dm(init_cmds + 7); //Включение правого ЦАП    

ar  = ax0 and ay0;

dm(tx_buf) = ar;

idle;

ax0=0xc901;                                    //Очистка требования автокалибровки

dm(tx_buf)=ax0;

idle;

ax1=0x8000;                                   //Управляющее слово очистки

dm(tx_buf)=ax1;

ifc=0x00ff;                                                     //Очистка очереди прерываний

nop;

//УСТАНОВКА ТАМЕРА: 

ax0=0xffff;                                                    

dm(0x3ffd)=ax0;                                           //TPERIOD

ax0=0xffff;        

dm(0x3ffc)=ax0;                                           //TCOUNT

ax0=0xff;

dm(0x3ffb)=ax0;                                           //TSCALE

ax0=0;

dm(fir_flag)=ax1;

ena timer;

imask=B#0000100001;                                              

talkthru: idle;                                   /* ОЖИДАНИЕ ПРЕРЫВАНИЯ */

jump talkthru;

/*---------------- ПОДПРОГРАММЫ ОБСЛУЖИВАНИЯ ПРЕРЫВАНИЙ ----------------*/

input_samples:                                //ПРЕРЫВАНИЕ ПО ПРИЕМУ SPORT0 - ОБРАБОТКА ДАННЫХ

//            СТЕРЕО РЕЖИМ С ФИЛЬТРАЦИЕЙ

ena sec_reg;                                     //Использование теневого банка регистров

dis m_mode;                                      

mx1 = dm(rx_buf+1);                    //Получение данных от кодека

ax1=mx1;                                                       

dm(i2,m2)=mx1;                                            //Запись принятых данных в принимающий буфер buf1

/*ПРОЦЕДУРА ФИЛЬТРАЦИИ*/

CNTR=length(coef)-1;

MR=0;

MX0=DM(I2,M2), MY0=PM(I7,M7);

DO convolution UNTIL CE;

convolution:

MR=MR+MX0*MY0(ss),MX0=DM(I2,M2), MY0=PM(I7,M7);

MR=MR+MX0*MY0(rnd);

IF MV SAT MR;

//Пересылка данных в кодек для вывода полученных сигналов

dm(tx_buf + 1) = mr1;     //Отфильтрованный сигнал (справа)

dm(tx_buf + 2) = ax1;   //Исходный сигнал (слева) 

rti;

next_cmd:                                                       //ПРЕРЫВАНИЕ ПО ПЕРЕДАЧЕ ДЛЯ ИНИЦИАЛИЗАЦИИ КОДЕКА

ena sec_reg;

ax0=dm(i3, m1);                             //Получение следующего управляющего слова

dm(tx_buf)=ax0;                             //и  размещение в передающий слот

ax0=i3;

ay0 =init_cmds;

ar=ax0 - ay0;

if gt rti;                                              //Выход в chec_init

ax0=0x8000;

dm(tx_buf)=ax0;                             //Запрет модификации режима кодека

ax0=0x0;

dm(stat_flag)=ax0;                         //Переустановить флаг состояния

rti;

switch_fir:                                                       //ПРЕРЫВАНИЕ ОТ ТАЙМЕРА (по нажатию кнопки INTERRUPT)

ar=dm(fir_flag);

ar=pass ar;

if eq jump chan;

i7=coef;                                                           //НЧ-фильтр

ax1=0;

dm(fir_flag)=ax1;                           //флаг fir_flag=0

rti;

chan:

i7=coef2;                                                         //ВЧ-фильтр

ax1=1;

dm(fir_flag)=ax1;                           //флаг fir_flag=1

rti;

Выводы:

В данной работе производилась фильтрация аудиосигнала и вывод результатов на осциллограф.

В первом случае исследовалась фильтрация сигнала НЧ и ВЧ фильтрами, выбор которых осуществлялся при нажатии кнопки INTERRUPT (прерывание IRQE). При использовании ВЧ фильтрации сигнал на выходе представляет собой высокочастотное колебание с примерно постоянной амплитудой

Похожие материалы

Информация о работе