Почему это прерывание RISING постоянно срабатывает?
Я настроил ISR для запуска по фронту RISING
контакта № 2, но обнаружил, что если на контакте 2 удерживается высокий уровень, ISR срабатывает многократно.
Вот кривая напряжения, измеренного прямо на контакте:
Я вижу небольшой шум, но его недостаточно для срабатывания нескольких импульсов. Я пробовал режимы INPUT
и INPUT_PULLUP
для контакта; поведение такое же.
constexpr byte kClockPin = 2;
constexpr byte kReadWritePin = 3;
constexpr byte kLedPin = 13;
constexpr int kNumAddressPins = 16;
constexpr byte kAddressPins[] = {/* MSB */52, 50, 48, 46, 44, 42, 40, 38, 36, 34, 32, 30, 28, 26, 24, 22};
constexpr int kNumDataPins = 8;
constexpr byte kDataPins[] = {/* MSB */45, 43, 41, 39, 37, 35, 33, 31};
volatile bool dirty = false;
volatile uint8_t data = 0;
volatile uint16_t address = 0;
volatile bool read = false;
void setup() {
// поместите сюда код установки для однократного запуска:
pinMode(kClockPin, INPUT_PULLUP);
pinMode(kReadWritePin, INPUT);
for (byte pin : kAddressPins) {
pinMode(pin, INPUT);
}
for (byte pin : kDataPins) {
pinMode(pin, INPUT);
}
pinMode(kLedPin, OUTPUT);
Serial.begin(9600);
attachInterrupt(digitalPinToInterrupt(kClockPin), OnClock, RISING);
}
void loop() {
// digitalWrite(kLedPin, digitalRead(kClockPin));
if (!dirty) return;
char output[15];
sprintf(output, "%04x %c %02x", address, read ? 'r' : 'w', data);
Serial.println(output);
dirty = false;
// digitalWrite(kLedPin, digitalRead(kClockPin));
}
void OnClock() {
read = digitalRead(kReadWritePin);
data = 0;
for (byte pin : kDataPins) {
data = (data << 1) + (digitalRead(pin) ? 1 : 0);
}
address = 0;
for (byte pin : kAddressPins) {
address = (address << 1) + (digitalRead(pin) ? 1 : 0);
}
dirty = true;
}
@decitrig, 👍0
1 ответ
Лучший ответ:
▲ 5
Оказывается, короткий ответ заключается в том, что я все еще не умею пользоваться осциллографом.
В более длинной версии шум был очень виден в меньших масштабах времени. Конденсатор фильтра был отсоединен от макетной платы таким образом, что его было трудно увидеть, и это вызывало целую кучу шума. Замена устранила проблему.
,
@decitrig
Смотрите также:
- Как разделить входящую строку?
- Как использовать SPI на Arduino?
- Как сбросить или отформатировать Arduino?
- Управление скоростью вентилятора с помощью библиотеки Arduino PID
- Arduino Due vs Mega 2560
- Как получить уникальный идентификатор для всех плат Arduino?
- Почему я получаю avrdude: stk500v2_ReceiveMessage(): timeout error when uploading to Arduino Mega?
- Тайм-аут связи Arduino Mega с ошибкой программатора