Федеральное агентство по образованию
РГРТУ
Кафедра ТОР
Лабораторная работа №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).
ВЧ-фильтр(fir 2).
Текст программы на языке Ассемблер.
/****** ОПИСАНИЕ ПЕРЕМЕННЫХ В ПАМЯТИ ДАННЫХ ******/
.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). При использовании ВЧ фильтрации сигнал на выходе представляет собой высокочастотное колебание с примерно постоянной амплитудой
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.