
Программирование встроенных приложений Keil uvision
.pdf
СПБГУАП группа 4736 / Индустрия 4.0
Рис. 29. Выбор меню для настройки пути к новой библиотеке
В открывшемся окне следует перейти во вкладку “C/C++” и в поле “Include Paths” добавить путь к папке с библиотекой (рис. 30).
Рис. 30. Пример добавления пути к папке с новой библиотекой
59
СПБГУАП группа 4736 / Индустрия 4.0
При этом в коде программы необходимо указать частоту тактирования МК и подключить файл самой библиотеки.
По умолчанию при включении питания МК К1986ВЕ92QI тактируется от встроенного генератора HSI (high speed internal) с частотой 8 МГц.
Создадим программу, которая будет периодически включать и выключать светодиод VD4, подключенный к PA0 PORTA c частотой 1 Гц.
Для этого потребуется инициализировать систему задержек, вызвав функцию delay_init из библиотеки задержек, добавить в программу блок бесконечного цикла, в котором будет происходить включение и выключение светодиода VD4 (PA0). Листинг этой программы приведен ниже. Загрузив hex файл в плату можно убедиться в правильности работы алгоритма.
Обратите внимание на то, что компилятор воспринимает по-разному написание выражений Delay и delay!
60
СПБГУАП группа 4736 / Индустрия 4.0
/*------------------------------------------------------------ |
|
*/ |
#include "MDR32Fx.h" |
// подключение библиотеки МК |
|
#define F_CPU 8000000 |
// указание тактовой частоты МК |
|
#include "milkites_delay.h" // подключение библиотеки задержек |
||
/*------------------------------------------------------------ |
|
*/ |
int main() |
|
|
{ |
|
|
MDR_RST_CLK->PER_CLOCK = 1 << 21; // вкл. тактирование PORTA |
||
MDR_PORTA->OE |
= 0xffff; // настройка PORTA на выход |
|
MDR_PORTA->FUNC |
= 0x0000; |
// функция - порт, основная функция |
MDR_PORTA->PWR |
= 0xffff; // максимально быстрый фронт |
|
MDR_PORTA->ANALOG = 0xffff; // режим работы - цифровой ввод/вывод |
||
delay_init(); |
|
// инициализация системы задержек |
while (1) |
|
|
{ |
|
|
MDR_PORTA->RXTX |
= 0x01; // вкл светодиода VD4 подключ. к PA0 |
|
delay_ms(1000); |
// задержка 1000 мс |
|
MDR_PORTA->RXTX |
= 0x00; // выкл светодиода VD4 подключ. к PA0 |
|
delay_ms(1000); |
// задержка 1000 мс |
}// while
}// main
/*------------------------------------------------------------ |
*/ |
|
Листинг 2. Программа для вывода динамический информации на |
|
светодиодные индикаторы |
61

СПБГУАП группа 4736 / Индустрия 4.0
4.2.6. Создание программы для вывода информации по нажатию на кнопочную клавиатуру
До этого момента мы работали с портом в режиме цифрового выхода. Теперь же создадим программу, которая будет анализировать логический уровень на выводе PB4 МК, подключенного к кнопке SB3 (рис. 31).
Рис. 31. Принципиальная схема включения кнопочной клавиатуры в составе платы МилКиТЭС
Для реализации этого потребуется инициализировать POTRB таким образом, чтобы PB4 работал как цифровой вход. Это достигается путем записи 0 в бит 4 регистра MDR_PORTB->OE, остальные настройки порта останутся такими же, как в листинге 1. Кроме этого требуется включить тактирование PORTB в регистре управления тактовой частотой периферийных блоков MDR_RST_CLK-
>PER_CLOCK (листинг 3).
Включение тактовой частоты для PORTB осуществляется записью 1 в 22 бит, а для включения тактовой частоты на PORTA надо записать 1 в 21 бит.
62
СПБГУАП группа 4736 / Индустрия 4.0
Функция __nop (от англ. No Operation) в цикле подразумевает выполнение пустой команды микроконтроллером в то время, когда кнопка SB4 не нажата. Это сделано для предотвращения ошибок в аппаратной части процессора в то время, когда нет никаких других операций (листинг 3).
В программе, показанной на листинге 3 в цикле, анализируется состояние кнопки PB4. Согласно электрической схеме на рис. 31, PB4 подтянут к +3.3В резистором R5, при этом на выводе PB4 установлен высокий логический уровень, соответствующий выключенной (отжатой) кнопке. Если кнопка нажата, на входе PB4 PORTB появляется низкий логический уровень, таким образом анализируется наличие низкого логического уровня на входе PB4 PORTB.
Результатом работы программы, описанной в листинге 3, является включение светодиода, подключенного к PA0, во время нажатия на кнопку PB4.
63
СПБГУАП группа 4736 / Индустрия 4.0
/*------------------------------------------------------------ |
|
|
|
|
*/ |
#include "MDR32Fx.h" |
|
// подключение библиотеки МК |
|||
#define F_CPU 8000000 |
// указание тактовой частоты МК |
||||
#include "milkites_delay.h" // подключение библиотеки задержек |
|||||
#define PB4 1 << 4 |
|
|
// определение бита, соответствующего |
||
|
|
|
// нажатию кнопки PB4 |
||
/*------------------------------------------------------------ |
|
|
|
|
*/ |
int main() |
|
|
|
|
|
{ |
|
|
|
|
|
MDR_RST_CLK->PER_CLOCK = (1 << |
21) | |
// вкл. тактирование PORTA |
|||
|
|
|
(1 << 22); // вкл. тактирование PORTB |
||
MDR_PORTA->OE |
= |
0xffff; // настройка PORTA на выход |
|||
MDR_PORTA->FUNC |
= |
0x0000; // функция – порт, основная функция |
|||
MDR_PORTA->PWR |
= |
0xffff; // максимально быстрый фронт |
|||
MDR_PORTA->ANALOG = |
0xffff; // режим работы – цифровой ввод/вывод |
||||
MDR_PORTB->OE |
= |
0xfff7; // все биты PORTB кроме PB4 – выходы |
|||
MDR_PORTB->FUNC = |
0x0000; // функция – порт, основная функция |
||||
MDR_PORTB->ANALOG = |
0xffff; // режим работы – цифровой ввод/вывод |
||||
delay_init(); |
|
|
// инициализация системы задержек |
while (1)
{
if(MDR_PORTB->RXTX & PB4)
{
MDR_PORTA->RXTX = 0; // вкл.светодиода VD4 подключенного к PA0
} |
|
else |
|
{ |
|
MDR_PORTA->RXTX = 1; |
|
delay_ms(10); |
// задержка 10 мс |
} // if |
|
__nop(); |
// команда пустой операции |
}// while
}// main
/*------------------------------------------------------------ |
*/ |
Листинг 3. Программа анализирующая состояние нажатия кнопки PB4
64

