Я пытаюсь создать прерывание с задержкой с Arduino. Я хотел бы использовать функцию interrupts (), потому что это внутреннее прерывание.
Пример: допустим, я бы хотел, чтобы индикатор включался и выключался только с учетом времени прерывания.
Пример кода есть, но он использует внешние прерывания (attachInterrupt ()). Я хотел бы продолжать использовать внутренние прерывания.
arduino
microcontroller
interrupts
Случайный
источник
источник
Ответы:
В блоге Ноа Шталя есть пример мигания светодиода с помощью Timer2 . Имея это и таблицу данных, вы должны быть в состоянии адаптировать ее к любому прерыванию, которое вы хотите использовать, то есть к прерыванию, обычная функция которого вы больше всего можете оставить или хотите изменить. Таймер 2 обычно используется для некоторых функций ШИМ.
Его пример цитирует ATmega2560; Я могу подтвердить, что он работает и с ATmega328p. Посмотрите на его сайте более полезные примеры прерываний Arduino.
Редактировать:
Вот моя слегка отредактированная - в основном в комментариях - версия кода Ноя. Вызовите Timer2init () из функции setup () Arduino после инициализации любых связанных структур данных или оборудования, потому что синхронизация - и прерывание - начнутся, как только вы это сделаете.
Например, я использовал его для мультиплексирования 3-значного 7-сегментного дисплея, поэтому перед инициализацией таймера я инициализировал регистры ввода-вывода дисплея и отключил данные дисплея в том месте, где его будет искать ISR.
В комментариях есть таблица некоторых полезных временных данных из таблицы данных и мои собственные расчеты для справки, чтобы установить другую временную схему.
Макрос ISR () заботится о создании кода входа и выхода прерывания для ISR вместо нормального входа и выхода функции и связывания его с соответствующим вектором прерывания. Остальная часть этой функции: 1) код, который будет запускаться при каждом прерывании, и 2) кодовый код для сброса таймера для следующего прерывания.
Как написано, это должно быть в виде эскиза .pde или .ino (или файла .cpp, если вы используете eclipse, f / ex). Эскиз должен #define LEDPIN, а setup () должен вызвать Timer2init (). Функция цикла может быть пустой или нет; светодиод должен начать мигать при загрузке (ну, буквально, после вызова Timer2init ()).
источник
attachInterrupt () на самом деле прикрепляет прерывание к внешнему изменению состояния на выводе, у него нет никаких других опций.
На же странице параметры режима перечислены как:
Извините, что несу плохие новости, это одна из первых вещей, которые я тоже искал.
источник
Эта статья о ШИМ прояснит многие ваши сомнения относительно использования таймеров Arduino. На Arduino есть два 8-битных таймера и один 16-битный таймер. Не существует высокоуровневого API для подключения функции ISR непосредственно к таймерам, который поставляется с Arduino SDK (то есть в качестве стандартной библиотеки), но есть несколько более низкоуровневый метод установки Special-Function-Registers и bit-arithmetic / операции на них. Однако есть пользовательская библиотека под названием Timer one .
источник
Arduino использует все три таймера в ATMega328.
Timer1
(16 бит) используется для таких функций, какdelay()
иmillis()
для вывода ШИМ на контактах 5 и 6. Два других таймера -Timer0
иTimer2
используются для вывода ШИМ на контактах 3, 9, 10, 11.Таким образом, нет функции Arduino для прерывания по таймеру. Но есть способ. Вы можете использовать этот код для включения прерывания по таймеру
Timer2
:Я написал этот код без тестирования, поэтому, возможно, я ошибся. В этом случае проверьте таблицу данных, стр.156 .
Если вы хотите изменить частоту таймера (прескалер), просто измените регистр
TCCR2A
. Для получения дополнительной информации обратитесь к странице технических данных 153. Но если вы измените частоту таймера, вы также измените частоту ШИМ-сигнала на двух выходных контактах!источник
Timer0
иTimer2
8 бит и толькоTimer1
16 бит.