Главная страница

Управление индикацией


Скачать 1.95 Mb.
НазваниеУправление индикацией
Дата04.10.2021
Размер1.95 Mb.
Формат файлаpdf
Имя файлаTsUMPY_Praktiki.pdf
ТипЗадача
#241407
страница1 из 4
  1   2   3   4


1
ЦУМП, Практические занятия,
© МИРЭА, А.Н.Богаченков
Цифровые устройства и микропроцессоры
II часть
Практические занятия
Занятие 2
Тема: Управление индикацией
Полный текст программы и проект для среды Keil MDK-ARM для режима симуляции пред- ставлен в дополнительных электронных материалах (файл «Учебные проекты Keil MDK-
ARM.zip», каталог Practical/Indication).
Задача. Клавиши S1, S2 включают/выключают соответственно индикаторы LED1, LED2.
Переключатель S3 задает два уровня яркости свечения (максимальный, средний).
Внешний вид и функциональная схема (вариант 1)
Функциональная схема (вариант 2)
S1
S2
PA9
PA2
PB5
PB7
LED1
LED2
S3
PA15
+
+
+
1
2
Ярк.
S1
S2
PA9
PA2
PB5
PB7
+
LED1
LED2
+
+
S3
PA15
+

2
ЦУМП, Практические занятия,
© МИРЭА, А.Н.Богаченков
Временные диаграммы для варианта 1
S1
S2
LED1
LED2
S3
Наж.
S1
Наж.
S2

T
Наж.
S1
Наж.
S2
Наж.
S1+S2
Максимальная яркость
100%
Пониженная яркость
(/T)∙100%
S1
S2
LED1
LED2
S3
Наж.
S1
Наж.
S2
Наж.
S1
Наж.
S2
Наж.
S1+S2
Максимальная яркость
100%
Пониженная яркость
Заготовка

3
ЦУМП, Практические занятия,
© МИРЭА, А.Н.Богаченков
Алгоритм работы процессора
Дополнительные пояснения по сторожевому таймеру.
Во всех реально работающих устройствах, как правило, должен быть задействован стороже- вой таймер (обязательно его использование в проектах курсовых работ). Если в результате сбоев/зависаний процессор не проходит фрагмент программы с обслуживанием сторожевого таймера, через заданный интервал времени происходит сброс процессора.
Инициализация:
программирование разрядов портов
Состояние S3
средняя яркость да
Начало нет
Включение LED1
максимальная яркость
Нажата S1
да нет
Включение LED2
Нажата S2
Временная задержка

Выключение LED1, LED2
Временная задержка T-

Чтение состояния порта с кнопками S1, S2
Перепаковка кода: сдвиг разрядов S1, S2 в позиции, соответствующие LED1, LED2
Вывод кода в порт индикации
Обслуживание сторожевого таймера

4
ЦУМП, Практические занятия,
© МИРЭА, А.Н.Богаченков
Перепаковка кода
Маска для выделения разряда 2:
0000 0000 0000 0100
2
или 0x0004 или 1<<2
Маска для выделения разряда 9:
0000 0010 0000 0000
2
или 0x0200 или 1<<9
15 14 13 12 11 10 9 8 7 6 5 4
3 2
1 0
15 14 13 12 11 10 9 8 7 6 5 4
3 2
1 0
S1
S2
+
+
LED1
LED2
+
Входной порт A
(регистр IDR)
Выходной порт B
(регистр ODR)
Здесь еще и инверсия

