В предыдущей работе мы формировали одно значение синуса, используя подпрограмму sine. Для того, чтобы получать дискретный синусоидальный сигнал, необходимо вычислять несколько значений синуса на интервале периода 0...2p. Согласно теореме Котельникова число отсчётов, приходящихся на период, должно быть не менее двух, а практически не менее четырёх. Эти отсчёты должны следовать периодически через равные интервалы времени.
Временной интервал между двумя соседними отсчетами и количество отсчётов, приходящихся на период, определяют частоту вырабатываемого сигнала. Периодическое формирование временных интервалов выполняется при помощи таймера процессора. Детально рассмотрим таймер для того, чтобы понимать его работу.
Таймер процессора ADSP-2101 содержит два 16-битных регистра TCOUNT и TPERIOD и один 8-битный регистр TSCALE. Эти регистры отображены на область памяти: TPERIOD по адресу 0х3FFD, TCOUNT по адресу 0х3FFC, TSCALE по адресу 0х3FFB.
Имеются инструкции управления режимом таймера ENA|DIS TIMER, которые разрешают (включают) или запрещают (останавливают) таймер путем установки или сброса разряда 5 в регистре режима MSTAT. Перед использованием таймера в регистры таймера записываются исходные данные и выполняется инструкция разрешения таймера.
TPERIOD - регистр периода, который хранит период формирования прерываний, выраженный через период входных сигналов счётчика, построенного на регистре TCOUNT. Когда таймер разрешен, регистр TCOUNT декрементируется после каждых TSCALE+1 процессорных циклов. Когда счетчик достигает нуля, формируется прерывание. В этот момент TCOUNT перезагружается из регистра TPERIOD и счет начинается снова. TSCALE хранит масштабное значение, которое выражает количество циклов между двумя декрементами регистра TCOUNT. Например, если значение в регистре TSCALE равно 0, счетчик декрементируется в каждом цикле. Если значение в регистре TSCALE равно 1, счетчик декрементируется каждые два цикла. И так далее.
Прерывание происходит каждые (TPERIOD+1)*(TSCALE+1) циклов процессора. Для первого прерывания формула такова: (TCOUNT+1)*(TSCALE+1).
Используя эти три регистра можно сформировать прерывания с периодом практически любой длины: от нескольких циклов прцессора (когда значение в регистре TPERIOD единицы, а значение в регистре TSCALE=0) до 1.34 сек. (когда оба регистра TPERIOD и TSCALE содержат максимальные значения) при цикле процессора 80 нс.
Генерируемая частота равна
f = 1/ (период прерывания * число отсчётов на периоде).
ЭКСПЕРИМЕНТ
В эксперименте мы будем формировать синусоидальный сигнал с частотой 3 кГц и 16 отсчётами на период.
1. Программа GENERATOR.ASM, использующая подпрограмму SINE.ASM, имеет следующие особенности:
* Выходные отсчеты подаются в порт DAC0
* Сохранение 16 значений углов в памяти данных в виде кольцевого буфера и инициализация их из файла на диске
* Установка регистров таймера для вычисления 16 отсчетов на период при частоте 3 кгц.
* Разрешение прерывания от таймера посредством установки в «1» разряда 0 в регистре IMASK.
* Разрешение (т. е. включение) таймера установкой в «1» разряда 5 в регистре режима MSTAT
2. При обследовании программы с прерываниями на имитаторе в пошаговом режиме следует использовать IREQ - регистр запросов прерывания. Это не регистр процессора, он показывает, какие прерывания ожидаются, и обеспечивает удобства, позволяя досрочно вызвать возникновение прерывания. Разряды IREQ соответствуют разрядам IMASK. Обратите внимание на последовательность выполнения инструкций программы в связи с возникновением и обработкой прерываний.
3. Чтобы наблюдать последовательность отсчётов синусоиды, следует воспользоваться приёмами, описанными в ЛР3 и ЛР4 (выбрать место и установить контрольную точку, подключить файл к порту вывода или, лучше, организовать формирование в памяти массива выходных данных).
4. Используя программу GENERATOR.ASM, сформируйте синусоидальный сигнал и проверьте, что частота сигнала соответствует требуемой.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.