diff --git a/globals.h b/globals.h index 5f869a9..b2ef23b 100644 --- a/globals.h +++ b/globals.h @@ -104,6 +104,9 @@ volatile byte ign4_pin_mask; volatile byte *ign5_pin_port; volatile byte ign5_pin_mask; +volatile byte *tach_pin_port; +volatile byte tach_pin_mask; + //The status struct contains the current values for all 'live' variables //In current version this is 64 bytes struct statuses { @@ -183,7 +186,7 @@ struct config1 { byte crankingPct; //Cranking enrichment byte pinMapping; // The board / ping mapping to be used byte tachoPin : 6; //Custom pin setting for tacho output - byte unused16 : 2; + byte tachoDiv : 2; //Whether to change the tacho speed byte tdePct; // TPS decelleration (%) byte taeColdA; byte tpsThresh; diff --git a/speeduino.ino b/speeduino.ino index 0361781..d1dcfa1 100644 --- a/speeduino.ino +++ b/speeduino.ino @@ -1482,30 +1482,39 @@ void loop() void endCoil4Charge() { *ign4_pin_port &= ~(ign4_pin_mask); BIT_CLEAR(currentStatus.spark, 3);} #else */ + +volatile bool tachoAlt = true; +#define TACH_PULSE_HIGH() *tach_pin_port |= (tach_pin_mask) +#define TACH_PULSE_LOW() if( (configPage1.tachoDiv == 0) || tachoAlt ) *tach_pin_port &= ~(tach_pin_mask); tachoAlt = !tachoAlt + inline void openInjector1() { digitalWrite(pinInjector1, HIGH); BIT_SET(currentStatus.squirt, BIT_SQUIRT_INJ1); } inline void closeInjector1() { digitalWrite(pinInjector1, LOW); BIT_CLEAR(currentStatus.squirt, BIT_SQUIRT_INJ1); } - inline void beginCoil1Charge() { digitalWrite(pinCoil1, coilHIGH); digitalWrite(pinTachOut, LOW); } - inline void endCoil1Charge() { digitalWrite(pinCoil1, coilLOW); } + //inline void beginCoil1Charge() { digitalWrite(pinCoil1, coilHIGH); digitalWrite(pinTachOut, LOW); } + inline void beginCoil1Charge() { digitalWrite(pinCoil1, coilHIGH); TACH_PULSE_LOW(); } + inline void endCoil1Charge() { digitalWrite(pinCoil1, coilLOW); TACH_PULSE_HIGH(); } inline void openInjector2() { digitalWrite(pinInjector2, HIGH); BIT_SET(currentStatus.squirt, BIT_SQUIRT_INJ2); } //Sets the relevant pin HIGH and changes the current status bit for injector 2 (2nd bit of currentStatus.squirt) inline void closeInjector2() { digitalWrite(pinInjector2, LOW); BIT_CLEAR(currentStatus.squirt, BIT_SQUIRT_INJ2); } - inline void beginCoil2Charge() { digitalWrite(pinCoil2, coilHIGH); digitalWrite(pinTachOut, LOW); } - inline void endCoil2Charge() { digitalWrite(pinCoil2, coilLOW); } + //inline void beginCoil2Charge() { digitalWrite(pinCoil2, coilHIGH); digitalWrite(pinTachOut, LOW); } + inline void beginCoil2Charge() { digitalWrite(pinCoil2, coilHIGH); TACH_PULSE_LOW(); } + inline void endCoil2Charge() { digitalWrite(pinCoil2, coilLOW); TACH_PULSE_HIGH(); } inline void openInjector3() { digitalWrite(pinInjector3, HIGH); BIT_SET(currentStatus.squirt, BIT_SQUIRT_INJ3); } //Sets the relevant pin HIGH and changes the current status bit for injector 3 (3rd bit of currentStatus.squirt) inline void closeInjector3() { digitalWrite(pinInjector3, LOW); BIT_CLEAR(currentStatus.squirt, BIT_SQUIRT_INJ3); } - inline void beginCoil3Charge() { digitalWrite(pinCoil3, coilHIGH); digitalWrite(pinTachOut, LOW); } - inline void endCoil3Charge() { digitalWrite(pinCoil3, coilLOW); } + //inline void beginCoil3Charge() { digitalWrite(pinCoil3, coilHIGH); digitalWrite(pinTachOut, LOW); } + inline void beginCoil3Charge() { digitalWrite(pinCoil3, coilHIGH); TACH_PULSE_LOW(); } + inline void endCoil3Charge() { digitalWrite(pinCoil3, coilLOW); TACH_PULSE_HIGH(); } inline void openInjector4() { digitalWrite(pinInjector4, HIGH); BIT_SET(currentStatus.squirt, BIT_SQUIRT_INJ4); } //Sets the relevant pin HIGH and changes the current status bit for injector 4 (4th bit of currentStatus.squirt) inline void closeInjector4() { digitalWrite(pinInjector4, LOW); BIT_CLEAR(currentStatus.squirt, BIT_SQUIRT_INJ4); } - inline void beginCoil4Charge() { digitalWrite(pinCoil4, coilHIGH); digitalWrite(pinTachOut, LOW); } - inline void endCoil4Charge() { digitalWrite(pinCoil4, coilLOW); } + //inline void beginCoil4Charge() { digitalWrite(pinCoil4, coilHIGH); digitalWrite(pinTachOut, LOW); } + inline void beginCoil4Charge() { digitalWrite(pinCoil4, coilHIGH); TACH_PULSE_LOW(); } + inline void endCoil4Charge() { digitalWrite(pinCoil4, coilLOW); TACH_PULSE_HIGH(); } inline void openInjector5() { digitalWrite(pinInjector5, HIGH); } inline void closeInjector5() { digitalWrite(pinInjector5, LOW); } - inline void beginCoil5Charge() { digitalWrite(pinCoil5, coilHIGH); digitalWrite(pinTachOut, LOW); } - inline void endCoil5Charge() { digitalWrite(pinCoil5, coilLOW); } + inline void beginCoil5Charge() { digitalWrite(pinCoil5, coilHIGH); TACH_PULSE_LOW(); } + inline void endCoil5Charge() { digitalWrite(pinCoil5, coilLOW); TACH_PULSE_HIGH(); } //#endif diff --git a/timers.ino b/timers.ino index 0ff7eb4..a898e27 100644 --- a/timers.ino +++ b/timers.ino @@ -55,12 +55,19 @@ unsigned long targetTachoPulseTime; //Overdwell check targetOverdwellTime = micros() - dwellLimit_uS; //Set a target time in the past that all coil charging must have begun after. If the coil charge began before this time, it's been running too long - targetTachoPulseTime = micros() - (1500); + //targetTachoPulseTime = micros() - (1500); //Check first whether each spark output is currently on. Only check it's dwell time if it is + /* if(ignitionSchedule1.Status == RUNNING) { if(ignitionSchedule1.startTime < targetOverdwellTime && configPage2.useDwellLim) { endCoil1Charge(); } if(ignitionSchedule1.startTime < targetTachoPulseTime) { digitalWrite(pinTachOut, HIGH); } } if(ignitionSchedule2.Status == RUNNING) { if(ignitionSchedule2.startTime < targetOverdwellTime && configPage2.useDwellLim) { endCoil2Charge(); } if(ignitionSchedule2.startTime < targetTachoPulseTime) { digitalWrite(pinTachOut, HIGH); } } if(ignitionSchedule3.Status == RUNNING) { if(ignitionSchedule3.startTime < targetOverdwellTime && configPage2.useDwellLim) { endCoil3Charge(); } if(ignitionSchedule3.startTime < targetTachoPulseTime) { digitalWrite(pinTachOut, HIGH); } } if(ignitionSchedule4.Status == RUNNING) { if(ignitionSchedule4.startTime < targetOverdwellTime && configPage2.useDwellLim) { endCoil4Charge(); } if(ignitionSchedule4.startTime < targetTachoPulseTime) { digitalWrite(pinTachOut, HIGH); } } + */ + if(ignitionSchedule1.Status == RUNNING) { if(ignitionSchedule1.startTime < targetOverdwellTime && configPage2.useDwellLim) { endCoil1Charge(); } } + if(ignitionSchedule2.Status == RUNNING) { if(ignitionSchedule2.startTime < targetOverdwellTime && configPage2.useDwellLim) { endCoil2Charge(); } } + if(ignitionSchedule3.Status == RUNNING) { if(ignitionSchedule3.startTime < targetOverdwellTime && configPage2.useDwellLim) { endCoil3Charge(); } } + if(ignitionSchedule4.Status == RUNNING) { if(ignitionSchedule4.startTime < targetOverdwellTime && configPage2.useDwellLim) { endCoil4Charge(); } } + if(ignitionSchedule5.Status == RUNNING) { if(ignitionSchedule5.startTime < targetOverdwellTime && configPage2.useDwellLim) { endCoil5Charge(); } } //Loop executed every 250ms loop (1ms x 250 = 250ms) //Anything inside this if statement will run every 250ms. diff --git a/utils.ino b/utils.ino index 7071282..83df495 100644 --- a/utils.ino +++ b/utils.ino @@ -374,6 +374,9 @@ void setPinMapping(byte boardID) ign5_pin_port = portOutputRegister(digitalPinToPort(pinCoil5)); ign5_pin_mask = digitalPinToBitMask(pinCoil5); + tach_pin_port = portOutputRegister(digitalPinToPort(pinTachOut)); + tach_pin_mask = digitalPinToBitMask(pinTachOut); + //And for inputs pinMode(pinMAP, INPUT); pinMode(pinO2, INPUT);