7.10. Как обеспечить генерацию в ЦСП колебания с частотой 8 кГц? Укажите конкретные параметры программы.
7.11. Какие числа и для чего содержатся в файле sine.dat? Как обеспечить формирование программным путем этих 16-и чисел, чтобы обойтись без файла?
7.12. Особенности использования в программе кольцевых буферов.
Программа к ЛР № 6
/* ADSP-2181 Sine wave generator файл Gener.asm
Эта программа вырабатывает отсчёты синусоидального колебания для 16-и значений аргумента x, заданных в файле SINE.DAT.
Регистры таймера использованы, чтобы получить требуемую частоту.
Выход может быть показан на осциллографе через порт DAC0.
Используется файл описания архитектуры ЦСП ADSP-2181.ldf.
*/
#define samples 32 // Размер массива выходных данных
#define dac0 0x1000 // Порт ЦАП с адресом 0x1000
.section/data data1;
.VAR/CIRC sine_data[16]="sine.dat" ; // Описание массива sine_data
.VAR/CIRC dm_y[samples]; // Описание массива вых. данных
.EXTERN sin; // Внешняя подпрограмма с меткой sin
.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 serv; NOP; NOP; NOP; // Прерывание от таймера
RTI; NOP; NOP; NOP;
.section/pm program;
start: I0 = 0x3FEF;
M0 = 1;
L0 = 0;
CNTR = 17; // Очистка всех регистров управления
DO clr_reg UNTIL CE; // c адресами 0х3FEF...0x3FFF
clr_reg: DM(I0,M0) = 0;
AX0 = 260;
DM(0x3FFD) = AX0; // Установить в TPERIOD 260
DM(0x3FFC)=AX0; // Установить в TCOUNT 260
I0 = sine_data; // начальный адрес кольцевого буфера
L0 = LENGTH(sine_data); // Длина кольцевого буфера
M0 = 1; // Пост-модификация на 1
I2 = dm_y; // начальный адрес массива вых. данных
L2 = LENGTH(dm_y); // Длина кольцевого буфера
M2 = 1; // Пост-модификация на 1
IMASK = 0x01; // Разрешение прерывания от таймера
ICNTL = 0x07; // Прерывания без вложения, с реакцией на перепад
ENA TIMER; // Таймер разрешён (включен)
wait: IDLE; // Ожидание до следующего прерывания
JUMP wait; // Переход к ожиданию (после возврата)
serv: // Процедура обслуживания прерывания
AX0 = DM(I0,M0); // Ввод значения sine_data из буфера
CALL sin; // Вычисление значения синусоиды
DM(dac0) = AR; // Вывод на ЦАП
DM(I2,M2) = AR; // Запись отсчёта в массив dm_y
RTI; // Возврат из прерывания
// Конец модуляGener.asm
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.