Осталось написать код функции обработки прерывания swap() и добавить его к основной программе. После подключения прерывания и написания кода функции обработки прерывания вы можете писать остальной текст программы. Каждый раз при вызове прерывания основная программа приостанавливается, выполняется функция обработки прерывания, затем ход основной программы продолжается с того места, где она была прервана. Поскольку прерывание останавливает основную программу, его обработка должна быть очень короткой и не содержать задержки delay(). Теперь все готово для написания программы управления яркостью RGB-светодиода и переключения цвета по нажатию кнопки. Полный текст программы приведен в листинге 12.1.
Листинг 12.1. Аппаратные прерывания, реализующие многозадачность - hw_multitask.ino
// кнопка с аппаратной противодребезговой защитой,
// управляемая прерыванием
// Контакт кнопки
const int BUTTON_INT =0; // Прерывание 0 (вывод 2 для Uno)
const int RED=11;
// Красный вывод RGB-светодиода контакт 11
const int GREEN=10;
// Зеленый вывод RGB-светодиода контакт 10
const int BLUE=9;
// Синий вывод RGB-светодиода контакт 9
- 263 -
// Переменные volatile можно изменять внутри функции обработки прерывания
volatile int selectedLED = RED;
void setup()
{
pinMode (RED, OUTPUT);
pinMode (GREEN, OUTPUT);
pinMode (BLUE, OUTPUT);
// Режим прерывания RISING (переход с LOW на HIGH)
attachInterrupt(BUTTON_INT, swap, RISING);
}
void swap()
{
// Выключить текущий цвет
analogWrite(selectedLED, 0);
// Новое значение для переменной selectedLED
if (selectedLED == GREEN)
selectedLED = RED;
else if (selectedLED == RED)
selectedLED = BLUE;
else if (selectedLED == BLUE)
selectedLED = GREEN;
}
void loop()
{
for (int i = 0; i<256; i++)
{
analogWrite(selectedLED, i);
delay(10);
}
for (int i = 255; i>= 0; i--)
{
analogWrite(selectedLED, i);
delay(10);
}
}
Загрузите программу на плату Arduino, вы увидите изменение яркости одного из цветов (R, G или В) RGB-светодиода от нуля до максимума и обратно. Каждый раз при нажатии на кнопку выбирается следующий цвет с той же яркостью, что и предыдущий.
ПРИМЕЧАНИЕ
Посмотреть видеоурок, демонстрирующий пример аппаратного прерывания Arduino для кнопки без дребезга, можно на странице http://www.exploringarduino.com/content/ch12. Этот видеофайл доступен также на сайте издательства Wiley.
- 264 -
Аппаратные прерывания - не единственный вид прерываний, который возможен для Arduino. Существуют также прерывания по таймеру. В контроллере ATmega328 (установленном на Arduino Uno) есть три аппаратных таймера. На самом деле Arduino по умолчанию использует эти таймеры для функции millis(), работы с delay() и для включения ШИМ при вызове analogWrite(). Хотя в языке программирования Arduino отсутствуют специальные конструкции для работы с таймерами, управляя таймерами вручную, можно генерировать произвольные ШИМ-сигналы на любом контакте и делать многое другое. Далее мы расскажем, как с помощью сторонних библиотек (библиотека TimerOne) управлять 16-разрядным таймером Timer1 в ATmega328. Подобные библиотеки есть и для плат Leonardo, но здесь опишем только работу с Arduino Uno.
ПРИМЕЧАНИЕ
Таймер Timer1 служит для включения ШИМ-сигнала на выводах 9 и 10, поэтому при работе с библиотекой TimerOne выполнить функцию analogWrite() для этих контактов не удастся.
Так же, как секундомер в ваших часах, таймеры в Arduino начинают отсчет с нуля, увеличивая значение с каждым тактом кварцевого резонатора. Timer1 16-разрядный таймер, следовательно, значения в нем меняются от 0 до 216 - 1 (или 65 535). Как только это число будет достигнуто, значения сбрасываются в 0 и отсчет начинается снова. Время, через которое таймер достигает максимального значения, зависит от делителя частоты. Поскольку тактовая частота равна 16 МГц, то при отсутствии делителя переполнение и сброс Timer1 произойдет много раз в секунду. Библиотека TimerOne берет на себя все нюансы работы с таймером и позволяет установить любой интервал времени в микросекундах для срабатывания прерывания по таймеру.
Для начала загрузите библиотеку TimerOne либо со страницы сайта Wiley для этой главы, либо непосредственно со страницы https://code.google.com/p/arduinotimerone/downloads. Распакуйте архив в папку с названием TimerOne и скопируйте в папку библиотек Arduino. Размещение этой папки по умолчанию отличается для разных операционных систем:
• Windows - Documents/ Arduino/libraries;
• Mac - Documents/ Arduino/libraries;
• Linux - /homeNOUR USER NAME/sketchbook/libraries.
Если в момент распаковки архива и копирования папки TimerOne среда Arduino IDE была открыта, перезапустите ее и убедитесь, что библиотека загрузилась.
Теперь все готово для работы с Timer1 на Arduino.
- 265 -
Вильям Л Саймон , Вильям Саймон , Наталья Владимировна Макеева , Нора Робертс , Юрий Викторович Щербатых
Зарубежная компьютерная, околокомпьютерная литература / ОС и Сети, интернет / Короткие любовные романы / Психология / Прочая справочная литература / Образование и наука / Книги по IT / Словари и Энциклопедии