Align scheduler timeout checks on fuel match those on ignition

Potential fix for #1181
This commit is contained in:
Josh Stewart 2024-02-16 09:56:24 +11:00
parent 7dc25282b3
commit 5bfbd1eb28
3 changed files with 16 additions and 11 deletions

View File

@ -112,7 +112,7 @@
static inline void IGN7_TIMER_DISABLE(void) {FTM3_C6SC &= ~FTM_CSC_CHIE;} static inline void IGN7_TIMER_DISABLE(void) {FTM3_C6SC &= ~FTM_CSC_CHIE;}
static inline void IGN8_TIMER_DISABLE(void) {FTM3_C7SC &= ~FTM_CSC_CHIE;} static inline void IGN8_TIMER_DISABLE(void) {FTM3_C7SC &= ~FTM_CSC_CHIE;}
#define MAX_TIMER_PERIOD 139808 // 2.13333333uS * 65535 #define MAX_TIMER_PERIOD 139808UL // 2.13333333uS * 65535
#define uS_TO_TIMER_COMPARE(uS) ((uS * 15) >> 5) //Converts a given number of uS into the required number of timer ticks until that time has passed. #define uS_TO_TIMER_COMPARE(uS) ((uS * 15) >> 5) //Converts a given number of uS into the required number of timer ticks until that time has passed.
/* /*

View File

@ -214,9 +214,14 @@ void _setFuelScheduleRunning(FuelSchedule &schedule, unsigned long timeout, unsi
{ {
schedule.duration = duration; schedule.duration = duration;
//Need to check that the timeout doesn't exceed the overflow
COMPARE_TYPE timeout_timer_compare;
if (timeout > MAX_TIMER_PERIOD) { timeout_timer_compare = uS_TO_TIMER_COMPARE( (MAX_TIMER_PERIOD - 1) ); } // If the timeout is >4x (Each tick represents 4uS on a mega2560, other boards will be different) the maximum allowed value of unsigned int (65535), the timer compare value will overflow when applied causing erratic behaviour such as erroneous squirts
else { timeout_timer_compare = uS_TO_TIMER_COMPARE(timeout); } //Normal case
//The following must be enclosed in the noInterupts block to avoid contention caused if the relevant interrupt fires before the state is fully set //The following must be enclosed in the noInterupts block to avoid contention caused if the relevant interrupt fires before the state is fully set
noInterrupts(); noInterrupts();
schedule.startCompare = schedule.counter + uS_TO_TIMER_COMPARE(timeout); schedule.startCompare = schedule.counter + timeout_timer_compare;
schedule.endCompare = schedule.startCompare + uS_TO_TIMER_COMPARE(duration); schedule.endCompare = schedule.startCompare + uS_TO_TIMER_COMPARE(duration);
SET_COMPARE(schedule.compare, schedule.startCompare); //Use the B compare unit of timer 3 SET_COMPARE(schedule.compare, schedule.startCompare); //Use the B compare unit of timer 3
schedule.Status = PENDING; //Turn this schedule on schedule.Status = PENDING; //Turn this schedule on

View File

@ -200,15 +200,15 @@ struct FuelSchedule {
void _setFuelScheduleRunning(FuelSchedule &schedule, unsigned long timeout, unsigned long duration); void _setFuelScheduleRunning(FuelSchedule &schedule, unsigned long timeout, unsigned long duration);
void _setFuelScheduleNext(FuelSchedule &schedule, unsigned long timeout, unsigned long duration); void _setFuelScheduleNext(FuelSchedule &schedule, unsigned long timeout, unsigned long duration);
inline __attribute__((always_inline)) void setFuelSchedule(FuelSchedule &schedule, unsigned long timeout, unsigned long duration) { inline __attribute__((always_inline)) void setFuelSchedule(FuelSchedule &schedule, unsigned long timeout, unsigned long duration)
//Check whether timeout exceeds the maximum future time. This can potentially occur on sequential setups when below ~115rpm {
if(timeout < MAX_TIMER_PERIOD) { if(schedule.Status != RUNNING)
if(schedule.Status != RUNNING) { //Check that we're not already part way through a schedule { //Check that we're not already part way through a schedule
_setFuelScheduleRunning(schedule, timeout, duration); _setFuelScheduleRunning(schedule, timeout, duration);
} }
else { else if(timeout < MAX_TIMER_PERIOD)
_setFuelScheduleNext(schedule, timeout, duration); {
} _setFuelScheduleNext(schedule, timeout, duration);
} }
} }