Работа с таймером и обработка прерываний. Регистры и инструкции управления таймером и прерываниями, страница 4

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