Я хочу вызвать некоторые функции на переднем и заднем фронте прямоугольных импульсов. Я использовал attachInterrupt (digitalPinToInterrupt (interruptPin), udara, RISING) для нарастающего фронта и attachInterrupt (digitalPinToInterrupt (interruptPin), blank, FALLING) для спадающего фронта. Но я не получил консервативных последовательных выходов повышения и понижения. каков ответ на проблему? Мой код написан следующим образом.
enter code here
const byte interruptPin = 2;
void setup() {
Serial.begin(9600);
pinMode(interruptPin, INPUT);
}
void loop() {
attachInterrupt(digitalPinToInterrupt(interruptPin), udara, RISING);
attachInterrupt(digitalPinToInterrupt(interruptPin), blank, FALLING);
}
void udara() {
Serial.println("rise");
}`
void blank() {
Serial.println("fall");
}
Лучшее форматирование кода.
attachInterrupt()
должен быть частью setup()
, а не loop()
, поскольку он используется для настройки триггера события и обратного вызова.
const byte interruptPin = 2;
void setup() {
Serial.begin(9600);
pinMode(interruptPin, INPUT);
attachInterrupt(digitalPinToInterrupt(interruptPin), udara, RISING);
attachInterrupt(digitalPinToInterrupt(interruptPin), blank, FALLING);
}
void loop() {
}
void udara() {
Serial.println("rise");
}
void blank() {
Serial.println("fall");
}
Большое спасибо за ответ. Поскольку в цикле ничего нет, код запускает только единицы, а на выходе можно увидеть только одно повышение и непрерывное падение. Мне нужен ответ: подъем, падение, подъем, падение также. Какие есть модификации?
Последовательный использует прерывания для передачи данных. Эти прерывания отключены во время ISR. По этой причине лучше избегать использования Serial в ISR. Измените код, чтобы установить флаг в ISR и выполнить печать из цикла в ответ на флаг.
Почему вы присоединяетесь к 'loop ()'? Разве не имеет смысла подключаться один раз в 'setup ()'?