Методические указания к практическим работам по ВТиИТ
.pdf2 Подробное описание регистров для настройки порта и регистра тактирования периферии.
3 Отчет должен содержать результаты выполнения практической работы.
4 Все рисунки должны иметь пояснительные надписи.
5 Вывод.
5 Контрольные вопросы по работе
1Структура регистров настройки порта
2Структура регистров тактирования периферии
3Синтаксис логических операторов языка C++
4Настройка проекта для программирования и отладки.
18
Лабораторная работа № 2 Использование прерываний
Лабораторный практикум знакомит слушателей с 32 разрядным микроконтроллером 1901ВЦ1Т на примере работы с прерываниями.
1Цель работы Изучить работу 32-разрядного микроконтроллера 1901ВЦ1Т, формирование задержки при помощи цикла и системного таймера SysTick через прерывание.
2Средства используемые при выполнении практической работы
Практическая работа выполняется на персональном
компьютере с установленной программой Keil.
3 Порядок выполнения практической работы
3.1 Общие сведения о работе с программой RPS2 Создадим проект Lab_2 и настроим его аналогично
предыдущему проекту из 1 лабораторной работы. Модифицируем программу из первой лабораторной работы
добавив в нее бесконечный цикл, при этом основная программа приобретает следующий вид:
int main (void)
{
Init_PORTB(); |
//Инициализация порта |
while (1) |
|
{ |
|
//Включаем светодиод
PORTB-> RXTX = (1<<15) | (PORTB->RXTX & (~JTAG_PINS(PORTB)));
//Выключаем светодиод
PORTB-> RXTX &= ~((1<<15) | JTAG_PINS(PORTB));
}
}
При попытке загрузки программы в микроконтроллер наблюдаем свечение светодиода, подключенного к выводу PB15
19
в половину мощности. Модернизируем программу таким образом, чтобы светодиод мигал с частотой, заметной человеческому глазу. Для этого введем между операциями включения и выключения светодиода задержку, используя цикл for, при этом основная программа примет следующий вид:
int main (void) |
|
{ |
|
Init_PORTB(); |
//Инициализация порта |
while (1) |
|
{ |
|
//Включаем светодиод
PORTB-> RXTX = (1<<15) | (PORTB->RXTX & (~JTAG_PINS(PORTB)));
for (uint32_t Loop;Loop<0x1FFFF;Loop++); //Выключаем светодиод
PORTB-> RXTX &= ~((1<<15) | JTAG_PINS(PORTB));
for (uint32_t Loop;Loop<0x1FFFF;Loop++);
}
}
Скомпилируем данную программу и загрузим ее в микроконтроллер, при этом в результате ее выполнения мы можем наблюдать мигание светодиода.
Задание: Рассчитайте значение константы при периоде включения и выключения светодиода равном 1 секунде, тактовой частоте микроконтроллера 8 МГц и длительности выполнения одного цикла for равной 6 тактам. Подставте полученное значение в шестнадцетеричной форме в условие цикла, скомпилируйте и загрузите программу в микроконтроллер.
Для более точной установки времени задержки используют системный таймер SysTick. Описание таймера и его регистров содержится в спецификации главе 7 Системный таймер SysTick. Системный таймер для настройки имеет 4
регистра: |
|
Регистр CTRL |
- Регистр контроля и статуса |
20
Регистр LOAD |
- Регистр стартового значения счетчика |
Регистр VAL |
- Регистр текущего значения |
таймера |
|
Регистр CAL |
- Регистр калибровочного |
значения |
|
Для конфигурации таймера нам понадобятся два регистра CTRL и LOAD, для работы таймера нужно выбрать период, через который таймер будет вызывать прерывание, разрешить прерывания от таймера, а также выбрать источник синхросигнала и включить таймер. Данные операции
осуществляются следующими командами: |
|
SysTick->LOAD =(8000000/10)-1; |
//Период счетчика |
100 мс |
|
SysTick->CTRL |=(1<<2|1<<1|1<<0); |
//Включаем |
счетчик и прерывания от него. |
|
Настройку счетчика оформим в виде отдельной функции Init_SysTick, при этом код функции будет иметь следующий вид:
void Init_SysTick(void) |
|
|
{ |
|
|
SysTick->LOAD |
=(8000000/10)-1; |
//Период |
счетчика 100 мс |
|
|
SysTick->CTRL |
|=(1<<2|1<<1|1<<0); |
//Разрешаем |
счетчик и прерывания от него.
}
При обнулении счетчик вызывает прерывание по некоторому адресу, который следует указать в программе, вектор прерывания можно найти в файле «startup_1986BE9x.s». В самом прерывании будем обрабатывать с заданным периодом переменную-счетчик. Код обработки прерывания имеет следующий вид:
volatile uint32_t Delay_dec = 0;
//Обработка прерывания от таймера SysTick void SysTick_Handler (void)
21
{
if (Delay_dec) Delay_dec--;
}
Для установки задержки следует присвоить значение задержки переменной Delay_dec, что мы будем осуществлять в отдельной функции:
void Delay_ms (uint32_t Delay_ms_Data)
{
Delay_dec = Delay_ms_Data; while (Delay_dec) {};
}
Данную функцию будем вызывать из основной программы, при этом аргументом функции будет значение задержки в сотнях мс:
int main (void)
{
Init_SysTick(); //Инициализация счетчика Init_PORTB(); //Инициализация порта while (1)
{
//Включаем светодиод
PORTB-> RXTX = (1<<15) | (PORTB->RXTX & (~JTAG_PINS(PORTB)));
Delay_ms(5);
//Выключаем светодиод
PORTB-> RXTX &= ~((1<<15) | JTAG_PINS(PORTB));
Delay_ms(5);
}
}
Задание: в качестве самостоятельной работы установите период срабатывания счетчика равный 20 мкс, при этом
22
расчитайте аргумент функции задержки таким образом, чтобы период мигания светодиода оставался равным 1 секунде.
4 Содержание отчета
Итогом работы является текст программы включения и выключения светодиода на 12 выводе порта В с частотой 5 Гц, а также описание инициализации и регистров таймера.
В отчете необходимо привести: 1 Цель работы.
2 Подробное описание регистров для настройки таймера и таблицу векторов прерываний, исключая внешние прерывания.
3 Отчет должен содержать результаты выполнения практической работы.
4 Все рисунки должны иметь пояснительные надписи.
5 Вывод.
5 Контрольные вопросы по работе
5Структура регистров настройки таймера SysTick
6Что необходимо изменить в программе для увеличения периода таймера SysTick
7Какая операция выполняется в прерывании таймера
SysTick
8Какой адрес прерывания при сбросе микроконтроллера.
9Почему светодиод включаемый и выключаемый в бесконечном цикле без задержек, или с минимальной задержкой светит не в полную мощность.
10Типы данных языка С++
11Синтаксис логических операторов языка C++
12Модификаторы языка C++
13Функции языка С++
23
Лабораторная работа №3 Интерфейс ввода
Лабораторный практикум знакомит слушателей с 32 разрядным микроконтроллером 1901ВЦ1Т на примере работы с интерфейсом ввода.
1Цель работы Изучить работу 32-разрядного микроконтроллера 1901ВЦ1Т, ввод данных на примере обработки нажатий кнопок.
2Средства используемые при выполнении практической работы
Практическая работа выполняется на персональном
компьютере с установленной программой Keil.
3 Порядок выполнения практической работы
Создадим проект Lab_3 и настроим его аналогично проекту из 1 лабораторной работы.
Определим имя кнопок и соответствующий им номер вывода, для этого воспользуемся директивой #define. Определение имени кнопки позволяет использовать его в программе без необходимости запоминания вывода, к которому подключена кнопка, а также позволяет изменять вывод кнопки без изменения текста основной программы. Все кнопки, используемые в данной лабораторной подключены к порту С, а светодиоды к порту В.
//Определение кнопок, подключенных к порту С
#define |
BUT_SEL |
1<<0 |
//кнопка BUT_SEL |
подключена к 0 выводу |
|
|
|
#define |
BUT_UP |
1<<3 |
//кнопка BUT_UP |
подключена к 3 выводу |
|
|
|
#define |
BUT_DOWN |
1<<4 |
//кнопка BUT_DOWN |
подключена к 4 выводу |
|
|
|
#define |
BUT_LEFT |
1<<5 |
//кнопка BUT_LEFT |
подключена к 5 выводу |
|
|
|
#define |
BUT_RIGHT |
1<<6 |
//кнопка BUT_RIGHT |
подключена к 6 выводу Аналогично определим имена светодиодов
24
//Определение светодиодов, подключенных к порту В
#define |
LED5 |
1<<15 |
//светодиод LED5 |
подключен к 15 выводу |
|
|
|
#define |
LED4 |
1<<14 |
//светодиод LED4 |
подключен к 14 выводу |
|
|
|
#define |
LED3 |
1<<13 |
//светодиод LED3 |
подключен к 13 выводу |
|
|
|
#define |
LED2 |
1<<12 |
//светодиод LED2 |
подключен к 12 выводу |
|
|
|
#define |
LED1 |
1<<11 |
//светодиод LED1 |
подключен к 11 выводу После чего можно приступать к непосредственному
описанию функций инициализации портов. Для подключения светодиодов необходимо настроить выводы 11-15 порта В на вывод, для чего используем следующую функцию:
void Init_LED(void)
{
RST_CLK->PER_CLOCK |= (1<<22); PORTB->OE |=(LED5|LED4|LED3|LED2|LED1); PORTB->ANALOG |=(LED5|LED4|LED3|LED2|LED1); PORTB->PWR |=(1<<30|1<<28|1<<26|1<<24|1<<22);
}
Все операции данной функции знакомы вам из первой лабораторной работы.
Задание: Прокомментируйте каждую строку функции. Следующий этапом будет инициализация выводов 0, 3-6 для
подключения кнопок, для этого необходимо настроить выводы порта как вход и подключить к нему подтягивающие резисторы. Для этого воспользуемся следующей функцией:
void Init_Button(void)
{
RST_CLK->PER_CLOCK|= (1<<23);
25
PORTC->ANALOG |=(BUT_SEL|BUT_UP|BUT_DOWN|BUT_LEFT|BUT_RI
GHT); PORTC->PULL
|=(BUT_SEL<<16|BUT_UP<<16|BUT_DOWN<<16|BUT_LEFT<< 16|BUT_RIGHT<<16);
}
Задание: Пользуясь документацией на микроконтроллер, а в частности главой 9 и 11 прокомментируйте каждую строку функции.
После того как мы настроили порты, можно начинать обработку поступающей с кнопок информации. Для этого напишем функцию, которая возвращает номер светодиода в соответствии с нажатой кнопкой, либо «0», если ни одна из кнопок не была нажата данная функция имеет следующий вид:
int Button_proc(void)
{
int CodeButton=0; |
|
if ((PORTC->RXTX & BUT_SEL) |
= =0) |
CodeButton = LED5; |
|
if ((PORTC->RXTX & BUT_UP) |
= =0) |
CodeButton = LED4; |
|
if ((PORTC->RXTX & BUT_DOWN) = =0) |
CodeButton |
= LED3; |
|
if ((PORTC->RXTX & BUT_LEFT) = =0) |
CodeButton |
= LED2; |
|
if ((PORTC->RXTX & BUT_RIGHT) = =0) |
CodeButton |
= LED1; |
|
return(CodeButton); |
|
} |
|
Значение, возвращаемое функцией непосредственно можно использовать при включении светодиодов. После описания функций инициализации и обработки кнопок можно переходить к описанию основной программы, которая имеет следующий вид
int main (void)
{
26
Init_LED();
Init_Button(); while (1)
{
if (Button_proc()) //Включаем светодиоды
PORTB-> RXTX = (Button_proc() | (PORTB->RXTX & (~JTAG_PINS(PORTB))));
else
//Выключаем светодиоды
PORTB-> RXTX &= ~((LED5|LED4|LED3|LED2|LED1) | JTAG_PINS(PORTB));
}
}
Задание: в качестве самостоятельной работы модернизируйте программу таким образом, чтобы нажатие кнопки BUT_DOWN включало светодиоды LED1, LED3 и LED5 одновременно.
Задание: в качестве самостоятельной работы установите период срабатывания счетчика равный 20 мкс, при этом расчитайте аргумент функции задержки таким образом, чтобы период мигания светодиода оставался равным 1 секунде.
4 Содержание отчета
Итогом работы является текст программы одновременного включения и выключения светодиодов LED1, LED3 и LED5 нажатием кнопки BUT_DOWN.
В отчете необходимо привести: 1 Цель работы.
2 Подробное описание регистров для настройки порта вводавывода, полный текст программы и комментарии к нему.
3 Отчет должен содержать результаты выполнения практической работы.
4 Все рисунки должны иметь пояснительные надписи.
5 Вывод.
27