А.П.Евдокимов, Л.Л.Владимиров Программирование микроконтроллера К1986ВЕ92QI компании Миландр (1186478), страница 4
Текст из файла (страница 4)
Подключите отладочную плату к компьютеру.2. Подайте питание на плату.3. Запустите среду программирования Keil μVision.4. Занесите программу в микроконтроллер с помощью программатора. Удостоверьтесь в правильности работы устройства.5. По заданию преподавателя измените длительность задержки ивновь проделайте пункт 3.КОНТРОЛЬНЫЕ ВОПРОСЫ1. Что представляет собой порт микроконтроллера и каково егоназначение?2. Сколько портов в микроконтроллере К1986ВЕ92QI и чем ониотличаются друг от друга?3.
Как настраиваются режимы работы портов?4. Поясните логику работы программы, приведенной в даннойлабораторной работе.31ЛАБОРАТОРНАЯ РАБОТА 4.ПРЕРЫВАНИЕ ОТ КНОПКИЦЕЛЬ РАБОТЫУметь организовать прерывание при возникновении внешнегособытия.ТЕОРЕТИЧЕСКАЯ ЧАСТЬПрерывание – это изменение естественного хода выполненияпрограммы под воздействием внешней причины (события прерывания).
Таким событием в микроконтроллере может быть, в частности,нажатие кнопки. При возникновении события прерывания в определенном регистре специального назначения один из битов устанавливается в логическую единицу (появляется так называемый флаг), амикроконтроллер переходит к исполнению команды, записанной пофиксированному адресу, который называется вектором прерывания.При этом начинается выполнение отдельной программы, по завершении которой осуществляется очистка флага, а затем – возврат к основной программе. Под отдельной программой понимается совокупностькоманд, которую должен выполнить микроконтроллер в результатевнешнего события (в данном случае – нажатия кнопки).Опишем процедуру прерывания, назвав ее, например, INTERRUPT.Сначала сбросим флаг внешнего прерывания, чтобы прерываниене было заблокировано:NVIC_ClearPendingIRQ(EXT_INT2_IRQn);Теперь разрешим прерывания «в принципе» (глобальное разрешение):__enable_irq();а затем уже разрешим конкретный вид прерываний, в нашем случае –внешнее прерывание (EXT_INT2):NVIC_EnableIRQ(EXT_INT2_IRQn);Главное, ради чего осуществляется прерывание – это обработкапрерываний, т.е.
выполнение определенной программы, ради которойи было организовано прерывание. Обработка прерывания осуществля32ется процедурой void EXT_INT2_IRQHandler(void). В рамкахпроцедуры сначала выполняется набор необходимых команд, а завершается процесс сбросом флага внешнего прерывания:NVIC_ClearPendingIRQ(EXT_INT2_IRQn);Рассмотрим программу, суть которой сводится к следующему.При подаче питания на отладочную плату светодиод VD3 будет мигать с низкой частотой, при нажатии на кнопку, предварительно подключенную к плате, частота мигания возрастет, при следующем нажатии – еще увеличится, затем – опять, а вот при четвертом нажатии накнопку всё вернется в исходное состояние, и светодиод будет мигатьмедленно.// Изменение частоты миганий светодиода VD3// на отладочной плате по прерыванию от внешней кнопки// Подключение заголовочных файлов необходимых библиотек#include <MDR32F9Qx_port.h>#include <MDR32F9Qx_rst_clk.h>// Объявление переменныхint j;int i;int T;// Определение первой функции задержки#define DELAY1(D) for (j = D; j > 0; j--)// Определение второй функции задержки#define DELAY2(T) for (i = T; i > 0; i--)// Процедура инициализации портовvoid PortsInit(){// Включение тактирования портов B и CRST_CLK_PCLKcmd(RST_CLK_PCLK_PORTB |RST_CLK_PCLK_PORTC,ENABLE);// Указание типа структуры и имени структурыPORT_InitTypeDef Nastroyka_C;// Работа в режиме порта ввода-выводаNastroyka_C.PORT_FUNC = PORT_FUNC_PORT// Цифровой режимNastroyka_C.PORT_MODE = PORT_MODE_DIGITAL;// Низкая скорость переключения (пологий фронт)Nastroyka_C.PORT_SPEED = PORT_SPEED_SLOW;// Конфигурация линии порта как выходаNastroyka_C.PORT_OE = PORT_OE_OUT;33// Объявление номера линии порта, которая// настраивается данной структуройNastroyka_C.PORT_Pin = PORT_Pin_0;// Инициализация порта C объявленной структуройPORT_Init(MDR_PORTC, &Nastroyka_C);// Указание типа структуры и имени структурыPORT_InitTypeDef Nastroyka_B;// Работа в альтернативном режиме порта EXT_INT2Nastroyka_B.PORT_FUNC = PORT_FUNC_ALTER;// Цифровой режимNastroyka_B.PORT_MODE = PORT_MODE_DIGITAL;// Низкая скорость переключения (пологий фронт)Nastroyka_B.PORT_SPEED = PORT_SPEED_SLOW;// Конфигурация линии порта как входаNastroyka_B.PORT_OE = PORT_OE_IN;// Объявление номера линии порта, которая// настраивается данной структуройNastroyka_B.PORT_Pin = PORT_Pin_10;//Инициализация порта C объявленной структуройPORT_Init(MDR_PORTB, &Nastroyka_B);}// Процедура инициализации внешнего прерыванияvoid INTERRUPT(){// Очистка флага внешнего прерывания EXT_INT2NVIC_ClearPendingIRQ(EXT_INT2_IRQn);// Глобальное разрешение прерываний__enable_irq();// Разрешения внешнего прерывания EXT_INT2NVIC_EnableIRQ(EXT_INT2_IRQn);}// Процедура обработки внешнего прерывания EXT_INT2void EXT_INT2_IRQHandler(void){// Уменьшение времени задержки,// т.е.
увеличение частоты мигания светодиодаT = T - 50000;// Если задержка равна нулю,// то возвращение в исходное состояниеif (T == 0) T = 200000;// Задержка, в течение которой прекращается дребезг контактовDELAY1(100000);// Если сигнал внешнего прерывания завершен,34// очистить флаг внешнего прерывания EXT_INT2if (PORT_ReadInputDataBit(MDR_PORTB, PORT_Pin_10) == 0){NVIC_ClearPendingIRQ(EXT_INT2_IRQn);}}// Объявление главной функцииint main(){// Вызов процедуры инициализации портовPortsInit();// Вызов процедуры инициализации внешнего прерыванияINTERRUPT();// Задание начального значения второй функции задержки,// определяющей время свечения светодиода и паузыT = 200000;// Главный циклwhile (1){// Установка единицы на линии PC0 порта СPORT_SetBits(MDR_PORTC, PORT_Pin_0);DELAY2(T); // Задержка// Сброс единицы на линии PC0 порта СPORT_ResetBits(MDR_PORTC, PORT_Pin_0);// Сброс единицы на 0 линии порта СDELAY2(T); // Задержка}}Итак, главная программа начинается с вызова процедурнастройки портов и инициализации внешнего прерывания.
Затем переменной T задается значение равное 200000, и начинается главныйцикл. Устанавливается логическая единица на линии 0 порта С; загорается светодиод VD3; затем задержка, определяемая переменной T;сброс линии 0 порта С (логический ноль на линии); вновь задержка, и– бесконечный цикл.При внешнем прерывании (нажатие кнопки) значение переменной T уменьшается на 50000. Если при этом переменная T станет равной нулю, то она вновь принимает исходное значение, если нет – топроизойдет небольшая задержка, за время которой успеют прекратиться импульсы, которые всегда возникают при замыкании/размыкании механических контактов, и осуществится опрос линии 10 порта B с целью определить, отпущена ли кнопка:35if (PORT_ReadInputDataBit(MDR_PORTB, PORT_Pin_10) == 0)Если кнопка отпущена (на линии 10 порта B логический ноль), тоосуществится выход из прерывания со сбросом флага, если нет – топродолжается опрос линии 10 порта B.
При этом в главном цикле значение T будет другим, изменится значение функции DELAY2(T), а значит, и время свечения и паузы светодиода.ПРАКТИЧЕСКАЯ ЧАСТЬ1. Подключите дополнительную кнопку SB к разъему XP13 отладочной платы в соответствии с рисунком 4.12. Подключите отладочную плату к компьютеру.3. Подайте питание на плату.4. Запустите среду программирования Keil μVision.5. Занесите программу в микроконтроллер с помощью программатора. Нажимая на кнопку SB, наблюдайте за изменением частотымигания светодиода VD3.
Удостоверьтесь в правильности работыустройства.6. По заданию преподавателя измените начальную частоту мигания светодиода, количество ступеней при переключении частоты.Рисунок 4.1 – Подключение кнопки к отладочному стендуКОНТРОЛЬНЫЕ ВОПРОСЫ1. Что называют прерыванием в микропроцессорной технике?Под воздействием каких причин оно происходит?2. Что такое «вектор прерывания»?3.
Как осуществляется обработка прерывания?4. Поясните логику работы программы, приведенной в даннойлабораторной работе.36ЛАБОРАТОРНАЯ РАБОТА 5.ПРЕРЫВАНИЕ ОТ ТАЙМЕРАЦЕЛЬ РАБОТЫИзучить характеристики таймера микроконтроллера. Уметь использовать таймер для задания интервалов времени и организациипрерываний.ТЕОРЕТИЧЕСКАЯ ЧАСТЬВ состав микроконтроллера К1986ВЕ92QI входят 3 таймера общего назначения (на рисунке 1.1 обозначены как «3 х 16 Timer» –найдите их). Таймер представляет собой 16-разрядный счетчик, у которого есть три режима счета: прямой, обратный и двунаправленный(сначала прямой счет до определенного значения, а затем обратный).Для изменения частоты счета у каждого таймера имеется 16разрядный предделитель с переменным коэффициентом деления, который также представляет собой счетчик.
На основе таймеров построены четырехканальные блоки, обеспечивающие режимы «Захват»,«Сравнение» и «ШИМ».Режим «Захват» позволяет по внешнему сигналу останавливатьсчет, и может быть использован, например, когда необходимо измерить интервал времени между двумя событиями.В режиме «Сравнение» микроконтроллер выдает сигнал, когдасостояние таймера совпадает с заранее записанным числом, т.е. работает как таймер в обыденном понимании, например, как таймер в мобильном телефоне.Режим «ШИМ» – это режим широтно-импульсной модуляции:микроконтроллер выдает прямоугольные импульсы неизменной частоты, неизменной амплитуды, но переменной длительности.