Timer2 и INT1 в Arduino UNO

В моем проекте вывод 3 Arduino UNO является внешним прерыванием (INT1), и в то же время я должен запустить Timer2. INT1 не работает При запуске Timer2. Timer2 запускается так же, как таймер. Это моя ошибка или это логично?

Я подключаю ключ к контакту 3 в качестве внешнего прерывания, а также запускаю таймер. Каждый раз, когда INT1 на выводе 3 обнаруживает, что вызывается кнопка с восходящим краем_isr (). но из-за запуска timer2 функция Button_ISR() не вызывается.

Это мой код:

int buttonPin = 3;
void setup()
{
  pinMode(buttonPin, INPUT);
  attachInterrupt(digitalPinToInterrupt(3), button_ISR, RISING);
  Serial.begin(9600);
  TCCR2B = 0x07; // тактовая частота / 1024
  //OCR2B = 0x00;  // Сравнение выходных данных
  TCNT2 = 0;     //  Установите счетчик 2 равным нулю
  TIMSK2 = 0x01; // Включить прерывание переполнения

}

void loop()
{

}


void button_ISR()
{
  Serial.print("button_ISR()");
  Serial.print("\n");
}

, 👍3

Обсуждение

А если вы отключите настройку таймера, код кнопки будет работать правильно? контакт OC2B здесь не должен иметь значения, так как вы отключаете режим сравнения выходных данных. Таким образом, оборудование таймера не подключено к оборудованию контакта, @chrisl

Можете ли вы вставить немного отладочного кода в цикл, чтобы убедиться, что вывод 3 работает на высоком уровне?, @Cary H

вы включили прерывание переполнения. ты справился с этим?, @ArduinoFan


1 ответ


Лучший ответ:

4

Вот мои 2 цента:

В вашем коде отсутствует обработчик таймера. Вы включили прерывание переполнения таймера, но у вас есть ISR, готовый к этому. Таким образом, элемент управления в конечном итоге достигает необработанного прерывания ISR, которое является перезапуском

Arduino все время перезагружается.

Добавление одной строки должно временно исправить это.

ISR(TIMER2_OVF_vect) {}

Вот обновленный код. Я вижу, что код теперь запущен (по крайней мере, не перезапускается).

https://wokwi.com/arduino/projects/307835582788141632

    int buttonPin = 3;
    void setup()
    {
      pinMode(buttonPin, INPUT_PULLUP);
      Serial.begin(9600);
      Serial.println("ready!");
      TCCR2B = 0x07; // тактовая частота / 1024
      //OCR2B = 0x00;  // Сравнение выходных данных
      TCNT2 = 0;     // Установить счетчик 2 равным нулю
      TIMSK2 = 0x01; // Включить прерывание переполнения
      attachInterrupt(digitalPinToInterrupt(3), button_ISR, RISING);
    
    
    }
    
    void loop()
    {
    
    }

void button_ISR()
{
  Serial.print("button_ISR()");
  Serial.print("\n");
}

ISR(TIMER2_OVF_vect) {}

Вот код разборки, найденный в симуляторе Arduino Wokwi для вашего скетча

и если вы видите местоположение 0xf6:

вы увидите, что код выполняет мягкий сброс ( JMP 0). Я надеюсь, что это будет полезно для вас. Пожалуйста, не стесняйтесь спрашивать, если у вас есть какие-либо вопросы.

,

Я только что изменил конфигурацию коммутатора на активный НИЗКИЙ, но это не должно иметь значения., @ArduinoFan