From ffce6ad81c19456f44ca348852d6aab13a65981f Mon Sep 17 00:00:00 2001 From: Josh Stewart Date: Tue, 14 Apr 2015 14:41:44 +1000 Subject: [PATCH] Add tacho output pulse --- globals.h | 1 + speeduino.ino | 16 ++++++++++------ timers.h | 1 + timers.ino | 28 ++++++++++++++-------------- utils.ino | 23 +++++++++++++++++++++++ 5 files changed, 49 insertions(+), 20 deletions(-) diff --git a/globals.h b/globals.h index f345dfde..13de0c35 100644 --- a/globals.h +++ b/globals.h @@ -272,6 +272,7 @@ byte pinCLT; //CLS sensor pin byte pinO2; //O2 Sensor pin byte pinBat; //O2 Sensor pin byte pinDisplayReset; // OLED reset pin +byte pinTachOut; //Tacho output byte pinSpareTemp1; // Future use only byte pinSpareTemp2; // Future use only byte pinSpareOut1; //Generic output diff --git a/speeduino.ino b/speeduino.ino index b9a762f0..e318fb3d 100644 --- a/speeduino.ino +++ b/speeduino.ino @@ -90,7 +90,7 @@ void setup() pinMode(pinInjector2, OUTPUT); pinMode(pinInjector3, OUTPUT); pinMode(pinInjector4, OUTPUT); - + pinMode(pinTachOut, OUTPUT); //Setup the dummy fuel and ignition tables //dummyFuelTable(&fuelTable); @@ -146,6 +146,9 @@ void setup() digitalWrite(pinInjector3, LOW); digitalWrite(pinInjector4, LOW); + //Set the tacho output default state + digitalWrite(pinTachOut, HIGH); + initialiseSchedulers(); initialiseTimers(); initialiseDisplay(); @@ -252,6 +255,7 @@ void setup() void loop() { + mainLoopCount++; //Check for any requets from serial. Serial operations are checked under 2 scenarios: // 1) Every 64 loops (64 Is more than fast enough for TunerStudio). This function is equivalent to ((loopCount % 64) == 1) but is considerably faster due to not using the mod or division operations @@ -576,22 +580,22 @@ void loop() //NOTE: squirt status is changed as per http://www.msextra.com/doc/ms1extra/COM_RS232.htm#Acmd void openInjector1() { digitalWrite(pinInjector1, HIGH); BIT_SET(currentStatus.squirt, 0); } void closeInjector1() { digitalWrite(pinInjector1, LOW); BIT_CLEAR(currentStatus.squirt, 0); } -void beginCoil1Charge() { digitalWrite(pinCoil1, coilHIGH); BIT_SET(currentStatus.spark, 0); } +void beginCoil1Charge() { digitalWrite(pinCoil1, coilHIGH); BIT_SET(currentStatus.spark, 0); digitalWrite(pinTachOut, LOW); } void endCoil1Charge() { digitalWrite(pinCoil1, coilLOW); BIT_CLEAR(currentStatus.spark, 0); } void openInjector2() { digitalWrite(pinInjector2, HIGH); BIT_SET(currentStatus.squirt, 1); } //Sets the relevant pin HIGH and changes the current status bit for injector 2 (2nd bit of currentStatus.squirt) void closeInjector2() { digitalWrite(pinInjector2, LOW); BIT_CLEAR(currentStatus.squirt, 1); } -void beginCoil2Charge() { digitalWrite(pinCoil2, coilHIGH); BIT_SET(currentStatus.spark, 1); } -void endCoil2Charge() { digitalWrite(pinCoil2, coilLOW); BIT_CLEAR(currentStatus.spark, 1); } +void beginCoil2Charge() { digitalWrite(pinCoil2, coilHIGH); BIT_SET(currentStatus.spark, 1); digitalWrite(pinTachOut, LOW); } +void endCoil2Charge() { digitalWrite(pinCoil2, coilLOW); BIT_CLEAR(currentStatus.spark, 1);} void openInjector3() { digitalWrite(pinInjector3, HIGH); BIT_SET(currentStatus.squirt, 2); } //Sets the relevant pin HIGH and changes the current status bit for injector 3 (3rd bit of currentStatus.squirt) void closeInjector3() { digitalWrite(pinInjector3, LOW); BIT_CLEAR(currentStatus.squirt, 2); } -void beginCoil3Charge() { digitalWrite(pinCoil3, coilHIGH); BIT_SET(currentStatus.spark, 2); } +void beginCoil3Charge() { digitalWrite(pinCoil3, coilHIGH); BIT_SET(currentStatus.spark, 2); digitalWrite(pinTachOut, LOW); } void endCoil3Charge() { digitalWrite(pinCoil3, coilLOW); BIT_CLEAR(currentStatus.spark, 2); } void openInjector4() { digitalWrite(pinInjector4, HIGH); BIT_SET(currentStatus.squirt, 3); } //Sets the relevant pin HIGH and changes the current status bit for injector 4 (4th bit of currentStatus.squirt) void closeInjector4() { digitalWrite(pinInjector4, LOW); BIT_CLEAR(currentStatus.squirt, 3); } -void beginCoil4Charge() { digitalWrite(pinCoil4, coilHIGH); BIT_SET(currentStatus.spark, 3); } +void beginCoil4Charge() { digitalWrite(pinCoil4, coilHIGH); BIT_SET(currentStatus.spark, 3); digitalWrite(pinTachOut, LOW); } void endCoil4Charge() { digitalWrite(pinCoil4, coilLOW); BIT_CLEAR(currentStatus.spark, 3); } //Combination functions for semi-sequential injection diff --git a/timers.h b/timers.h index 41d06715..75a4c155 100644 --- a/timers.h +++ b/timers.h @@ -22,6 +22,7 @@ Hence we will preload the timer with 131 cycles to leave 125 until overflow (1ms volatile int loop250ms; volatile int loopSec; volatile unsigned long targetOverdwellTime; +volatile unsigned long targetTachoPulseTime; void initialiseTimers(); diff --git a/timers.ino b/timers.ino index 12eb1895..d4c0aedd 100644 --- a/timers.ino +++ b/timers.ino @@ -9,21 +9,20 @@ Timers are typically low resolution (Compared to Schedulers), with maximum frequ void initialiseTimers() { - //Configure Timer2 for our low-freq interrupt code. + //Configure Timer2 for our low-freq interrupt code. TCCR2B = 0x00; //Disbale Timer2 while we set it up - TCNT2 = 131; //Preload timer2 with 100 cycles, leaving 156 till overflow. + TCNT2 = 131; //Preload timer2 with 131 cycles, leaving 125 till overflow. As the timer runs at 125Khz, this causes overflow to occur at 1Khz = 1ms TIFR2 = 0x00; //Timer2 INT Flag Reg: Clear Timer Overflow Flag TIMSK2 = 0x01; //Timer2 Set Overflow Interrupt enabled. TCCR2A = 0x00; //Timer2 Control Reg A: Wave Gen Mode normal - //TCCR2B = ((1 << CS10) | (1 << CS11) | (1 << CS12)); //Timer2 Set Prescaler to 5 (101), 1024 mode. - /* Now configure the prescaler to CPU clock divided by 128 */ + /* Now configure the prescaler to CPU clock divided by 128 = 125Khz */ TCCR2B |= (1<