-формирование последовательным портом 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; /* выход из подпрограммы обработки прерывания */