5
ЦУМП, Практические занятия,
© МИРЭА, А.Н.Богаченков
Программирование ветви управления с максимальной яркостью
Вариант 1. Использует библиотечные функции ввода и вывода 16-разрядных кодов. При перепаковке входного кода input в переменной output в 5-м и 7-м разрядах формируются уровни для прямого вывода на индикаторы, а остальные разряды кода – нулевые. Это пример плохого варианта вывода, т.к. помимо необходимых разрядов, управляющих индикаторами, в порту производится изменение (в данном случае обнуление) всех остальных разрядов
//Чтение состояния входного порта GPIOA
input = GPIO_ReadInputData(GPIOA);
//Выделение и сдвиг разрядов: 2-й на место 5-го, 9-й на место 7-го
output = (input & 0x0004) << 3 | (

input & 0x0200) >> 2;
//Вывод в выходной порт
GPIO_Write(GPIOB, output);
Вариант 2. Использует прямое обращение к регистрам портов (без библиотечных функций).
Реализована аналогичная варианту 1 перепаковка кода. Но перед выводом сначала считыва- ется текущий выходной код, в нем изменяются только требуемые разряды (5-й и 7-й), и код отправляется обратно в выходной порт
//Чтение состояния входного порта GPIOA
input = GPIOA->IDR;
//Чтение состояния выходного порта GPIOB с обнулением разрядов 5, 7
output = GPIOB->ODR & 0x00A0;
//Компоновка выходного кода
output = output | (input & 1<<2) << 3 | (input & 1<<9) >> 2;
//Вывод в выходной порт
GPIOB->ODR = output;
Вариант 3a. При выводе используются регистры побитовой установки и сброса выходных бит (BSRRL, BSRRH). В обоих случаях — и для установки и для сброса — в соответствую- щие регистры записывается один и тот же код, лог. "1" в этом коде изменяет соответствую- щий разряд, лог. "0" — оставляет неизменным.
if (input & 0x0004) GPIOB->BSRRL = 0x0020;
//Установка (выкл)
else GPIOB->BSRRH = 0x0020;
//Сброс (вкл)
if (!(input & 0x0200)) GPIOB->BSRRL = 0x0080;
//Установка (выкл)
else GPIOB->BSRRH = 0x0080;
//Сброс (вкл)
Вариант 3б. То же, но с применением библиотечных функций и констант
GPIO_WriteBit(GPIOB, GPIO_Pin_5, input & GPIO_Pin_2);
GPIO_WriteBit(GPIOB, GPIO_Pin_7, input & GPIO_Pin_9);

6
ЦУМП, Практические занятия,
© МИРЭА, А.Н.Богаченков
Программирование ветви управления с уменьшенной яркостью
Для снижения яркости используется формирование импульсов с коэффициентом длительно- сти < 100% (в приведенном далее фрагменте – 20%). Для исключения визуального эффекта мигания (мерцания) период импульсов должен быть не более 20 мс (или частота следования импульсов не менее 50 Гц).
Если требуется более точная отработка временных интервалов, необходимо учесть и время выполнения операторов включения/выключения, организации цикла (реально это времена порядка 1 мкс).
input = GPIO_ReadInputData(GPIOA);
//Включение, если нажата кнопка
if ((input & GPIO_Pin_2) == 0) GPIO_WriteBit(GPIOB, GPIO_Pin_5, 0);
if ((input & GPIO_Pin_9) != 0) GPIO_WriteBit(GPIOB, GPIO_Pin_7, 0);
Delay_ms(1);
//Задержка на время включенного состояния
//Выключение
GPIO_WriteBit(GPIOB, GPIO_Pin_5, 1);
GPIO_WriteBit(GPIOB, GPIO_Pin_7, 1);
Delay_ms(4);
//Задержка на время отключения
Вопросы и задания для самостоятельной работы
1. Сравнить функциональные схемы (варианты 1 и 2), сделать обоснованные выводы по до- стоинствам и недостаткам каждого из следующих решений:
 соединение ключей с общим проводом (землей) или питанием;
 использование внешних или встроенных подтягивающих резисторов;
 соединение индикаторов с общим проводом (землей) или питанием.
2. Дать рекомендации по выбору значения периода следования импульсов управления инди- каторами (как по максимуму, так и по минимуму).
3. Построить временные диаграммы для устройства по варианту 2.
4. Модифицировать алгоритм (желательно и программу), чтобы каждый из индикаторов в режиме пониженной яркости имел свой уровень яркости.
5. Модифицировать алгоритм (желательно и программу), чтобы включение и последующее выключение индикаторов осуществлялось при кратковременном нажатии соответствующей кнопки.
6. Модифицировать алгоритм, чтобы изменение яркости происходило при каждом кратко- временном нажатии на кнопку S3 (реализовать несколько градаций яркости и их цикличе- ский перебор).

1
ЦУМП, Практические занятия,
© МИРЭА, А.Н.Богаченков
Цифровые устройства и микропроцессоры
II часть
Практические занятия
Занятие 3
Тема: Реализация временных задержек и событий,
синхронизируемых временем
Варианты задержек на основе пустых циклов
// С оператором for
for (i = 0; i < N; i++);
// C оператором while
i = N; while (--i);
// Вложенные циклы (для больших задержек)
for (i = 0; i < N; i++)
for (j = 0; j < M; j++);
Значения N, M обычно подбираются экспериментально. Время задержки зависит от тактовой частоты процессора, уровня оптимизации компилятора, наличия событий, создающих запро- сы прерывания, типа памяти и других архитектурных особенностей процессора, т.е. не явля- ется точным и воспроизводимым. Также существенный недостаток подобных задержек – бесполезная загрузка процессора.

