Arduino:Примеры/CurieTimer1Interrupt
Содержание | Знакомство с Arduino | Продукты | Основы | Справочник языка Arduino | Примеры | Библиотеки | Хакинг | Изменения | Сравнение языков Arduino и Processing |
Моргание светодиодом с разной частотой[1]
Этот пример показывает, как использовать один из таймеров, имеющихся у микроконтроллера Arduino или Genuino 101. Речь о таймере-1 (Timer 1), для работы с которым есть специальная библиотека Curie Timer One. Прерывания в данном примере будут использоваться, чтобы временно выйти из функции delay(), останавливающей выполнение кода, переключить светодиод, а затем снова вернуться к delay(). В результате первые 10 секунд светодиод будет мигать с одной частотой, вторые – с другой и т.д. (всего будет 4 разных частоты).
Необходимое оборудование
- Arduino или Genuino 101
Цепь

Никакого дополнительного оборудования для этого примера не нужно.
Наиболее важные части скетча
Библиотека CurieTimerOne.h, предоставляющая доступ к таймеру-1 микроконтроллера. Она позволяет настраивать количество микросекунд, которые счетчик будет отсчитывать перед тем, как запустить прерывание. Прерывание можно настроить, чтобы вместе с ним запускалась функция внешнего вызова. Кроме того, каждое новое прерывание увеличивает счетчик прерываний. Эта же библиотека используется для генерации ШИМ-сигнала, причем продолжительность рабочего цикла и частоту пользователь может задать сам.
Функция timedBlinkIsr(), вызываемая при запуске прерывания. Она переключает состояние светодиода на 13-ом контакте при помощи переменной toggle – значение в ней меняется с каждым новым вызовом при помощи оператора «!» (отрицание).
Код
Этот скетч поддерживает отображение логов в мониторе порта. Ее можно включить, раскомментировав строчку
#define SERIAL_PORT_LOG_ENABLE 1.
/*
Скетч: Timer1Interrupt.ino
Этот скетч демонстрирует использование библиотеки Curie Timer One.
Он использует таймер-1, чтобы инициировать моргание светодиода
на 13-ом контакте с четырьмя разными интервалами (частотой).
Информацию о частоте мигания и количестве прерываний, посчитанных
за 10 секунд, можно наблюдать через монитор порта, но для этого
нужно включить запись логов. Кроме того, чтобы перепрограммировать
плату, может потребоваться MASTER_RESET.
Моргание светодиода запустится, только если открыть монитор порта.
Впрочем, если строчка "#define SERIAL_PORT_LOG_ENABLE 1"
закомментирована, то моргание должно запуститься само собой. Если вы
все же решили использовать запись логов, то не забудьте также
раскомментировать "CurieTimerOne.restart(time);" в самом низу скетча
Создан компанией Intel,
модифицирован 14 марта 2016 года Симоне Маджоччи (Simone Majocchi)
Этот код не защищен авторским правом.
*/
#include "CurieTimerOne.h"
// если вы хотите отключить ведение логов в мониторе порта, оставьте
// эту строчку закомментированной:
#define SERIAL_PORT_LOG_ENABLE 1
const int oneSecInUsec = 1000000; // одна секунда, выраженная в микросекундах
bool toggle = 0; // переменная для переключения светодиода
int time; // переменная для настройки таймера
void timedBlinkIsr() // функция, вызываемая при запуске прерывания
{
digitalWrite(13, toggle);
toggle = !toggle; // используем оператор «!» (отрицание) для инвертирования значения в переменной toggle
}
void setup() {
#ifdef SERIAL_PORT_LOG_ENABLE
Serial.begin(115200);
while (!Serial); // ждем открытия монитора порта
#endif
// выставляем светодиод на 13-ом контакте в положение OUTPUT:
pinMode(13, OUTPUT);
}
void loop() {
for (int i = 1; i < 9; i = i * 2) {
// настраиваем период мигания светодиода на 1000000, 500000, 250000 и 125000 микросекунд
time = oneSecInUsec / i; // здесь задаем частоту, деля секунду на i
CurieTimerOne.start(time, &timedBlinkIsr); // выставляем таймер и функцию внешнего вызова
#ifdef SERIAL_PORT_LOG_ENABLE
Serial.print("The blink period: "); // "Период мигания: "
Serial.println(time);
#endif
delay(10000); // 10-секундная задержка, постоянно приостанавливаемая прерываниями таймера
#ifdef SERIAL_PORT_LOG_ENABLE
Serial.print("Total number of ticks in 10 seconds: "); // "Общее количество тиков за 10 секунд: "
Serial.println(CurieTimerOne.rdRstTickCount()); // считываем и сбрасываем счетчик
Serial.println("----");
#endif
// если вы хотите отключить ведение логов в мониторе порта, оставьте
// эту строчку закомментированной:
// CurieTimerOne.restart(time); // перезапускаем таймер
}
}
См.также
- Curie Timer One PWM
Внешние ссылки
развернутьПартнерские ресурсы |
---|
развернутьСправочник языка Arduino |
---|
развернутьБиблиотеки Arduino |
---|
развернутьArduino продукты |
---|
развернутьПримеры Arduino |
---|
- Страницы, использующие повторяющиеся аргументы в вызовах шаблонов
- Справочник языка Arduino
- Arduino
- Перевод от Сubewriter
- Проверка:myagkij
- Оформление:myagkij
- Редактирование:myagkij
- Страницы, где используется шаблон "Навигационная таблица/Телепорт"
- Страницы с телепортом
- Пример
- Примеры
- Пример программирования Arduino
- Примеры программирования Arduino