Cat hungry.png
Здравствуйте! Собираем деньги на перевод материалов по электронике(https://www.allaboutcircuits.com/education/). Реквизиты указаны здесь.

Arduino:Примеры/CurieTimer1Interrupt

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

Перевод: Максим Кузьмин (Cubewriter)
Перевел 2686 статей для сайта.

Контакты:

Проверка/Оформление/Редактирование: Мякишев Е.А.


Моргание светодиодом с разной частотой[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.


  1. /*
  2.   Скетч: Timer1Interrupt.ino
  3.  
  4.   Этот скетч демонстрирует использование библиотеки Curie Timer One.
  5.   Он использует таймер-1, чтобы инициировать моргание светодиода
  6.   на 13-ом контакте с четырьмя разными интервалами (частотой).
  7.  
  8.   Информацию о частоте мигания и количестве прерываний, посчитанных
  9.   за 10 секунд, можно наблюдать через монитор порта, но для этого
  10.   нужно включить запись логов. Кроме того, чтобы перепрограммировать
  11.   плату, может потребоваться MASTER_RESET.
  12.  
  13.   Моргание светодиода запустится, только если открыть монитор порта.
  14.   Впрочем, если строчка "#define SERIAL_PORT_LOG_ENABLE 1"
  15.   закомментирована, то моргание должно запуститься само собой. Если вы
  16.   все же решили использовать запись логов, то не забудьте также
  17.   раскомментировать "CurieTimerOne.restart(time);" в самом низу скетча
  18.  
  19.   Создан компанией Intel,
  20.   модифицирован 14 марта 2016 года Симоне Маджоччи (Simone Majocchi)
  21.  
  22.   Этот код не защищен авторским правом.
  23. */
  24.  
  25. #include "CurieTimerOne.h"
  26.  
  27. // если вы хотите отключить ведение логов в мониторе порта, оставьте
  28. // эту строчку закомментированной:
  29. #define SERIAL_PORT_LOG_ENABLE 1
  30.  
  31. const int oneSecInUsec = 1000000;   // одна секунда, выраженная в микросекундах
  32. bool toggle = 0;                    // переменная для переключения светодиода
  33. int time;                           // переменная для настройки таймера
  34.  
  35. void timedBlinkIsr()   // функция, вызываемая при запуске прерывания
  36. {
  37.   digitalWrite(13, toggle);
  38.   toggle = !toggle;  // используем оператор «!» (отрицание) для инвертирования значения в переменной toggle
  39. }
  40.  
  41. void setup() {
  42.  
  43. #ifdef SERIAL_PORT_LOG_ENABLE
  44.   Serial.begin(115200);
  45.   while (!Serial);  //  ждем открытия монитора порта
  46. #endif
  47.  
  48.   // выставляем светодиод на 13-ом контакте в положение OUTPUT:
  49.   pinMode(13, OUTPUT);
  50. }
  51.  
  52. void loop() {
  53.  
  54.   for (int i = 1; i < 9; i = i * 2) {
  55.     // настраиваем период мигания светодиода на 1000000, 500000, 250000 и 125000 микросекунд
  56.     time = oneSecInUsec / i; // здесь задаем частоту, деля секунду на i
  57.     CurieTimerOne.start(time, &timedBlinkIsr);  // выставляем таймер и функцию внешнего вызова
  58.  
  59. #ifdef SERIAL_PORT_LOG_ENABLE
  60.     Serial.print("The blink period: ");  //  "Период мигания: "
  61.     Serial.println(time);
  62. #endif
  63.  
  64.     delay(10000);  // 10-секундная задержка, постоянно приостанавливаемая прерываниями таймера
  65.  
  66. #ifdef SERIAL_PORT_LOG_ENABLE
  67.     Serial.print("Total number of ticks in 10 seconds: ");  //  "Общее количество тиков за 10 секунд: "
  68.     Serial.println(CurieTimerOne.rdRstTickCount());  // считываем и сбрасываем счетчик
  69.     Serial.println("----");
  70. #endif
  71. // если вы хотите отключить ведение логов в мониторе порта, оставьте
  72. // эту строчку закомментированной:
  73.     // CurieTimerOne.restart(time);   // перезапускаем таймер
  74.   }
  75. }

См.также

  1. Curie Timer One PWM

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

  1. Arduino.cc - CurieTimer1Interrupt