Как переопределить переполнение прерываний сравнения в программировании Arduino?
Если я программирую прерывание смены контакта, я могу вызывать attachInterrupt в различных точках своего кода и менять, какая функция вызывается при возникновении прерывания.
Вызовы прерывания переполнения и сравнения A/B определяются макросом ISR, который оценивается во время компиляции, поэтому его нельзя изменить во время выполнения. Одним из решений было бы сделать эту функцию состоящей из одной строки, которая вызывает указатель на функцию. Если я правильно читаю код, вот как реализован attachInterrupt. Если не считать возни с таблицей векторов прерываний (что кажется плохой идеей или, по крайней мере, очень сложной для отладки, если вы ее испортите), есть ли другой способ переопределить переполнение или сравнить функции прерывания?
@Llaves, 👍0
Обсуждение1 ответ
Как насчет использования оператора switch
внутри функции ISR и перенаправления потока в зависимости от значения глобальной переменной, используемой в коммутаторе?
uint8_t status = 0;
void myInterruptFn() {
switch(status) {
case 0:
// сделай что-нибудь
status = 1;
break;
case 1:
// сделать что-то еще
status = 0;
break;
}
}
- Как использовать прерывание в Arduino для получения данных с последовательного входа
- Внешние прерывания Esp32 иногда отсутствуют
- Как реализовать детектор brown out arduino ESP32?
- Запуск функции аппаратного прерывания на NodeMCU ESP8266, исключение (0) после четырех итераций, невозможно отключить функцию прерывания
- Светодиод не мигает - Arduino UNO+WiFi R3 ATmega328P+Плата ESP8266
- Серводвигатель не будет работать для определенного кода
- C++ против языка Arduino?
- avrdude ser_open() can't set com-state
Для arduino uno с микроконтроллером семейства avr? У них есть таблица векторов в коде (во флеше), вы не можете изменить эту среду выполнения. Вы можете сделать так, чтобы каждый вектор таблицы векторов указывал на ram, который вы могли бы изменить во время выполнения, но это было бы то же самое, что иметь ISR, который вызывает указатель на функцию. Это неплохая идея, если она ясна и хорошо определена, это нормальный способ изменить функцию прерывания. Для прерывания смены контакта я предлагаю EnableInterrupt: https://github.com/GreyGnome/EnableInterrupt, @Jot
вызвать attachInterrupt в разных точках моего кода
..... вы можете установить глобальную переменную в разных точках вашего кода...... ISR выполнит функцию, зависящую от значения глобальной переменной, @jsotola