Я пишу драйвер для анемометра, который основан на эффекте Холла, и я пытаюсь использовать аппаратные прерывания для контроля каждого вращения датчика.
При этом я обнаружил проблему, которую не могу решить, и выражается следующим кодом:
#if ARDUINO >= 100
#include "Arduino.h"#else
#include "WProgram.h"#endif
const int interruptPin = D5;
volatile uint16_t lastDebounceTime = 0;
volatile int numberOfInterrupts = 0;
uint16_t previousUpdate = 0;
const uint16_t updateInterval = 5000;
void handleInterrupt();
void countInterrupts();
void setup() {
Serial.begin(115200);
pinMode(interruptPin, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(interruptPin), handleInterrupt, FALLING);
}
void loop() {
if ((millis() - previousUpdate) > updateInterval) {
Serial.println(".................");
uint16_t currentMillis = millis();
Serial.println(currentMillis);
Serial.println(previousUpdate);
Serial.println(currentMillis - previousUpdate);
if (currentMillis - previousUpdate < updateInterval) Serial.println("This line shoudn't be executed, but it actually is!!");
Serial.println(".................");
previousUpdate = millis();
}
}
void handleInterrupt() {
numberOfInterrupts++;
}
Сначала код выполняется так, как предполагалось, но через некоторое время он просто перестает проверять условия if ((millis() - previousUpdate) > updateInterval)
а также if (currentMillis - previousUpdate < updateInterval) Serial.println("This line shoudn't be executed, but it actually is!!");
и затем на каждой итерации ESP8266 отправляет данные в последовательный интерфейс. millis()
работает и функция прерывания.
Я действительно пытаюсь понять и решить эту проблему, было бы здорово, если бы кто-то мог помочь мне с этим!
Спасибо!
Задача ещё не решена.
Других решений пока нет …