Читаем Изучаем Arduino: инструменты и методы технического волшебства полностью

Осталось написать код функции обработки прерывания 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 -

<p>12.4. Прерывания по таймеру</p>

Аппаратные прерывания - не единственный вид прерываний, который возможен для Arduino. Существуют также прерывания по таймеру. В контроллере ATmega328 (установленном на Arduino Uno) есть три аппаратных таймера. На самом деле Arduino по умолчанию использует эти таймеры для функции millis(), работы с delay() и для включения ШИМ при вызове analogWrite(). Хотя в языке программирования Arduino отсутствуют специальные конструкции для работы с таймерами, управляя таймерами вручную, можно генерировать произвольные ШИМ-сигналы на любом контакте и делать многое другое. Далее мы расскажем, как с помощью сторонних библиотек (библиотека TimerOne) управлять 16-разрядным таймером Timer1 в ATmega328. Подобные библиотеки есть и для плат Leonardo, но здесь опишем только работу с Arduino Uno.

ПРИМЕЧАНИЕ

Таймер Timer1 служит для включения ШИМ-сигнала на выводах 9 и 10, поэтому при работе с библиотекой TimerOne выполнить функцию analogWrite() для этих контактов не удастся.

12.4.1. Общие сведения о прерываниях по таймеру

Так же, как секундомер в ваших часах, таймеры в Arduino начинают отсчет с нуля, увеличивая значение с каждым тактом кварцевого резонатора. Timer1 16-разрядный таймер, следовательно, значения в нем меняются от 0 до 216 - 1 (или 65 535). Как только это число будет достигнуто, значения сбрасываются в 0 и отсчет начинается снова. Время, через которое таймер достигает максимального значения, зависит от делителя частоты. Поскольку тактовая частота равна 16 МГц, то при отсутствии делителя переполнение и сброс Timer1 произойдет много раз в секунду. Библиотека TimerOne берет на себя все нюансы работы с таймером и позволяет установить любой интервал времени в микросекундах для срабатывания прерывания по таймеру.

12.4.2. Установка библиотеки

Для начала загрузите библиотеку 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 -

12.4.3. Одновременное выполнение двух задач
Перейти на страницу:

Похожие книги