Arduino:Примеры/CurieTimer1Interrupt

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску

Перевод: Максим Кузьмин (Cubewriter) Контакты:</br>* Skype: cubewriter</br>* E-mail: cubewriter@gmail.com</br>* Максим Кузьмин на freelance.ru
Проверка/Оформление/Редактирование: Мякишев Е.А.


Моргание светодиодом с разной частотой[1]

Этот пример показывает, как использовать один из таймеров, имеющихся у микроконтроллера Arduino или Genuino 101. Речь о таймере-1 (Timer 1), для работы с которым есть специальная библиотека Curie Timer One. Прерывания в данном примере будут использоваться, чтобы временно выйти из функции delay(), останавливающей выполнение кода, переключить светодиод, а затем снова вернуться к delay(). В результате первые 10 секунд светодиод будет мигать с одной частотой, вторые – с другой и т.д. (всего будет 4 разных частоты).

Необходимое оборудование

  • Arduino или Genuino 101

Цепь

Genuino101fzz.jpg

Никакого дополнительного оборудования для этого примера не нужно.

Наиболее важные части скетча

Библиотека 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);   // перезапускаем таймер
  }
}

См.также

  1. Curie Timer One PWM

Внешние ссылки