2
ЦУМП, Практические занятия,
© МИРЭА, А.Н.Богаченков
Использование таймера, генерирующего периодические запросы прерываний
Наиболее удобен для этой цели таймер ядра. Гарантируется точность и стабильность. Однако остается недостаток, связанный с загрузкой процессора.
/* Инициализация таймера. Значение ticks представляет собой число тактов
между прерываниями. Например, для тактовой частоты ядра 168 МГц и перио-
дичности прерываний 1 мс (1000 Гц): ticks = 168000000 Гц / 1000 Гц.
*/
SysTick_Config(ticks);
.
.
.
// Вызов подпрограммы задержки
Delay(50);
.
.
.
// Реализация подпрограммы задержки (аргумент – число миллисекунд)
void Delay(uint32_t nms)
{
Counter = nms;
while (Counter != 0);
//Это просто ожидание!
}
// Обработчик прерывания с заданной периодичностью, например, 1 мс
void SysTick_Handler(void)
{
if (Counter != 0) Counter--;
}
Использование системного таймера для измерений временных интервалов проиллюстриро- вано в п. 4 лабораторной работы № 2.

3
ЦУМП, Практические занятия,
© МИРЭА, А.Н.Богаченков
Использование таймера для непосредственного отсчета временного интервала
Может использоваться как системный, так и любой из имеющихся периферийных таймеров.
// Инициализация таймера (см., например, п. 2 лаб. раб. 2).
TimerInit();
.
.
.
// Начало временной задержки – загрузка величины задержки, пуск таймера
TIM_SetAutoreload(TIM6, N);
//N – число тактов
TIM_Cmd(TIM6, ENABLE);
// Ожидание окончания в режиме энергосбережения или продолжение работы
__WFI();
.
.
.
// Обработчик прерывания от таймера
void TIM6_Handler(void)
{
// < Здесь может быть любое действие, например, включение индикатора >
// Остановка таймера (если необходимо)
TIM_Cmd(TIM6, DISABLE);
}
Если предполагается выполнение какого-либо действия по окончании заданного временного интервала, то данная операция может быть включена в обработчик прерывания по таймеру.
Единственное условие: эта операция должна занимать минимально возможное время (реаль- но — порядка единиц микросекунд).

4
ЦУМП, Практические занятия,
© МИРЭА, А.Н.Богаченков
Алгоритм программы с реализацией больших временных интервалов и с проверкой
разных сигналов (например, нажатий клавиш)
* Фиксированная задержка может быть реализована посредством пустых циклов, но более предпочтительным является использование таймера, генерирующего запросы прерывания с данным интервалом (1 мс) и в этом месте алгоритма ядро можно перевести в режим пони- женного энергосбережения (легкий "сон").
Временная задержка нет да нет да нет
Фиксированная временная задержка, например, 1 мс
*
Другие операции
(проверка органов управления, короткие вычисления и т.п.) разрешена
Идет отсчет врем. интервала
Декремент счетчика числа миллисекунд
Выдача управляющего воздействия (или иное)
Счетчик обнулен
Сброс признака формирования временного интервала
Установка признака формирования временного интервала
Загрузка счетчика числа миллисекунд

5
ЦУМП, Практические занятия,
© МИРЭА, А.Н.Богаченков
Вопросы и задания для самостоятельной работы
1. Приняв, например, одну итерацию пустого цикла равной 40 нс, напишите операторы для получения следующих задержек: 1 мс, 1 с, 1 мин., 1 час.
2. Какой диапазон временных задержек (от минимальной до максимальной) можно реализо- вать с помощью одного периферийного таймера с 16-разрядными предделителем и основным счетчиком? Принять исходную тактовую частоту равной 168 МГц. Скорректируйте расчеты минимальной задержки с учетом того, что переход на обслуживание прерывания в ядре ARM
Cortex занимает 12 тактов, а каждая операция на языке Си выполняется приблизительно 10-
40 нс.
3. Составьте алгоритм для генерации некоторых событий (например, выдачи сигналов вклю- чений/выключений) одновременно по 4...6 каналам, причем в каждом канале используется свой временной интервал:
 в случае кратных задержек (например, 1, 2, 3. 10 мс);
 в случае произвольных некратных задержек (например, 2.3 мс, 7 мс, 9.5 мс, 20.6 мс).
4. Оцените точность получаемых задержек в заданиях п.п. 2, 3.
5. Дайте рекомендации по реализации временных интервалов, используемых в качестве пе- риода дискретизации при аналого-цифровом преобразовании.

