I am trying to use a T4.1 to measure the pulse width produced by a TCS230 color light-frequency converter. I am trying to do this using QTIMER ch 1 in Capture mode, with primary source the internal clock and secondary source the sensor output, connected to QTIMER1_TIMER0 on pin 10 (ALT 1).
When I run the code below nothing happens - I get no interrupts although the pulse train is being generated as expected. I also do not get an interrupt on counter overflow. Obviously, I am missing something to do with the interrupt setup but cannot figure out what is wrong.
Any help would be greatly appreciated.
Code is as follows:
When I run the code below nothing happens - I get no interrupts although the pulse train is being generated as expected. I also do not get an interrupt on counter overflow. Obviously, I am missing something to do with the interrupt setup but cannot figure out what is wrong.
Any help would be greatly appreciated.
Code is as follows:
Code:
#include <arduino.h>
#include "pins.h"
uint16_t ovflCount, eventCount;
volatile bool tmr1Edgfl, tmr1Ovfl;
volatile uint16_t pulseRise, oldTime;
uint32_t pulseDur[4], intensity[4];
void tmr1_isr() // TMR1 Interrupt service
{
if(TMR1_SCTRL1 & TMR_SCTRL_TOF) // TMR1 Overflow
{
TMR1_SCTRL1 &= ~(TMR_SCTRL_TOF); // reset flag
tmr1Ovfl = true;
digitalToggleFast(tp0);
}
if(TMR1_SCTRL0 & TMR_SCTRL_IEF) // TMR1 input edge event
{
pulseRise = TMR1_HOLD1;
TMR1_SCTRL1 &= ~(TMR_SCTRL_IEF); // Clear edgeinterrupt flag
tmr1Edgfl = true;
digitalToggleFast(tp1);
}
asm volatile ("dsb"); // wait for clear memory barrier
}
void setup()
{
Serial.begin(115200);
pinMode(tp0, OUTPUT);
pinMode(tp1, OUTPUT);
// Set up QTIMER1 Ch 1 for input capture mode to allow frequency measurement.
CCM_CCGR6 |= CCM_CCGR6_QTIMER1(CCM_CCGR_ON);
// Sec source IS QTIMER1 Ch0 input - pin 10 ALT 1.
IOMUXC_SW_MUX_CTL_PAD_GPIO_B0_00 = 0b0001; // Pin 10 ALT1 = QTIMER1_TIMER0
TMR1_CTRL1 = 0; // Stop
TMR1_CNTR1 = 0;
TMR1_LOAD1 = 0;
TMR1_COMP11 = 0;
TMR1_COMP21 = 0;
// Enable overflow and edge detection interrupts
TMR1_SCTRL1 = (TMR_SCTRL_TOFIE | TMR_SCTRL_IEFIE | TMR_SCTRL_CAPTURE_MODE(2) ) ;
TMR1_CSCTRL1 = (TMR_CSCTRL_ROC | TMR_CSCTRL_TCI);
TMR1_CTRL1 = (TMR_CTRL_CM(3) | TMR_CTRL_PCS(8) | TMR_CTRL_SCS(0));
attachInterruptVector(IRQ_QTIMER1, tmr1_isr);
NVIC_ENABLE_IRQ( IRQ_QTIMER1);
NVIC_SET_PRIORITY( IRQ_QTIMER1, 64);
sei();
Serial.print(" TMR1_CTRL1 = ");Serial.println(TMR1_CTRL1, HEX);
Serial.print(" TMR1_SCTRL1 = ");Serial.println(TMR1_SCTRL1, HEX);
Serial.print(" TMR1_CSCTRL1 = ");Serial.println(TMR1_CSCTRL1, HEX);
Serial.print(" CCM_CCGR6 = ");Serial.println(CCM_CCGR6, HEX);
Serial.print(" TMR_ENBL = ");Serial.println(TMR1_ENBL, HEX);
Serial.print(" IOMUXC_GPR_GPR2 = ");Serial.println(IOMUXC_GPR_GPR2);
Serial.println("+++ Setup completed +++");
Serial.println("************************");
}
void loop()
{
Serial.print(" Count = ");Serial.print(TMR1_CNTR1, HEX);Serial.print(" Captured value = "); Serial.print(TMR1_CAPT1, HEX); Serial.print(" TMR1_SCTRL1 = "); Serial.println(TMR1_SCTRL1, HEX);
delay(100);
if (tmr1Ovfl)
{
Serial.println("Timer 1 Overflow...");
tmr1Ovfl = false;
}
if (tmr1Edgfl)
{
Serial.println("Timer 1 Edge detected ...");
tmr1Edgfl = false;
}
}