Почему мой код прерывания не работает?
Фон
Я пытаюсь написать код для чтения сигналов с шестиканального RC-приемника на Arduino Mega 2560. В настоящее время я сохраняю код для чтения только одного канала, чтобы упростить устранение неполадок. Проблема в том, что моя общая переменная не обновляется, что наводит меня на мысль, что моя процедура обработки прерываний не обнаруживает никаких нарастающих фронтов.
Я думал, что мой приемник сломался, поэтому я проверил его, используя стандартную функцию прерывания присоединения Arduino. Она отлично сработала, так что мой приемник в порядке.
Я использовал Serial.print(), чтобы проверить, обновляется ли моя переменная volatile channel (то есть, изменяется ли ее значение на значение флага канала 1). Она не обновлялась, поэтому моя ISR должна быть неправильной. Вы можете найти исходный код в сообщении в блоге.
Что случилось? У меня нет идей.
#include <PinChangeInt.h>
//Назначение выводов
#define channel1PIN 10
//Битовые флаги
#define Channel1FLAG 1
//Держатель флага
volatile uint8_t bFLAGUPDATESHARED;
//Общие переменные: Доступ к ним осуществляется процедурой обработки прерываний и чтение в «пустом цикле».
volatile uint16_t unCHANNEL1SHARED;
//Переменные времени начала: они используются для установки времени начала нарастающего фронта
// импульс. Доступ к ним возможен только через ISR, поэтому они являются беззнаковыми целыми числами и
//не летучие вещества.
uint32_t ulCHANNEL1START;
void setup()
{
Serial.begin(9600);
Serial.print("RC Channel PWM Read Interrupt Test");
//Функция библиотеки PinChangInt. Используется для установки прерываний присоединения.
PCintPort::attachInterrupt(channel1PIN, calcCHANNEL1, CHANGE);
}
void loop()
{
//Внутрицикловые переменные для хранения локальных копий входов каналов.
//Это статическое значение, поэтому оно сохраняет значения между циклами вызовов.
static uint16_t unCHANNEL1IN;
//Внутрицикловая копия держателя изменчивого флага bSHAREDFLAGUPDATE
static uint8_t bFLAGUPDATELOCAL;
//Проверьте, получили ли какие-либо каналы сигналы. Если да, скопируйте
//общие переменные в локальные переменные цикла.
if (bFLAGUPDATESHARED)
{
//Отключить прерывания при копировании общих переменных в локальные переменные
noInterrupts();
bFLAGUPDATELOCAL = bFLAGUPDATESHARED;
if (bFLAGUPDATELOCAL & Channel1FLAG)
{
unCHANNEL1IN = unCHANNEL1SHARED;
}
bFLAGUPDATESHARED = 0;
interrupts();
}
Serial.println(unCHANNEL1IN);
//Очистить локальные флаги обновления, поскольку все значения были скопированы в локальные переменные
bFLAGUPDATELOCAL = 0;
}
void calcCHANNEL1()
{
if (digitalRead(channel1PIN) == HIGH)
{
//Если вывод становится высоким, запускаем таймер и устанавливаем ulCHANNEL1START на запуск таймера
ulCHANNEL1START = micros();
}
else
{
//Если он не растет, значит, он падает, поэтому устанавливаем общий
//переменная для текущего времени-время начала
unCHANNEL1SHARED = (uint16_t)(micros() - ulCHANNEL1START);
// Сообщаем, что канал 1 получил сигнал
bFLAGUPDATESHARED |= Channel1FLAG;
}
}
@Ozymandias, 👍2
0
- Мега: присоединение Interrupt на выводе 18/19/20/21 не работает
- Управление скоростью вентилятора с помощью библиотеки Arduino PID
- Выводы прерываний Arduino Mega 2560 и отображение портов с помощью поворотного энкодера
- Использование RFID-RC522 с другими контактами
- Можно ли использовать цифровые контакты в качестве выхода ШИМ?
- Несколько кнопок на одном прерывании, как устранить дребезг?
- Изменение ШИМ на Arduino Mega, контакты 9 и 10 на 20–25 кГц
- Возникла проблема с переобъявлением символа другого типа