Добавил:
Да поможет вам Котельников Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

МП

.pdf
Скачиваний:
9
Добавлен:
23.06.2024
Размер:
1.33 Mб
Скачать

организуем переменные ar_kn1 ar_kn2.

Полный текст программы на языке ассемблера с необходимыми комментариями предоставлен на рис.22, а ее исполнение иллюстрируется рис. 23 на фоне адресного пространства памяти программ.

//объявление значения времени задержки на 1.5 мс

//в единицах количества проходов тела цикла

//из четырех команд, каждая из которых выполняется за 25 нс

#define delay_time 1500000/25/4;

//объявление переменных

.SECTION/DM vars;

.var kn1_cnt = delay_time;

.var kn2_cnt = delay_time;

.var ar_kn1;

.var ar_kn2;

// программа

.SECTION/PM program; //----------------------------------------------

//с нулевого адреса начинается

//заполнение таблицы векторов прерываний

//----------------------------------------------

//RESET

jump start; rti; rti; rti; //IRQ2

jump kn1_react; rti; rti; rti; //IRQL1

rti; rti; rti; rti; //IRQL0

rti; rti; rti; rti; //SPORT0 ПД

rti; rti; rti; rti; //SPORT0 ПМ

rti; rti; rti; rti; //IRQE

jump kn1_react; rti; rti; rti; //BDMA

rti; rti; rti; rti; //SPORT1 ПД

rti; rti; rti; rti; //SPORT1 ПМ

rti; rti; rti; rti;

Рис.22 начало

61

//Timer

rti; rti; rti; rti; //Power Down

rti; rti; rti; rti; //----------------------------------------------

// конец таблицы векторов прерываний

//----------------------------------------------

//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$

//начало основной программы

//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$

//программирование прерываний

start:

icntl = B#010111;

 

 

 

//

| ||+----

IRQ0 -

краевое

 

//

| |+-----

IRQ1 -

краевое

//| +------ IRQ2 - краевое

//+-------- вложение прерываний разрешено

//сброс прерываний, стоящих в очереди ifc = 0x00ff;

//холостая операция nop;

//маскирование прерываний imask = B#01000010000;

//

|

+------

IRQE

разрешено

//

+

-----------

IRQ2

разрешено

//холостая операция nop;

//зацикливание основной программы

zacycl: jump zacycl; //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$

// конец основной программы

//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$

 

//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

 

// подпрограмма реакции на замыкание KN1

 

//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

//

сохранение значений используемых регистров

kn1_react:

dm(ar_kn1) = ar;

 

Рис.22 продолжение

 

62

//

организация задержки

vic1:

ar = dm(kn1_cnt);

 

ar = ar - 1;

 

dm(kn1_cnt) = ar;

 

if gt jump vic1;

 

// время задержки кончилось,

 

// восстановить значение счетчика

 

ar = delay_time;

 

dm(kn1_cnt) = ar;

//*****************************************

//здесь должна быть размещена

//программа реакции на нажатие

//кнопки KN1

//******************************************

//

восстановление значений используемых регистров

 

ar = dm(ar_kn1);

 

//

сброс запроса IRQ2,

 

//

возможно, возникшего в

 

//

процессе выполнения подпрограммы

 

ifc = B#0000000010000000;

 

 

//

+----------

IRQ2

//

возврат из подпрограммы

 

 

rti;

 

 

 

//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

// конец подпрограммы

// реакции на замыкание KN1

//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

//\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

// подпрограмма реакции на замыкание KN2

//\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ kn2_react: dm(ar_kn2) = ar;

vic2: ar = dm(kn2_cnt); ar = ar - 1; dm(kn2_cnt) = ar;

if gt jump vic2; ar = delay_time; dm(kn2_cnt) = ar;

//*****************************************

//здесь должна быть размещена

//программа реакции на нажатие

//кнопки KN2 //******************************************

Рис. 22 продолжение

63

ar = dm(ar_kn2);

//сброс запроса IRQE,

//возможно, возникшего в

