Go Down

Topic: DUE Timer not working if started within an ISR (Read 685 times) previous topic - next topic

jimmie

Hello,

I would appreciate hep with this pesky problem.

I am using Ivan Seidel's DUE Timer library and made a couple of successful sketches.  My Timer checks on the value of a variable, and if > 0, does stuff.  The Timer is started within an ISR and then stopped at the end of its handler.

I have already used "volatile" to declare that variable.

The Timer however NEVER starts.  The statement to start the Timer within the ISR is just ignored.

I even tried just running the timer all the time.  When I did that, the program stalls once the interrupt fires and the variable is changed within the ISR.

Any help is appreciated.

ard_newbie


These are the drawbacks of using libraries if you don't really know what's going on insideā€¦.

A Timer Counter doesn't take a variable, maybe a library function takes a variable.

Try to understand how Timer Counters work by using there registers and you won't have anymore issues with timers.

How about posting your code.

jimmie

Hello,

Thank you, here is the code that gives problems.  The Timer never starts.



Code: [Select]


#include <DueTimer.h>

#define interruptPin 2

volatile int preTriggerCount = 0;         //volatile because used in ISR

unsigned long interruptTime[50];


void setup()
{
  attachInterrupt(digitalPinToInterrupt(interruptPin), maintPreTrig, FALLING);
  preTriggerCount = 0;
 

  Timer3.attachInterrupt(checkPreTriggers);
 
}

void loop()
{

}

void maintPreTrig()
{
  //Executed upon receipt of interrupt from micro

  preTriggerCount = preTriggerCount + 1 ;

  interruptTime[preTriggerCount] = millis();

  //---------------------------------------------------------------------
Timer3.start(18000000);            

  //---------------------------------------------------------------------
}


 void checkPreTriggers()
//Called to clear old preTriggers
{
  while (preTriggerCount > 0)
  {
  
    for (int i = 1; i <= 10; i++)
    {
    

      if (((millis() - interruptTime[i]) > (checkPreTrigTimer * 1000)) && (preTriggerCount >= 1))
      {
        preTriggerCount = preTriggerCount - 1;
        
      }
    }
Timer3.stop();
  }





ard_newbie


Your code doesn't compile.

A few thoughts:

- interruptPin seems to receive a switch(?), a press on this switch should trigger maintPreTrig() on a falling edge, therefore interruptPin should be declared as input_pullup somewhere ?

- Are you sure preTriggerCount will never exceed 50 ?

jimmie

Thank you @ard_newbie.

Sorry, my code is too long so I just attached a snippet.

1) interruptPin is set to LOW by another Arduino.  This for sure is working.

2) Yes,  preTriggerCount is set to 0 if > 10

I am almost sure the problem occurs due to interrupt conflicts but I know very little about this stuff ...

ard_newbie


I understand that:

you need to start a timer from inside a function triggered by an attachinterrupt, right ?

This timer will trigger an interrupt after a period. Inside this interrupt, you will stop this timer, right ?

Go Up