Почему это прерывание RISING постоянно срабатывает?

Я настроил ISR для запуска по фронту RISING контакта № 2, но обнаружил, что если на контакте 2 удерживается высокий уровень, ISR срабатывает многократно.

Вот кривая напряжения, измеренного прямо на контакте:

Осциллограмма напряжения на контакте 2

Я вижу небольшой шум, но его недостаточно для срабатывания нескольких импульсов. Я пробовал режимы 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;
}

, 👍0


1 ответ


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

5

Оказывается, короткий ответ заключается в том, что я все еще не умею пользоваться осциллографом.

В более длинной версии шум был очень виден в меньших масштабах времени. Конденсатор фильтра был отсоединен от макетной платы таким образом, что его было трудно увидеть, и это вызывало целую кучу шума. Замена устранила проблему.

,