//процессе выполнения подпрограммы ifc = B#0000000000010000;

//+------- IRQE

rti;

//\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

//конец подпрограммы

//реакции на замыкание KN2

//\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\}

Рис. 22 окончание

Начало работы процессора осуществляется с нулевого адреса, по которому записана команда безусловного перехода к основной программе jump start.

В основной программе выполняется инициализация основных используемых регистров, включая программирование прерываний. По выполнении инициализации основная программа зацикливается и процессором никаких действий не выполняется. В тексте используется простое зацикливание, другие его виды будут рассмотрены далее.

При замыкании контакта KN2 процессор принимает запрос на прерывание IRQE (см. рис.20). Поскольку этот вид прерываний разрешен,

процессор переходит к его обслуживанию, т.е. запоминает в стеке адрес возврата и переходит к выполнению команды, записанной по адресу 0х18

вектора прерывания IRQE (см. таблицу 1).

В этой ячейке записана команда безусловного перехода к прерывающей подпрограмме, ассоциированной с прерыванием IRQE и

реализующей функции противодребезга и реакции на нажатие кнопки kn2 в

соответствии с рис. 21. По выполнении этой подпрограммы по команде rti в

счетчик команд загружается адрес возврата, вынуждая процессор вернуться к выполнению основной программы (на зацикленный участок).

64

Рис. 23

Реакция процессора на замыкание контакта KN1 аналогична. Если запрос на прерывание со стороны KN1 возникает в процессе выполнения

подпрограммы реакции на KN2, то выполнение подпрограммы обслуживания

65

KN2 будет прервано подпрограммой обслуживания KN1 и продолжено после выполнения последней, имеющей более высокий приоритет (см. таблицу 1).

Прерывание подпрограммы более низкого приоритета имеющей более высокий приоритет возможно, поскольку вложение прерываний в программе разрешено (единичным значением бита 4 в регистре ICNTL). В противном случае ее выполнение было бы отложено до завершения выполнения подпрограммы более низкого уровня приоритета.

12.Таймер и организация таймерных программ.

В технике связи и защиты информации весьма часто встречается задача разработки устройств, реализующих функции сложных ветвящихся программ, выполнение которых должно быть обеспечено в строго периодическом режиме независимо от «протяженности» текущей ветви исполнения.

Так, например, системы обработки (в том числе криптозащиты)

речевого сигнала должны быть привязаны к частоте дискретизации, которая,

как известно, для телефонной передачи составляет 8 кГц.

Для поддержки периодического (с заданным значением периода)

выполнения программ процессоры семейства ADSP-21XX оснащены таймером, функциональная схема которого представлена на рис. 24.

Таймер фактически представляет собой делитель тактовой частоты процессора с управляемым коэффициентом деления.

Главным отличием таймера процессоров семейства ADSP 21ХХ от процессоров других производителей является построение предделителя и счетчика TCOUNT на основе декрементирующих счетчиков (из содержимого которых вычитается единица за каждый период входного сигнала). Как только содержимое счетчиков доходит до вычитания единицы из нуля, они перезагружаются из соответствующих регистров (предделитель из регистра

TSCALE, а счетчик TCOUNT – из регистра TPERIOD) и формируют

66

выходной сигнал. Выходной сигнал предделителя используется для вычитания очередной единицы из регистра TCOUNT, а выходной сигнал регистра TCOUNT – для установки флага запроса таймерного прерывания по адресу 0х28 (см. таблицу 1).

Рис. 24

Программирование таймера заключается (помимо программирования таймерного прерывания аналогично внешним) в записи значений TPERIOD, TCOUNT и TSCALE в соответствующие регистры и его запуске. При этом будет обеспечено значение периода таймерных прерываний

Тпр = (TPERIOD + 1) * (TSCALE + 1) ,

а первое прерывание наступит через время t = (TCOUNT + 1) * (TSCALE + 1)

после запуска таймера.

Особенностью реализации и программирования таймера заключается в том, что TCOUNT, TSCALE и TPERIOD не являются именами регистров.

