Включить и отключить отдельные прерывания

Я работаю над прерываниями по таймеру и внешними прерываниями. для внешних прерываний я понял функции типа attachInterrupt. detachinterrupt для отдельных прерываний, noInterrupts() и interrupts() можно использовать для одновременного включения и отключения всех прерываний.

Но как включить и отключить прерывания таймера??

Я пишу код для будильника и кнопки повтора. Итак, что я хочу, это 1) всякий раз, когда время будильника равно времени просмотра, запустите таймер на 5 минут и прозвучит зуммер. 2) всякий раз, когда я нажимаю кнопку повтора, запускается другой таймер, и через 30 секунд раздается звуковой сигнал. снова нажимаю повтор и снова запускается таймер и через 30 секунд гудит зуммер. 3) Но через 5 минут первого таймера оба прерывания таймера отключаются, так как теперь мне не нужен зуммер.

Я знаю, как инициализировать таймер в функции настройки, и я получаю гудки каждые 30 секунд. Я также знаю, что прерывания будут поступать в соответствии со значением таймера, и мне нужно вызвать функцию после фиксированного количества отсчетов, или 30 секунд, или 5 минут.

Но я не знаю, как отключать и включать прерывания таймера везде, где я хочу в коде.

, 👍0

Обсуждение

Почему вы используете прерывания таймера для этого? Программный таймер (основанный на millis()) кажется более подходящим, так как вы не можете запрограммировать аппаратный таймер так, чтобы он срабатывал более чем на 4,2 секунды в будущем., @Edgar Bonet

Большое спасибо, я только что прочитал о millis() и думаю, что это будет более полезно. Я постараюсь сделать свой проект с использованием миллиса и дам вам знать., @muphy


1 ответ


4
  • Шаг 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, который работает одинаково.

,