1
ЦУМП, Практические занятия,
© МИРЭА, А.Н.Богаченков
Цифровые устройства и микропроцессоры
II часть
Практические занятия
Занятие 4
Генерация простейших сигналов, формирование временных задержек,
использование прерываний
Задача. При кратковременном нажатии кнопки сгенерировать прерывистый звуковой сиг- нал синусоидальной формы и выдать логический сигнал общей длительностью 5 с. Блокиро- вать повторные нажатия в течение данного времени.
Для практической реализации устройства необходимо задать еще несколько технических па- раметров: частоту звукового сигнала (пусть будет 1000 Гц), период повторения посылок
(пусть 0.5 с), соотношение между длительностью и паузой одной посылки (пусть 3 : 2). Пе- речисленные параметры легко задавать и изменять программным способом. При необходи- мости это можно предоставить даже конечному пользователю, например, заложив в про- грамму набор различных конфигураций. Также для реального устройства требуются пара- метры, определяемые аппаратными средствами: напряжения, токи (мощности) звукового и логического сигналов, тип и напряжение питания, конструктивные особенности (например, кнопка или выключатель) и т.п. На практических занятиях ограничимся функциональной схемой, алгоритмом работы, программой.
Функциональная схема
Единственное замечание по представленной схеме: внешние входы/выходы никогда не сле- дует подсоединять напрямую к портам микроконтроллера, необходимо использовать буфер- ные (усилительные) схемы и другие элементы защиты от перегрузок и перенапряжений.
Порт
Внешний логический выход
Буферный каскад
CPU
ЦАП
Таймер
+
Порт
Логический выход
Звуковой излучатель
Усилитель
Контрольная индикация

2
ЦУМП, Практические занятия,
© МИРЭА, А.Н.Богаченков
Временные диаграммы
Напряжение на выходе ЦАП является однополярным, при отсутствии сигнала "нулевой" уровень соответствует среднему значению напряжения (половине размаха). Усилители зву- ковых сигналов, как правило, содержат разделительные конденсаторы, убирающие постоян- ную составляющую.
При передаче переменного сигнала разделительный конденсатор всегда является полезным.
ЦАП, особенно встроенный, является маломощным устройством. Для целей, например, сиг- нализации, и в случаях, когда требуются простые однотонные сигналы, рационально исполь- зовать логический выход.
ЦАП
U
ЦАП
U
ВЫХ
Кнопка
5 c
Логический выход
Звуковой выход (ЦАП)
0.3 c 0.2 c
Выход ЦАП
Запросы прерывания
Флаг разрешения звукового сигнала
Выход усилителя

3
ЦУМП, Практические занятия,
© МИРЭА, А.Н.Богаченков
Анализ программной реализации
Длительность всего процесса генерации (5 с) реализуется путем подсчета событий, синхронизируемых таймером (здесь — с частотой дискретизации ЦАП).
Длительности звукового сигнала (0.3 с) и паузы между посылками (0.2 с) удобно формировать счетчиком числа выводимых отсчетов, например, при частоте дискретизации
16000 Гц для звуковой посылки длительностью 0.3 секунды требуется 4800 отсчетов.
Признаки, используемые в программе:
признак старта — устанавливается при нажатии кнопки, по этому признаку произ- водится подготовка к процессу генерации сигналов, выдается логический сигнал; при- знак сразу сбрасывается во время этой подготовки;
признак процесса — устанавливается после старта и свидетельствует о протекающем процессе генерации логического и звуковых сигналов; сбрасывается по окончании за- данного временного интервала;
признак "звук – пауза" — является переключателем между стадиями выдачи звуко- вой посылки и паузы между ними.
Любые признаки (флаги) в алгоритмах и программах должны использоваться как ми- нимум в трех местах: где-то сбрасываться, где-то устанавливаться, где-то проверяться.
Для блокировки действия кнопки во время формирования сигнала в обработчике нажатия кнопки проверяется признак протекающего процесса, если он установлен, повторно признак старта не выдается.
Отсчет временного интервала можно вести по принципу многократного использова- ния фиксированной задержки на небольшое время (наиболее часто используют величину
1 мс). При этом ядро большую часть времени будет работать вхолостую с максимальной производительностью. Более рациональным является использование периодических преры- ваний, в данной программе — прерываний с периодом дискретизации сигнала. Ядро при этом в основном находится в режиме "сна", пробуждаясь с каждым запросом прерывания и подсчитывая число запросов (пробуждений). С помощью этого счетчика формируются вре- менные дискреты большей продолжительности (например, та же 1 мс).

4
ЦУМП, Практические занятия,
  1   2   3   4


написать администратору сайта