Bem-vindo de volta, amigo!
LOGIN
Ou Esqueceu a senha?

Problemas com a função attachinterrupt + millis()

Por: João Trevizoli Esteves Iniciante

Boa tarde pessoal!

Eu estou com um problema bizarro e não sei como resolver, será que alguém pode me ajudar?

Eu estou escrevendo um driver para um sensor rotativo e estou usando interrupções em um esp8266  e descobri um problema bizzarro com o código de teste abaixo:

 

#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() {

  uint16_t teste = millis();

  if ((millis() - previousUpdate) > updateInterval)

  {

    Serial.println(".................");

    Serial.println(teste);

    Serial.println(previousUpdate);

    Serial.println(teste - previousUpdate);

    Serial.println(".................");

    previousUpdate = millis();

 

  }

}

 

void handleInterrupt() {

    if ((millis() - lastDebounceTime) > 10)

    {

      lastDebounceTime = millis();

      numberOfInterrupts++;

    }

}

 A microcontroladora funciona como deveria por um tempo, mostrando o valor da variavel teste, da previousUpdate e a diferença entre elas , mas depois de algumas interrupções ela começa ignorar a condição e gospir na saida serial o valor dessas variáveis a cada loop. Eu fiz isso para conferir se o millis estava funcionando e está, se o updateInterval está sendo atualizado e ele está, e por fim checar sua diferença verificando se ela é maior que 5000 e estranhamente ela não é!!!!!

 

Obrigado pessoal!

Criado em 26/04/2017 19:44

Respostas

26/04/2017 20:21

João Trevizoli Esteves Iniciante

Talvez esse código deixe o problema que quero entender mais claro:

#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("Isso\

     nunca deveria ser executado, mas é!!");

    Serial.println(".................");

    previousUpdate = millis();

    numberOfInterrupts = 0;

  }

}

 

void handleInterrupt() {

      numberOfInterrupts++;

}