2019-12-02 09:48 AM
Hi all,
I am capturing 10 pwm pulses from proximity sensors by making the all pwm pins in rising falling interrupt mode.
PWM is captured by a timer at every 100us interrupt.
some times pulses are missing, I don't know why this is happening.
I am sharing code ISRs:
/*
* @name interrupts_Timer_50usCallback
* @brief Timer6 period elapsed Callback at every 50us
* to capture the time of input pulses.
* (50us will also be treated as resolution of input pulse capturing).
* @param none
* @retvalue none
*/
void interrupts_Timer_100usCallback(void){
//==== For Pulse Input1 ====
if(pulseCaptureFlags.pulse1Present != 0){
if(++pulse1_1ms_cntr > 17){
pulse1_1ms_cntr = 0;
if(pulseCaptureFlags.pulse1TimerSet == 0){
if(++pulse1_Capture_Thrshld > inputCaptureTime[0]){
pulse1_Capture_Thrshld = 2;
pulseCaptureFlags.pulse1TimerSet = 1;
pulseInput_1.counter++;
pulseInput_1.timer = pulseInput_1.timer + inputCaptureTime[0];
}
}
else{
pulseInput_1.timer++;
}
}
}
//==== For Pulse Input2 ====
if(pulseCaptureFlags.pulse2Present != 0){
if(++pulse2_1ms_cntr > 17){
pulse2_1ms_cntr = 0;
if(pulseCaptureFlags.pulse2TimerSet == 0){
if(++pulse2_Capture_Thrshld > inputCaptureTime[1]){
pulse2_Capture_Thrshld = 2;
pulseCaptureFlags.pulse2TimerSet = 1;
pulseInput_2.counter++;
pulseInput_2.timer = pulseInput_2.timer + inputCaptureTime[1] - 2;
}
}
else{
pulseInput_2.timer++;
}
}
}
//==== For Pulse Input3 ====
if(pulseCaptureFlags.pulse3Present != 0){
if(++pulse3_1ms_cntr > 17){
pulse3_1ms_cntr = 0;
if(pulseCaptureFlags.pulse3TimerSet == 0){
if(++pulse3_Capture_Thrshld > inputCaptureTime[2]){
pulse3_Capture_Thrshld = 1;
pulseCaptureFlags.pulse3TimerSet = 1;
pulseInput_3.counter++;
pulseInput_3.timer = pulseInput_3.timer + inputCaptureTime[2] - 2;
}
}
else{
pulseInput_3.timer++;
}
}
}
//==== For Pulse Input4 ====
if(pulseCaptureFlags.pulse4Present != 0){
if(++pulse4_1ms_cntr > 17){
pulse4_1ms_cntr = 0;
if(pulseCaptureFlags.pulse4TimerSet == 0){
if(++pulse4_Capture_Thrshld > inputCaptureTime[3]){
pulse4_Capture_Thrshld = 1;
pulseCaptureFlags.pulse4TimerSet = 1;
pulseInput_4.counter++;
pulseInput_4.timer = pulseInput_4.timer + inputCaptureTime[3] - 2;
}
}
else{
pulseInput_4.timer++;
}
}
}
//==== For Pulse Input5 ====
if(pulseCaptureFlags.pulse5Present != 0){
if(++pulse5_1ms_cntr > 17){
pulse5_1ms_cntr = 0;
if(pulseCaptureFlags.pulse5TimerSet == 0){
if(++pulse5_Capture_Thrshld > inputCaptureTime[4]){
pulse5_Capture_Thrshld = 1;
pulseCaptureFlags.pulse5TimerSet = 1;
pulseInput_5.counter++;
pulseInput_5.timer = pulseInput_5.timer + inputCaptureTime[4] - 2;
}
}
else{
pulseInput_5.timer++;
}
}
}
//==== For Pulse Input6 ====
if(pulseCaptureFlags.pulse6Present != 0){
if(++pulse6_1ms_cntr > 17){
pulse6_1ms_cntr = 0;
if(pulseCaptureFlags.pulse6TimerSet == 0){
if(++pulse6_Capture_Thrshld > inputCaptureTime[5]){
pulse6_Capture_Thrshld = 1;
pulseCaptureFlags.pulse6TimerSet = 1;
pulseInput_6.counter++;
pulseInput_6.timer = pulseInput_6.timer + inputCaptureTime[5] - 2;
}
}
else{
pulseInput_6.timer++;
}
}
}
//==== For Pulse Input7 ====
if(pulseCaptureFlags.pulse7Present != 0){
if(++pulse7_1ms_cntr > 17){
pulse7_1ms_cntr = 0;
if(pulseCaptureFlags.pulse7TimerSet == 0){
if(++pulse7_Capture_Thrshld > inputCaptureTime[6]){
pulse7_Capture_Thrshld = 1;
pulseCaptureFlags.pulse7TimerSet = 1;
pulseInput_7.counter++;
pulseInput_7.timer = pulseInput_7.timer + inputCaptureTime[6] - 2;
}
}
else{
pulseInput_7.timer++;
}
}
}
//==== For Pulse Input8 ====
if(pulseCaptureFlags.pulse8Present != 0){
if(++pulse8_1ms_cntr > 17){
pulse8_1ms_cntr = 0;
if(pulseCaptureFlags.pulse8TimerSet == 0){
if(++pulse8_Capture_Thrshld > inputCaptureTime[7]){
pulse8_Capture_Thrshld = 1;
pulseCaptureFlags.pulse8TimerSet = 1;
pulseInput_8.counter++;
pulseInput_8.timer = pulseInput_8.timer + inputCaptureTime[7] - 2;
}
}
else{
pulseInput_8.timer++;
}
}
}
//==== For Pulse Input9 ====
if(pulseCaptureFlags.pulse9Present != 0){
if(++pulse9_1ms_cntr > 17){
pulse9_1ms_cntr = 0;
if(pulseCaptureFlags.pulse9TimerSet == 0){
if(++pulse9_Capture_Thrshld > inputCaptureTime[8]){
pulse9_Capture_Thrshld = 1;
pulseCaptureFlags.pulse9TimerSet = 1;
pulseInput_9.counter++;
pulseInput_9.timer = pulseInput_9.timer + inputCaptureTime[8] - 2;
}
}
else{
pulseInput_9.timer++;
}
}
}
}
/*
* @name interrupts_FallingCallback
* @brief sets the flags that pulse is present when faling edge detected on a particular pin
* @param none
* @retvalue none
*/
void interrupts_FallingCallback(u32 PulsePin){
switch(PulsePin){
case PULSE_INPUT_1_Pin:
pulseCaptureFlags.pulse1Present = 1;
break;
case PULSE_INPUT_2_Pin:
pulseCaptureFlags.pulse2Present = 1;
break;
case PULSE_INPUT_3_Pin:
pulseCaptureFlags.pulse3Present = 1;
break;
case PULSE_INPUT_4_Pin:
pulseCaptureFlags.pulse4Present = 1;
break;
case PULSE_INPUT_5_Pin:
pulseCaptureFlags.pulse5Present = 1;
break;
case PULSE_INPUT_6_Pin:
pulseCaptureFlags.pulse6Present = 1;
break;
case PULSE_INPUT_7_Pin:
pulseCaptureFlags.pulse7Present = 1;
break;
case PULSE_INPUT_8_Pin:
pulseCaptureFlags.pulse8Present = 1;
break;
case PULSE_INPUT_9_Pin:
pulseCaptureFlags.pulse9Present = 1;
break;
default:
break;
}
}
/*
* @name interrupts_RisingCallback
* @brief Resets the flags that pulse has gone when rising edge detected on a particular pin
* @param PulsePin: input device pins at which pulse is present
* @retvalue none
*/
void interrupts_RisingCallback(u32 PulsePin){
switch(PulsePin){
case PULSE_INPUT_1_Pin:
pulseCaptureFlags.pulse1Present = 0;
pulseCaptureFlags.pulse1TimerSet = 0;
pulse1_1ms_cntr = 0;
pulse1_Capture_Thrshld = 2;
break;
case PULSE_INPUT_2_Pin:
pulseCaptureFlags.pulse2Present = 0;
pulseCaptureFlags.pulse2TimerSet = 0;
pulse2_1ms_cntr = 0;
pulse2_Capture_Thrshld = 2;
break;
case PULSE_INPUT_3_Pin:
pulseCaptureFlags.pulse3Present = 0;
pulseCaptureFlags.pulse3TimerSet = 0;
pulse3_1ms_cntr = 0;
pulse3_Capture_Thrshld = 2;
break;
case PULSE_INPUT_4_Pin:
pulseCaptureFlags.pulse4Present = 0;
pulseCaptureFlags.pulse4TimerSet = 0;
pulse4_1ms_cntr = 0;
pulse4_Capture_Thrshld = 2;
break;
case PULSE_INPUT_5_Pin:
pulseCaptureFlags.pulse5Present = 0;
pulseCaptureFlags.pulse5TimerSet = 0;
pulse5_1ms_cntr = 0;
pulse5_Capture_Thrshld = 2;
break;
case PULSE_INPUT_6_Pin:
pulseCaptureFlags.pulse6Present = 0;
pulseCaptureFlags.pulse6TimerSet = 0;
pulse6_1ms_cntr = 0;
pulse6_Capture_Thrshld = 2;
break;
case PULSE_INPUT_7_Pin:
pulseCaptureFlags.pulse7Present = 0;
pulseCaptureFlags.pulse7TimerSet = 0;
pulse7_1ms_cntr = 0;
pulse7_Capture_Thrshld = 2;
break;
case PULSE_INPUT_8_Pin:
pulseCaptureFlags.pulse8Present = 0;
pulseCaptureFlags.pulse8TimerSet = 0;
pulse8_1ms_cntr = 0;
pulse8_Capture_Thrshld = 2;
break;
case PULSE_INPUT_9_Pin:
pulseCaptureFlags.pulse9Present = 0;
pulseCaptureFlags.pulse9TimerSet = 0;
pulse9_1ms_cntr = 0;
pulse9_Capture_Thrshld = 2;
break;
/* case PULSE_INPUT_10_Pin:
pulseCaptureFlags.pulse10Present = 0;
pulseCaptureFlags.pulse10TimerSet = 0;
pulse10_1ms_cntr = 0;
pulse10_Capture_Thrshld = 1;
break;*/
default:
break;
}
}
I have to measure both no. of pulses counts as well as how much time the pulse was high.
Please help me out.
Thanks.
Solved! Go to Solution.
2019-12-07 03:47 AM
So basically during ISR execution, I can monitor multiple pin's state.
Due to which can avoid interrupt missing problem.
Am I right?