СПБГУАП группа 4736 / Индустрия 4.0
4.2.7. Создание программы для вывода информации по нажатию на сенсорную кнопку
В составе отладочной платы МилКиТЭС имеется сенсорная кнопка. Она является большим медным проводником (падом) на печатной плате, который подключен к драйверу сенсорной кнопки – микросхеме AT42QT1010.
Цифровой емкостный датчик, производства компании Atmel, с широкополосным переносом заряда (QT), который может обнаруживать как прикосновение, так и приближение, что делает его идеальным для реализации сенсорных панелей управления [10]. Рассмотрим схему включения на рис. 32.
Рис. 32. Принципиальная схема включения сенсорной кнопки в составе платы МилКиТЭС
Из схемы видно, что выход сенсорного датчика подключен к PB5 PORTB. Касание пальцем сенсорной кнопки вызывает изменение емкости сенсорной кнопки, что обеспечивает появление высокого логического уровня на выводе 1 микросхемы DA3. Для анализа состояния бита PB5 PORTB необходимо настроить его как цифровой вход (листинг 4).
Создадим программу, которая будет включать три разных комбинации светодиодов в зависимости от нажатых кнопок.
Всего подразумевается наличие четырех состояний автомата: нажата кнопка PB4, нажата сенсорная кнопка, нажаты обе кнопки одновременно и состояние, когда ничего не нажато. Для реализации этого в программе идеально подойдет конечный автомат Мили [9], построенный на конструкции switch case (листинг 4).
65
СПБГУАП группа 4736 / Индустрия 4.0
/*------------------------------------------------------------ |
|
|
*/ |
#include "MDR32Fx.h" |
// подключение библиотеки МК |
||
#define F_CPU 8000000 |
// указание тактовой частоты МК |
||
#include "milkites_delay.h" // подключение библиотеки задержек |
|||
#define sensor_on 0xff |
// определение состояния, соотв. |
||
|
|
// нажатию сенсорной кнопки |
|
#define PE4_on |
0xcf |
// определение состояния, соотв. |
|
|
|
// нажатию кнопки PB4 |
|
#define both_on |
0xef |
// определение состояния, соотв. |
|
|
|
// нажатию одновр.сенсорной и PB4 |
|
/*------------------------------------------------------------ |
|
|
*/ |
int main() |
|
|
|
{ |
|
|
|
uint8_t sw_state = 0; |
// переменная для хранения сост. кнопок |
||
MDR_RST_CLK->PER_CLOCK = (1 << 21) | |
// вкл. тактирование PORTA |
||
|
|
(1 << 22); |
// вкл. тактирование PORTB |
MDR_PORTA->OE |
= 0xffff; // настройка PORTA на выход |
||
MDR_PORTA->FUNC |
= 0x0000; // функция - порт, основная функция |
||
MDR_PORTA->PWR |
= 0xffff; // максимально быстрый фронт |
||
MDR_PORTA->ANALOG = 0xffff; // режим работы - цифровой ввод/вывод |
|||
MDR_PORTB->OE |
= 0xffe7; // все биты кроме PB4 и PB5 - цифровые |
||
|
|
// выходы, PB4 и PB5 - цифровые входы |
|
MDR_PORTB->FUNC |
= 0x0000; // функция - порт, основная функция |
||
MDR_PORTB->ANALOG = 0xffff; // режим работы - цифровой ввод/вывод |
|||
delay_init(); |
|
// инициализация системы задержек |
while (1)
{
// сохранение состояния регистра RXTX PORTB sw_state = (uint8_t) (MDR_PORTB->RXTX & 0x00ff);
switch(sw_state) // анализ состояния битов RXTX PORTB
{
//состояние 1, нажата сенсорная кнопка, вкл. светодиод PA7 case sensor_on: MDR_PORTA->RXTX = 1 << 7; break;
//состояние 2, нажата кнопка PB4, вкл. светодиод PA0
case PE4_on: |
MDR_PORTA->RXTX = 1; |
break; |
//состояние 3, нажаты обе кнопки, вкл. светодиоды PA3 и PA4 case both_on: MDR_PORTA->RXTX = 3 << 3; break;
//состояние по умолчанию если кнопки не нажимались
default: MDR_PORTA->RXTX = 0;
} // switch
}// while
}// main
/*------------------------------------------------------------ |
*/ |
Листинг 4. Пример реализации конечного автомата Мили для обработки состояний кнопок
66
СПБГУАП группа 4736 / Индустрия 4.0
Впрограмме на листинге 4 все значения регистра RXTX PORTB детерминированы и объявлены в начале программы, эти значения и образуют три числа, являющиеся состояниями конечного автомата. Каждое состояние обладает набором определенных действий и оператором выхода из состояния break. Четвертое состояние – состояние по умолчанию, когда ни одна из кнопок не нажата.
Результатами работы программы являются четыре состояния светодиодов: включен PA0 в случае нажатия на кнопку PB4, включен PA7 в случае нажатия на сенсорную кнопку, включены светодиоды PA3 и PA4, если нажата как сенсорная кнопка, так и PB4. Четвертое состояние, когда все светодиоды выключены, является очень важным, автомат должен строиться так, чтобы все его состояния были определены в программном коде.
4.2.8.Заключение
Вработе рассмотрены принципы и алгоритмы работы с портами ввода/вывода МК K1986BE92QI в составе отладочной платы МилКиТЭС.
Рассмотрен алгоритм загрузки прошивки в МК через интерфейс UART с помощью программы 1986WSD, проведен анализ части электрической схемы МилКиТЭС, используемой для освоения принципов работы с портами ввода/вывода.
Примеры взаимодействия пользователя со светодиодной линейкой, кнопочной клавиатурой и сенсорной кнопкой приведены в виде листингов.
Для самоконтроля студент должен решить две любые задачи из п. 9 работы. Для уверенного освоения материала желательно выполнить не менее трех задач самостоятельно. Примером отличного освоения материала было бы самостоятельное создание ряда задач на взаимодействие пользователя с кнопочной клавиатурой и сенсорной кнопкой.
67
СПБГУАП группа 4736 / Индустрия 4.0
4.2.9.Задачи для самостоятельной работы
1.Сталкивающиеся огоньки. Включаются 8 и 1 светодиоды одновременно, далее через полсекунды включаются 7 и 2 и т.д. до включения 4 и 5 светодиодов. После этого все светодиоды гаснут и программный цикл начинается заново.
2.Сдвигающиеся вверх огоньки. Включаются 1 и 2 светодиоды, далее каждые полсекунды пара включенных светодиодов смещается вверх, т.е. гаснет 1 светодиод, 2 и 3 включены; гаснет 2 светодиод, 3 и 4 включены и т.д. до включения 7 и 8 светодиодов. Далее все светодиоды выключаются и процесс повторяется снова.
3.Разбегающиеся огоньки. Включаются 4 и 5 светодиоды, через полсекунды они гаснут и включаются 5 и 3 и т.д. до включения
1и 8 светодиодов. Далее процесс повторяется снова.
4.Столбик из огоньков. Сначала включается 1 светодиод, через полсекунды включается 2 светодиод и так до включения 8 светодиода, после этого происходит выключение светодиодов в этом же порядке каждые полсекунды. После выключения 8 светодиода весь процесс повторяется снова.
5.Бегущий огонек. Происходит попеременное включение одного светодиода, начиная с 1, потом 2 и заканчивая 8, с интервалом, равным половине секунды. Сначала вверх от 1 до 8 светодиода, потом вниз от 8 светодиода до 1. Далее процесс повторяется снова.
6.Сдвигающиеся вниз огоньки. Сначала включаются 8 и 7 и 6 светодиоды, далее каждые полсекунды три включенных светодиода смещается вниз, т.е. гаснет 8 светодиод, 7, 6 и 5 включены. Гаснет 7 светодиод, 6, 5 и 4 включены и т.д. до включения 1, 2 и 3 светодиодов. Далее процесс повторяется снова.
7.Бинарный индикатор. Каждые полсекунды на линейке светодиодов высвечивается инкрементирующийся байт. После достижения байтом значения 255 он обнуляется и процесс повторяется снова.
8.Бинарный четный индикатор. Каждые 200 мс происходит инкремент байта. При этом на линейке светодиодов высвечиваются только четные значения байта. После достижения байтом значения
255он обнуляется и процесс повторяется снова.
68