Different priorities for two timer interrupts doesn't work

mkoch

Well-known member
In this example for Teensy4.0 I have two timer interrupts with 200 Hz and 200 kHz, and I want the 200 kHz interrupt to have the higher priority.
But as you can see in the scope screenshot, the 200 Hz interrupt has higher priority. Yellow is D0 main loop, cyan is D1 200 kHz and magenta is D2 200 Hz.
What's wrong in my code?

Thanks, Michael

SCR04.PNG

Code:
IntervalTimer myTimer1;
IntervalTimer myTimer2;

void setup()
{
  pinMode(0, OUTPUT);  // Main loop
  pinMode(1, OUTPUT);  // 200 kHz Interrupt
  pinMode(2, OUTPUT);  // 200 Hz Interrupt

  myTimer1.begin(timer1, 5);     // 200 kHz
  myTimer1.priority(64);         // set higher priority

  myTimer2.begin(timer2, 5000);  // 200 Hz
  myTimer2.priority(160);        // set lower priority
}

void timer1(void)
{
  digitalWriteFast(1, HIGH);
  delayNanoseconds(500);         // 500 ns pulse
  digitalWriteFast(1, LOW);
}

void timer2(void)
{
  digitalWriteFast(2, HIGH);
  delay(1);                      // 1 ms pulse
  digitalWriteFast(2, LOW);
}

void loop()
{
  digitalWriteFast(0, HIGH);     // toggle D0 as fast as possible
  digitalWriteFast(0, LOW);
  digitalWriteFast(0, HIGH);
  digitalWriteFast(0, LOW);
  digitalWriteFast(0, HIGH);
  digitalWriteFast(0, LOW);
  digitalWriteFast(0, HIGH);
  digitalWriteFast(0, LOW);
  digitalWriteFast(0, HIGH);
  digitalWriteFast(0, LOW);
  digitalWriteFast(0, HIGH);
  digitalWriteFast(0, LOW);
  digitalWriteFast(0, HIGH);
  digitalWriteFast(0, LOW);
  digitalWriteFast(0, HIGH);
  digitalWriteFast(0, LOW);
}
 
Thanks for your reply. I was able to figure out a working example, here it is:

Code:
#include "TeensyTimerTool.h"
using namespace TeensyTimerTool;

PeriodicTimer timer1(GPT1);   // uses GPT1
PeriodicTimer timer2(PIT);    // uses PIT

void setup()
{
  pinMode(0, OUTPUT);  // Main loop
  pinMode(1, OUTPUT);  // 200 kHz Interrupt
  pinMode(2, OUTPUT);  // 200 Hz Interrupt

  timer1.begin(isr1, 5);        // 200 kHz
  timer2.begin(isr2, 5000);     // 200 Hz
 
  NVIC_SET_PRIORITY(IRQ_GPT1, 32);  // set high priority
  NVIC_SET_PRIORITY(IRQ_PIT, 200);  // set low priority 
}

void isr1(void)
{
  digitalWriteFast(1, HIGH);       // push: 180 ns
  delayNanoseconds(500);           // 500 ns pulse
  digitalWriteFast(1, LOW);        // pull: 40 ns
}

void isr2(void)
{
  digitalWriteFast(2, HIGH); 
  delay(1);                      // 1 ms pulse
  digitalWriteFast(2, LOW);
}

void loop()
{ 
  digitalWriteFast(0, HIGH);     // toggle D0 as fast as possible
  digitalWriteFast(0, LOW);
  digitalWriteFast(0, HIGH);
  digitalWriteFast(0, LOW);
  digitalWriteFast(0, HIGH);
  digitalWriteFast(0, LOW);
  digitalWriteFast(0, HIGH);
  digitalWriteFast(0, LOW);
}
 
Back
Top