Как переопределить переполнение прерываний сравнения в программировании Arduino?

Если я программирую прерывание смены контакта, я могу вызывать attachInterrupt в различных точках своего кода и менять, какая функция вызывается при возникновении прерывания.

Вызовы прерывания переполнения и сравнения A/B определяются макросом ISR, который оценивается во время компиляции, поэтому его нельзя изменить во время выполнения. Одним из решений было бы сделать эту функцию состоящей из одной строки, которая вызывает указатель на функцию. Если я правильно читаю код, вот как реализован attachInterrupt. Если не считать возни с таблицей векторов прерываний (что кажется плохой идеей или, по крайней мере, очень сложной для отладки, если вы ее испортите), есть ли другой способ переопределить переполнение или сравнить функции прерывания?

, 👍0

Обсуждение

Для arduino uno с микроконтроллером семейства avr? У них есть таблица векторов в коде (во флеше), вы не можете изменить эту среду выполнения. Вы можете сделать так, чтобы каждый вектор таблицы векторов указывал на ram, который вы могли бы изменить во время выполнения, но это было бы то же самое, что иметь ISR, который вызывает указатель на функцию. Это неплохая идея, если она ясна и хорошо определена, это нормальный способ изменить функцию прерывания. Для прерывания смены контакта я предлагаю EnableInterrupt: https://github.com/GreyGnome/EnableInterrupt, @Jot

вызвать attachInterrupt в разных точках моего кода..... вы можете установить глобальную переменную в разных точках вашего кода...... ISR выполнит функцию, зависящую от значения глобальной переменной, @jsotola


1 ответ


1

Как насчет использования оператора switch внутри функции ISR и перенаправления потока в зависимости от значения глобальной переменной, используемой в коммутаторе?

uint8_t status = 0;

void myInterruptFn() {
  switch(status) {
    case 0:
      // сделай что-нибудь
      status = 1;
      break;
    case 1:
       // сделать что-то еще
       status = 0;
       break;
   }
}
,