Сигнальные процессоры. Аксенов В.П. - 67 стр.

UptoLike

Составители: 

67
-формирование последовательным портом SPORT0 сигнала прерывания
после приема двух слов от кодека;
-передача контроллером прерывания вектора прерывания 0х0014;
Листинг 5. Инициализация порта SPORT0 и обработка прерываний
. section /pm pm_code;
main:
l0 = length (data_buffer); /* устанавливаем длину циклических */
l4 = length (coefficient) /* буферов отсчетов кодека и коэффициентов */
m0 = 1; /* шаг изменения индекса l0 в буфере data_buffer */
m4 = 1; /* шаг изменения индекса l4 в буфере coefficient */
i0 = data_buffer; /* указатель начала буфера отсчетов */
i4 = coefficient; /* указатель начала буфера коэффициентов */
ax0 = 0;
cntr = length (data_buffer); /* устанавливаем счетчик циклов cntr */
do clear until ce;
clear: dm(i0,m0) ax0; /* обнуляем буфер отсчетов */
ax0 = 0x2A0F;
dm(SPORT0_Control_Reg) = ax0; /* программируем порт SPORT0: */
/* длина слова 16 бит, компрессия не используется, активные уровни сигналов
RFS, TFS- высокие, RFS вход, TFS выход, обычная синхронизация каждого
слова приемника и передатчика, внешняя битовая синхронизация SCLK, мно-
гоканальный режим не используется */
ax0 = 0x1000;
dm(System_Control_Reg) = ax0; /* разрешаем работу порта SPORT0 */
icntl = 0x00; /* вложенные прерывания запрещены */
imask = 0x0060; /* разрешаем прерывания только от приемника и передатчика
порта SPORT0 */
mainloop:
idle; /* переход в режим пониженного энергопотребления */
jump mainloop; /* ожидание в цикле
поступления сигнала прерывания
от порта SPORT0 */
. section /pm seg_code;
fir_start: /* начало подпрограммы обработки прерывания SPORT0 */
si = rx0; /* читаем регистр приемника порта rx0 */
dm(i0,m0) = si; /* передаем новый отсчет в буфер data_buffer */
mr = 0; my0 = pm(i4,m4); mx0 = dm (i0,m0); /* переписываем коэффициент и
отсчет соответственно в регистры my0,mx0 умножителя-накопителя МАС */
cntr = taps_less_one; /* устанавливаем счетчик циклов cntr */
do convolution until ce;
convolution:
mr = mr + mx0 * my0(ss), my0 = pm(i4,m4), dm (i0,m0); /* умножение
с накоплением N-1 раз в блоке МАС */
mr = mr + mx0 * my0(rnd); /* N-ый проход цикла с округлением результата */
if mv sat mr; /* проверка переполнения результата */
tx0 = mrl; /* записываем выходной сигнал фильтра в передатчик tx SPORT0 */
rti; /* выход из подпрограммы обработки прерывания */
     Листинг 5.            Инициализация порта SPORT0 и обработка прерываний

     . section  /pm pm_code;
     main:
     l0 = length (data_buffer);     /* устанавливаем длину циклических             */
     l4 = length (coefficient)      /* буферов отсчетов кодека и коэффициентов */
     m0 = 1;                    /* шаг изменения индекса l0 в буфере data_buffer */
     m4 = 1;                     /* шаг изменения индекса l4 в буфере coefficient */
     i0 = data_buffer;                          /* указатель начала буфера отсчетов */
     i4 = coefficient;                  /* указатель начала буфера коэффициентов */
     ax0 = 0;
     cntr = length (data_buffer);             /* устанавливаем счетчик циклов cntr */
     do clear until ce;
     clear: dm(i0,m0) ax0;                             /* обнуляем буфер отсчетов */
     ax0 = 0x2A0F;
     dm(SPORT0_Control_Reg) = ax0;                 /* программируем порт SPORT0: */
     /* длина слова 16 бит, компрессия не используется, активные уровни сигналов
     RFS, TFS- высокие, RFS – вход, TFS – выход, обычная синхронизация каждого
     слова приемника и передатчика, внешняя битовая синхронизация SCLK, мно-
     гоканальный режим не используется */
     ax0 = 0x1000;
     dm(System_Control_Reg) = ax0;                /* разрешаем работу порта SPORT0 */
     icntl = 0x00;                              /* вложенные прерывания запрещены */
     imask = 0x0060; /* разрешаем прерывания только от приемника и передатчика
                                                                       порта SPORT0 */
     mainloop:
     idle;                     /* переход в режим пониженного энергопотребления */
     jump mainloop;           /* ожидание в цикле поступления сигнала прерывания
     от порта SPORT0 */
     . section /pm seg_code;
     fir_start:          /* начало подпрограммы обработки прерывания SPORT0 */
     si = rx0;                                /* читаем регистр приемника порта rx0 */
     dm(i0,m0) = si;                   /* передаем новый отсчет в буфер data_buffer */
     mr = 0; my0 = pm(i4,m4); mx0 = dm (i0,m0); /* переписываем коэффициент и
     отсчет соответственно в регистры my0,mx0 умножителя-накопителя МАС */
     cntr = taps_less_one;                     /* устанавливаем счетчик циклов cntr */
     do convolution until ce;
     convolution:
     mr = mr + mx0 * my0(ss), my0 = pm(i4,m4), dm (i0,m0);               /* умножение
                                                с накоплением N-1 раз в блоке МАС */
     mr = mr + mx0 * my0(rnd); /* N-ый проход цикла с округлением результата */
     if mv sat mr;                              /* проверка переполнения результата */
     tx0 = mrl; /* записываем выходной сигнал фильтра в передатчик tx SPORT0 */
     rti;                        /* выход из подпрограммы обработки прерывания */

     -формирование последовательным портом SPORT0 сигнала прерывания
после приема двух слов от кодека;
     -передача контроллером прерывания вектора прерывания 0х0014;



                                            67