Микроконтроллеры. Управление цифровыми портами AVR. Методические указания к лабораторным и практическим занятиям
.pdf21
Запустить Arduino IDE (Integrated Development Environment - интегри-
рованная среда разработки) и набрать разработанный код в рабочем окне среды IDE.
Сохранить программу, введя ее имя и путь сохранения (Ctrl+S или Save на панели инструментов). Должен образоваться файл с расширением .ino.
Здесь же целесообразно проверить правильность выбора платы, для чего нажать меню Инструменты и убедиться в этом по отображению в выпадающем меню или найти и выбрать свою плату в менеджере плат на следующем уровне выпадающих меню.
Далее зафиксировать выбор порта компьютера для подключения платы ARDUINO. Он также отображается в строке Порт выпадающего окна меню Инструменты. Если при загрузке проявится несоответствие в номере порта, то в этом окне следует выставить номер порта, указанного в сообщении об ошибке.
4. Компиляция программы
Компиляция выполняется нажатием кнопки инструментов Verify/Compile (проверить). В этом процессе выявляются синтаксические ошибки, но код в плату не загружается. Все выявленные ошибки следует устранить.
5. Отладка программы
Для отладки программы ее скомпилированный код следует загрузить в устройство Arduino с последующим запуском. Выполняется это кнопкой Upload to I/O Board (загрузить) на панели инструментов. На этом этапе необходимо удостовериться в работоспособности устройства и при отрицательном результате определить возможные ошибки, устранить их в схеме и программе и повторить компиляцию и загрузку до полного устранения ошибок.
Зафиксируйте объем занятой программой памяти.
Задание 3.3. Выполнить Задание 3.2 с использованием встроенных функций ARDUINO
Используя схему и результаты выполнения задания 3.2, реализовать программу управления с использованием встроенных функций ARDUINO.
В отчете представить:
1.Программу с использованием встроенных функций;
2.Объем занятой памяти;
3.Вывод о соотношении объемов памяти программы с прямым управлением портами и программы с использованием встроенных функций.
22
3.3.1. Функции управления вводом/выводом в ARDUINO
Для работы с цифровыми выводами в ARDUINO есть 3 встроенные функции. Они позволяют установить режим вывода, считать или установить конкретный вывод в определенное состояние. Для определения состояния выводов в этих функциях используются константы HIGH и LOW, которые соответствуют высокому и низкому уровню сигнала.
|
3.3.2. pinMode(pin, mode) |
Устанавливает режим вывода mode для вывода номер pin. Функция ни- |
|
чего не возвращает. |
|
|
|
mode = INPUT |
вывод определен как вход, подтягивающий рези- |
|
стор отключен |
|
|
mode = INPUT_PULLUP |
вывод определен как вход, подтягивающий рези- |
|
стор подключен (порядка 20-50 кОм) |
|
|
mode = OUTPUT |
вывод определен как выход |
|
|
3.3.3. digitalWrite(pin, value)
Устанавливает состояние value выхода (высокое или низкое) для вывода номер pin. Функция не возвращает ничего.
value = LOW |
устанавливает выход в низкое состояние |
|
|
value = HIGH |
устанавливает выход в высокое состояние |
|
|
3.3.4. digitalRead(pin)
Считывает состояние входа номер pin. Возвращает состояние входа:
digitalRead(pin) = LOW |
низкий уровень на входе |
|
|
digitalRead(pin) = HIGH |
высокий уровень на входе |
|
|
Следует учесть, что в функциях параметр pin именуется по номерам цифровых портов на плате ARDUINO, а не по общим правилам языка С и файла описаний. Например, контакт PB4 соответствует номеру 12. Для повышения читабельности программ этим цифрам можно задать смысловые выражения. Это можно сделать двумя способами:
23
1. Объявлением и использованием константы, хотя в этом задании константа как таковая не требуется:
const int SB1Pin = 2; // кнопка SB1 — контакт 2;
2.Использованием директивы описаний, связывающей идентификатор
сконстантами или выражениями. Эквивалентное по результату первому варианту выражение получится:
#define SB1Pin 2 //символы SB1Pin соответствуют //цифре 2 в скомпилированном коде.
Использование вложенности для функций допустимо.
Задание 3.4. Управление светодиодом двумя кнопками
Дополнить схему на рис.3.7, подключив вторую кнопку SB2 к контакту 3. Кнопка SB1 должна включать светодиод. Светодиод должен остаться включенным и при отпускании кнопки SB1. Кнопка SB2 - должна отключать светодиод, и также он должен остаться выключенным при отпускании кнопки SB2. Одновременное нажатие двух кнопок не должно ничего менять.
В отчете представить:
1.Дополненную схему предыдущего задания;
2.Схему алгоритма управления светодиодом;
3.Программу управления светодиодом.
Указания:
1. Светодиод не изменяет свое новое состояние после отпускания кнопок. Это указывает на то, что состояние светодиода должно сохраняться в некоторой переменной, которая будет играть роль его памяти. Эту роль может выполнить регистр данных самого порта PORTB. Поэтому специальной переменной для хранения состояния светодиода в данном случае не требуется;
2. Следует учесть, что одновременное нажатие или ненажатие кнопок не является причиной изменения состояния светодиода. Анализировать следует только несовпадающие состояния кнопок.
Задание 3.5. Зажигание и гашение светодиода одной кнопкой
Используя предыдущую схему, обеспечить при каждом нажатии кнопки SB1 переключение светодиода в противоположное состояние.
24
В отчете представить:
1.Схему алгоритма управления светодиодом;
2.Программу управления светодиодом.
Указания:
Алгоритм управления от кнопки может быть следующий:
1.Прочитать состояние кнопки SB1;
2.Если значение разряда равно единице (кнопка не нажата), то перейти
кначалу цикла;
3.Если значение разряда равно нулю (кнопка нажата), то изменить состояние выхода управления светодиодом на противоположное. Для переключения светодиода предварительно необходимо проверить его текущее состояние;
4.Перейти на начало цикла.
Программа из задания 4, как правило, работать правильно не может: светодиод часто мигает или устойчивое его состояние назначается хаотически.
Причина заключается в наличии в реальной схеме, так называемого, дребезга контактов
за счет упругих свойств механических элементов. Форма сигнала при этом не является простым переключением, а представляет собой серию переключений в течении 5-10 мс. Поэтому наблюдается за время нажатия многократное переключение, момент отпускания является случайным.
Логично, если для устранения этого явления после переключения светодиода следует добавить цикл ожидания отпускания кнопки (когда SB1 будет снова равен единице). Добавить в программу этот фрагмент и проверить работоспособность устройства.
Готовые функции обработки сигналов от кнопок занимают по времени (около 10 мс). Все это время основная программа простаивает, а если кнопок несколько, то пассивность работы программы управления становится просто критической.
Задание 3.6. Управление переключением светодиода от кнопки с защитой от дребезга
Разработать процедуру борьбы с дребезгом контактов, позволяющую не занимать время основного управляющего цикла.
В отчете представить:
1.Схему алгоритма управления светодиодом;
2.Программу управления светодиодом с комментариями.
25
Указания:
Поскольку отжатое (исходное) состояние кнопки соответствует высокому уровню сигнала, а нажатое соответствует нулю, то изменение состояния светодиода должно происходить по заднему фронту сигнала от кнопки. Надежная программа должна иметь защиту от дребезга кнопок и механических датчиков. Самый простой программный способ борьбы с этим явлением - введение задержек. Обнаружив первое переключение, программа должна выдержать задержку не менее времени дребезга контактов.
Поэтому обработка сигналов кнопки должна происходить с периодичностью около 2 мс и через глобальные переменные следует передавать состояние кнопки другим выполняющимся процессам. В этом случае все блоки работают последовательно и нет пустых ожиданий. Процесс обработки сигналов кнопки и управления светодиодом превращаются как бы в многозадачный процесс. В данном примере время периода для экспериментов регулируется грубым введением функции delay(2) после размещения в программе указанных блоков. В реальности это время необходимо подсчитать, исходя из количества и времени выполнения команд в теле цикла loop().
Идея одного из надежных методов борьбы с дребезгом заключается в предположении, что кнопку нельзя нажать на 0,0001 сек. Поэтому частые переключения (даже самопроизвольные) следует игнорировать, а решение принимать после окончания времени переходного процесса. Метод называют ожиданием стабильного состояния контактов.
В блоке обработки сигналов кнопки используют переменные: - флаг состояния кнопки
flagPress = true при нажатой кнопке и flagPress= false при отжатой кнопке;
- флаг нажатия кнопки (генерации заднего фронта) flagClick= true.
Для отсчета времени устойчивого состояния сигнала необходим счетчик подтверждения состояния кнопки buttonCount и константа TIME_BUTTON, задающее это время устойчивого состояния кнопки (поряд-
ка 20-30 мс).
В блоке обработки состояния кнопки происходит следующее:
-если текущее состояние кнопки соответствует флагу состояния, то ничего не делается. Только сбрасывается счетчик подтверждения состояния buttonCount;
-если состояния кнопки и флага состояния различны, то счетчик начинает считать время подтверждения. Любой возврат к равенству состояния кнопки и флага сбрасывает счетчик;
-если состояние сигнала устойчивое в течение количества циклов, определяемого константой TIME_BUTTON, то признак состояния кнопки flagPress инвертируется.
|
26 |
Программа для алгоритма блока обработки сигналов от кнопки: |
|
boolean flagPress= false; |
// по исходному кнопка не нажата |
boolean flagClick= false; // фронта также нет |
|
byte buttonCount= 0; |
|
#define TIME_BUTTON 1 |
// выдержка 1* 2 мс |
boolean ledState; |
// переменная состояния светодиода |
void setup() {
pinMode(LED_PIN, OUTPUT); // вывод светодиода на выход pinMode(BUTTON_PIN, INPUT_PULLUP); // вывод кнопки на вход
}
//бесконечный цикл с периодом 2 мс void loop() {
//блок обработки сигнала от кнопки
if ( flagPress == (! digitalRead(BUTTON_PIN)) )
{
buttonCount= 0
}
else { buttonCount++;
if ( buttonCount >= TIME_BUTTON )
{
flagPress= ! flagPress; buttonCount= 0;
if ( flagPress == true ) flagClick= true;
}
}
Расположенный ниже по тексту блок управления светодиодом при наличии флага заднего фронта изменяет состояние светодиода на противоположное и сбрасывает флаг заднего фронта:
// Блок управления светодиодом if ( flagClick == true ) { flagClick= false;
ledState= ! ledState; // инверсия состояние светодиода digitalWrite(LED_PIN, ledState);
}
delay(2); // задержка на 2 мс имитация длительности
}
27
Проверьте правильность работы программы и вставьте комментарии в исходный текст.
Задание 3.7. Управление двумя светодиодами двумя кнопками
Разработать программу по схеме предыдущих заданий с двумя кнопками. Каждая переключает свой светодиод: один по схеме, второй на плате Arduino - pin13. Использовать рассмотренные алгоритмы, но создать класс обработчиков кнопок.
См. файл КЛАССЫ.
Задание 3.8. Управление переключением мигающего светодиода
Используя исходную схему, нажатием кнопки необходимо включать и выключать мигание светодиода. Частота мигания светодиода 5 Гц (для обеспечения возможности наблюдения мигания частоту допускается изменить, но с указанием ее реального значения).
В отчете представить:
1.Схему алгоритма управления светодиодом;
2.Программу управления светодиодом с комментариями.
Алгоритм:
1.Прочитать вход от кнопки;
2.Если разряд равен нулю, включить алгоритм мигания;
3.Если разряд равен единице, выключить алгоритм мигания и выключить светодиод;
4.Перейти к началу основного цикла.
Задание 3.9. Бегущие огни
Обеспечить бегущий огонь из одного светодиода по гирлянде из восьми светодиодов. Направление движения гирлянды должно изменяться нажатием кнопки. Частота мигания светодиода 1 Гц.
Задача решается в том же порядке, как и предыдущие.
В отчете представить:
1.Схему алгоритма задачи;
2.Текст программы на заданном языке программирования (с указанием только основного блока).
28
Вопросы для самоконтроля
1.Какие адреса занимают порты ввода-вывода контроллера?
2.Какие регистры управляют портами?
3.Какие режимы можно задать портам?
4.Какова типовая программная модель порта?
5.Какие способы адресация РОН и регистров ввода-вывода AVR- микроконтроллеров существуют?
6.Какие способы адресации памяти данных AVR-микроконтроллеров используются на практике?
7.Какие используются способы адресации памяти программ AVR- микроконтроллеров?
8.Особенности выполнения арифметических и логических операций в AVR-микроконтроллерах.
9.В чем отличие команд безусловного перехода ассемблера КР580 и микроконтроллера?
10.Для чего предназначена директива .def ?
11.Назначение и использование регистров X, Y и Z.
12.Как осуществляется инициализация стека на языке ассемблера и языке С?
13.Какова структура программы на языке ассемблера и языке С.
14.Как записать на ассемблере команду или команды, эквивалентные команде присваивания на языке С?
15.Как записать на ассемблере команду или команды, эквивалентные командам цикла на языке С?
16.Просмотрите машинные коды, получающиеся после компиляции с языка С.
17.Какое состояние имеют порты регистров РОН и РВВ по умолчанию?
18.Каково назначение функции _BV()?
19.Каково назначение функции _delay() ?
20.Как адресуются выводы цифровых регистров при использовании
ARDUINO?
29
Литература
1.http://maxkit.ru Издательство Быстрый старт. Первые шаги по освоению
Arduino
2.http://arduino.cc/en/Main/Software ПО для Arduino. Официальный сайт
3.http://arduino.cc Официальный сайт Arduino
4.http://atmel.ucoz.ru AVR&Arduino
5.https://all-arduino.ruhttp://arduinokit.ru Мир электронного творчества,
хобби и увлечений
6.https://alexgyver.ru/arduino_lessons/ Видео уроки
7.http://mypractic.ru/ Оборудование, технологии, разработки. Блог технической поддержки.
8.Видеоуроки Ардуино https://www.youtube.com/watch?v=bO_jN0Lpz3Q&list=PLfDmj22jP9...
9.https://www.youtube.com/watch?v=bO_jN0Lpz3Q Видеоуроки по Arduino
#1: Первые шаги
10.https://lesson.iarduino.ru Уроки и проекты по электронике и робототехнике
11.http://arduinokit.ru/arduino/ Мир электронного творчества, хобби и увлечений
12.https://alexgyver.ru/lessons/registers/ Битовые операции