Счетчики и регистры таймера построены на основе ячеек памяти данных с адресами, указанными на рис. 24. Запись в эти регистры осуществляется по правилам записи в ячейки памяти данных – через любые регистры группы

reg.

67

В качестве примера далее рассматривается построение таймерной подпрограммы с периодом выполнения 125 мкс (соответствующим частоте

дискретизации 8 кГц).

Для того, чтобы период формирования запросов на таймерное

обслуживание был равен Тпр

, следует вычислить соответствующее этому

периоду количество машинных циклов

N ц = Тпр / Tц

,

где Tц = 25 нс – период машинного цикла,

и выразить значение N ц как произведение двух чисел, одно из которых не более 255, а второе – не более 65635.

Если Тпр = 125 10 –6 с, то

N = 125 10-6 / 25 10-9 = 5 103 ,

Тогда

TSCALE = 5 – 1 = 4, а

TPERIOD = TCOUNT = 1000 – 1 = 999.

Текст программы с необходимыми комментариями приведен на рис.25.

//----------------------------------------------

//с нулевого адреса начинается

//заполнение таблицы векторов прерываний

//----------------------------------------------

.SECTION/PM program;

 

 

jump start; rti; rti; rti; //

RESET

rti; rti; rti; rti; //

IRQ2

 

rti; rti; rti; rti; //

IRQL1

 

rti; rti; rti; rti; //

IRQL0

 

rti; rti; rti; rti; //

SPORT0 ПД

 

rti; rti; rti; rti; //

SPORT0 ПМ

 

rti; rti; rti; rti; //

IRQE

 

rti; rti; rti; rti; //

BDMA

 

rti; rti; rti; rti; //

SPORT1 ПД

 

Рис. 25 начало

68

rti; rti; rti; rti; //

SPORT1 ПМ

 

jump timer_proc; rti; rti; rti;

// Timer

rti; rti; rti; rti; //

Power Down

//

----------------------------------------------

 

 

// конец таблицы векторов прерываний

//----------------------------------------------

 

 

 

 

// $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $

 

// начало основной программы

 

 

// $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $

start:

ar = 4;

 

 

//программирование таймера и прерываний

//предделитель dm(0x3ffb) = ar;

//счетчик периода ar = 999; dm(0x3ffc) = ar; dm(0x3ffd) = ar;

//сброс прерываний, стоящих в очереди ifc = 0x00ff;

//холостая операция nop;

//запуск таймера ena timer;

//маскирование прерываний imask = B#00000000001;

//+------ таймерное прерывание

//

разрешено

//холостая операция nop;

//зацикливание основной программы

zacycl:

jump zacycl;

//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$

//

 

//

конец основной программы

//

 

//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$}

Рис. 25 продолжение

69

//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

// таймерная подпрограмма

//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> timer_proc: //сохранение значений используемых регистров

//*****************************************

//здесь должна быть размещена

//программа, исполняемая периодически

//1 раз в 125 мкс

//******************************************

//восстановление значений используемых регистров

//

возврат из подпрограммы

 

rti;

 

//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

 

// конец таймерной подпрограммы

 

//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

 

Рис.25 окончание

13.Последовательные порты и стыковка процессора с потоком Е1.

Как было отмечено ранее, в состав архитектуры процессора ADSP 2181

входит два последовательных порта SPORT0 и SPORT1, предназначенных для обмена информацией с внешними устройствами в последовательном режиме. Последовательный обмен предполагает вывод информации по одному проводу и одновременно ввод по другому проводу последовательно бит за битом на заранее запрограммированной скорости или под воздействием сигнала внешнего генератора.

Передача/прием информации последовательными портами процессора

ADSP-2181 осуществляется начиная со старшего разряда (в отличие от последовательных портов микроконтроллеров, ориентированных на обеспечение обмена информацией с компьютерами).

Функциональная схема (архитектура) последовательных портов

SPORT0 и SPORT1 представлена на рис. 26.

70

Соседние файлы в предмете Микропроцессорная техника в инфокоммуникациях