
- •Введение в дсп.
- •Работа номер 1
- •9.Сдача работы:
- •If cond jump label;// условный переход
- •2.Показать как минимум две программы с разным темпом мигания от
- •Задание 2.5 - работа с таймером
- •Сдача задания 2.5: Задание – задать заметную на глаз частоту прерываний таймера
- •Задание 2.6 Использование таймера и прерывания от кнопки
- •Сдача задания 2.6: Задание – при нажатии на кнопку светодиод должен прекращать мигать, при повторном нажатии опять начинать мигать.
- •Сдача задания 3.1:
- •Сдача заданий 3.1.2 и 3.1.3:
- •If ne jump firstdac; // переход к пустому ацп Сдача задания 3.1.4:
- •Сдача задания 3.1.5:
- •1.Oб`ясните, почему нельзя использовать обычное сложение.
- •2.Почему инициализация регистров делается после вызова CodecInit ?
- •3.Почему запрещаются прерывания перед инициализацией регистров
- •If eq jump nofiltr; // если 0, не делаем фильтрацию
2.Показать как минимум две программы с разным темпом мигания от
примерно 0.1 до 10 герц.
Задание 2.2 - Mигание светодиодом от кнопки.
При нажатии на кнопку "Interrupt" на плате EZ-KIT, генерируется прерывание по адресу 0x18 (IRQE). Таблица прерываний имеет по 4 слова (команды) для каждого прерывания, то есть прямо в таблице можно написать маленький обработчик прерываний. Напишите такой обработчик, используя команду переключения состояния светодиода. Для разрешения/запрета прерываний используется регистр IMASK.
Команды запрета/разрешения прерываний:
DIS INTS; // глобальный запрет прерываний
ENA INTS; // глобальное разрешение прерываний
Две эти команды запрещают/разрешают все прерывания. Для работы с регистром IMASK прерывания надо запрещать.
Регистр разрешения прерываний IMASK:
bit 0 - timer interrupt
bit 1 - SPORT1 receiver or IRQ0
bit 2 - SPORT1 transmitter or IRQ1
bit 3 - BDMA
bit 4 - IRQE
bit 5 - SPORT0 receiver
bit 6 - SPORT0 transmitterbit 7 - IRQL0
bit 8 - IRQL1
bit 9 - IRQ2
В основной программе должно быть следующее:
1.Глобальный запрет прерываний
2.Разрешение прерываний от TIMER и IRQE
IMASK=0x00nn;
Таймер необходим для работы программы-монитора.
3.Глобальное разрешение прерываний
4.Бесконечный цикл. В принципе основная программа может делать все
что угодно, но если она дойдет до конца, программа будет остановлена
монитором.
Программа должна зажигать/гасить светодиод при нажатии кнопки
Interrupt.
Сдача задания 2.2:
Напишите программу и покажите.
Вопрос - зачем нужен бесконечный цикл в основной программе?
Задание 2.3
Стандартным способом обработки прерываний является вызов обработчика прерываний из таблицы прерываний при помощи инструкции CALL или JUMP.
Сдача задания 2.3:
Напишите программы с использованием той и другой инструкции.
Вопрос: как будет выглядеть таблица прерываний и процедура
обработки в том и другом случае и почему?
Задание 2.4
Оператор IDLE позволяет организовать цикл ожидания прерывания в теле основной программы. При выполнении инструкции IDLE процессор ждет любого разрешенного прерывания. Когда происходит прерывание, программа продолжается со следующего после IDLE оператора.
Команда IDLE может иметь числовой параметр IDLE xx, который определяет степень снижения токопотребления в цикле ожидания.
Цикл ожидания прерываний может выглядеть так:
L0: IDLE;JUMP L0;
В таблице прерываний на IRQE должно стоять просто RTI;
Прерывания от таймера надо запретить. После запуска программы с
запретом таймера VisualDSP необходимо закрыть и открыть снова.
Сдача задания 2.4:
Напишите программу управления светодиодом от кнопки с
использованием IDLE.
Вопрос: почему надо запретить прерывания от таймера и что будет,
если этого не сделать ?
Задание 2.5 - работа с таймером
Процессор 2109 имеет внутренний таймер.
Строка 11 таблицы векторов для работы с таймером в EZ-KIT должна
иметь вид:
call UserTimer; NOP; NOP; RTI;
Таймер используется мониторной программой платы EZ-KIT.
Если вы хотите использовать таймер и монитор, вы должны использовать
CALL, а не JUMP и не менять регистры таймера. Если монитор вам не
нужен, нужно только не использовать второе и третье слово в строке
прерывания таймера (эти слова меняются при загрузке на адреса
монитора).
Таймер имеет три регистра:
0x3FFC TCOUNT Counter Register
0x3FFD TPERIOD Period Register
0x3FFB TSCALE Scaling Register
Адреса регистров заданы в файле constant.h.
Вы можете и сами их задать директивой #define:
#define TSCALE 0x3ffb
TCOUNT регистр декрементируется в зависимости от TSCALE каждые n
циклoв, при занулении TCOUNT происходит прерывание и регистр
TPERIOD загружается в Tcount.
TSCALE регистр задает величину n:
TSCALE+1 = n, декремент ТCOUNT каждые n циклов.
Занесение значений в регистры таймера:
AR=0xf;
PM(TCOUNT)=AR;
В программе должно быть следующее:
1.Таблица прерываний с вызовом процедуры обработки прерываний
таймера.
2.Задание регистров таймера, частота прерываний порядка 0.1 - 10 герц.
При задании регистров прерывания надо запретить.
3. Бесконечный цикл.
4. Процедура обработки прерываний таймера - мигание светодиодом.
Oдин цикл процессора - 13.3 нсек.
Так как прерывания от таймера использованы в программе и регистры таймера изменены, нормальная работа монитора невозможна. После запуска программы VisualDSP необходимо закрыть и открыть снова.