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

Методические указания к практическим работам по ВТиИТ

.pdf
Скачиваний:
23
Добавлен:
22.03.2016
Размер:
518.1 Кб
Скачать

2 Подробное описание регистров для настройки порта и регистра тактирования периферии.

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