Включить и отключить отдельные прерывания
Я работаю над прерываниями по таймеру и внешними прерываниями. для внешних прерываний я понял функции типа attachInterrupt. detachinterrupt для отдельных прерываний, noInterrupts() и interrupts() можно использовать для одновременного включения и отключения всех прерываний.
Но как включить и отключить прерывания таймера??
Я пишу код для будильника и кнопки повтора. Итак, что я хочу, это 1) всякий раз, когда время будильника равно времени просмотра, запустите таймер на 5 минут и прозвучит зуммер. 2) всякий раз, когда я нажимаю кнопку повтора, запускается другой таймер, и через 30 секунд раздается звуковой сигнал. снова нажимаю повтор и снова запускается таймер и через 30 секунд гудит зуммер. 3) Но через 5 минут первого таймера оба прерывания таймера отключаются, так как теперь мне не нужен зуммер.
Я знаю, как инициализировать таймер в функции настройки, и я получаю гудки каждые 30 секунд. Я также знаю, что прерывания будут поступать в соответствии со значением таймера, и мне нужно вызвать функцию после фиксированного количества отсчетов, или 30 секунд, или 5 минут.
Но я не знаю, как отключать и включать прерывания таймера везде, где я хочу в коде.
@muphy, 👍0
Обсуждение1 ответ
- Шаг 1. Прочтите техническое описание чипа.
- Шаг 2. Найдите регистры, управляющие таймерами и их прерываниями.
- Шаг 3. Установите или очистите соответствующие биты в этих регистрах.
Например, ATMega328P имеет TIMSK1
регистр для Таймера 1, который имеет три бита, относящиеся к прерываниям:
- Бит 2 — OCIE1B: Таймер/Счетчик 1, разрешение прерывания совпадения выхода сравнения B
Когда этот бит записывается в единицу, а I-флаг в регистре состояния установлен (прерывания доступны глобально), Таймер/Счетчик1 разрешено прерывание совпадения выходного сравнения B. Соответствующий вектор прерывания (см. Раздел 11. «Прерывания» на стр. 49) выполняется, когда установлен флаг OCF1B, расположенный в TIFR1.
- Бит 1 — OCIE1A: Таймер/Счетчик 1, разрешение прерывания сравнения выхода и совпадения
Когда этот бит записывается в единицу, а I-флаг в регистре состояния установлен (прерывания доступны глобально), Таймер/Счетчик1 сравнение выхода Разрешено прерывание совпадения. Соответствующий вектор прерывания (см. Раздел 11. «Прерывания» на стр. 49) выполняется, когда установлен флаг OCF1A, расположенный в TIFR1.
- Бит 0 — TOIE1: таймер/счетчик 1, разрешение прерывания от переполнения
Когда этот бит записывается в единицу, а I-флаг в регистре состояния установлен (прерывания доступны глобально), Таймер/Счетчик1 прерывание переполнения разрешено. Соответствующий вектор прерывания (см. Раздел 11. «Прерывания» на стр. 49) выполняется, когда установлен флаг TOV1, расположенный в TIFR1.
Итак, чтобы отключить прерывание сравнения B Match, вы можете использовать:
TIMSK1 &= ~(1 << 2);
И чтобы включить его снова:
TIMSK1 |= (1 << 2);
И Таймер 0, и Таймер 2 имеют регистр TIMSKx
, который работает одинаково.
- Arduino непрерывно считывает значение АЦП с помощью прерывания
- 4-битный счетчик вверх и вниз
- Измерить количество циклов и время цифрового входа
- Проблема прерывания библиотеки MPU6050 Arduino Jeff Rowberg
- генерировать два сдвинутых по фазе ШИМ-импульса, запускаемых внешним сигналом с частотным разделением, с помощью Arduino uno?
- Включение прерывания Timer1 CompareA мгновенно вызывает прерывание?
- Таймер Arduino в режиме ctc 4 против 14
- Прерывания TIMER1 CTC не работают с avr-gcc
Почему вы используете прерывания таймера для этого? Программный таймер (основанный на
millis()
) кажется более подходящим, так как вы не можете запрограммировать аппаратный таймер так, чтобы он срабатывал более чем на 4,2 секунды в будущем., @Edgar BonetБольшое спасибо, я только что прочитал о millis() и думаю, что это будет более полезно. Я постараюсь сделать свой проект с использованием миллиса и дам вам знать., @muphy