- хранимые постоянно – понадобится выделить отдельный регистр для каждой такой переменной;
- хранимые кратковременно – несколько таких переменных можно сохранять в одном регистре по очереди, не допуская перекрытия отрезков времени хранения.
Список переменных
Диаграммы распределения регистров и ячеек памяти
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
|
IO(PORT1) |
||||||||
MX0 |
|
|||||||
MY0 |
||||||||
MR |
||||||||
DM(sin) |
||||||||
MX1 |
||||||||
MY1 |
||||||||
MR |
||||||||
DM(COS) |
3.8 Расчет параметров таймера
Для обработки отсчетов в нужный момент времени в программе на языке ассемблера необходимо использовать цикл ожидания. Для этого следует задействовать таймер, установив нужные параметры в его регистры.
Таймер процессора ADSP-2189M содержит два 16-битных регистра TCOUNT и TPERIOD и один 8-битный регистр TSCALE. Эти регистры отвечают за работу таймера и отображены на область памяти: TPERIOD по адресу 0х3FFD, TCOUNT по адресу 0х3FFC, TSCALE по адресу 0х3FFB.
TSCALE – регистр масштаба (в работе TSCALE=0).
TCOUNT – регистр счета (до включения таймера он должен быть равен TPERIOD)
TPERIOD - регистр периода, который хранит период формирования прерываний.
Рассчитаем параметры таймера исходя из параметров канала:
Скорость передачи V – 200 Бод
Частота поднесущей Fнес - 3.2 кГц
Частота дискретизации Fдискр - 25.6 кГц
Число периодов колебания сигнала с несущей частотой 3.2 кГц на одно сообщение находится так:
Число отсчетов сигнала на одном периоде колебания равно:
Таким образом, количество отсчетов, необходимое для передачи одного сообщения, равно:
128 – идеальный вариант, когда рассогласование отсутствует.
Рассчитаем значения регистров TPERIOD и TSCALE исходя из условия, что прерывания таймера должны происходить с частотой дискретизации 25.6 кГц.
Приняв TSCALE=0, а частоту кварцевого резонатора 12,5 МГц, получим:
Таким образом, TPERIOD =487.
3.9 Текст программы Main
#define PORT1 0x200
#define PORT2 0x200
#define m 512
#define samples 4
#define sin 0x0357
#define cos 0x0358
.section/pm pm_da;
.VAR/CIRC sinus[256]="sin256.dat";
.EXTERN korr;
.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 korr; NOP; NOP; NOP; // прерывание от таймера
RTI; NOP; NOP; NOP;
.section/pm program;
start: AX0=487; // Установка таймера с частотой 25,6 кГц
DM(0x3FFC)=AX0; // установить TCOUNT=487
DM(0x3FFD)=AX0; // установить TPERIOD=487
AX0=0;
DM(0x3FFB)=AX0;
I5=sinus; // начальный адрес массива sin_mas
L5=LENGTH(sinus); // длина кольцевого буфера
M5=64; // шаг Pi/2
M7=32; // шаг Pi/4
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.