2013-07-08 17:43:41 -07:00
# include <Arduino.h>
2013-07-18 03:36:36 -07:00
const byte ms_version = 20 ;
2014-02-06 01:48:19 -08:00
const byte signature = 20 ;
const byte data_structure_version = 2 ; //This identifies the data structure when reading / writing.
const byte page_size = 128 ;
2013-07-09 17:26:16 -07:00
2013-09-19 03:49:28 -07:00
//Handy bitsetting macros
# define BIT_SET(a,b) ((a) |= (1<<(b)))
# define BIT_CLEAR(a,b) ((a) &= ~(1<<(b)))
2014-05-06 04:07:49 -07:00
# define BIT_CHECK(var,pos) ((var) & (1<<(pos)))
2013-09-19 03:49:28 -07:00
2014-05-06 04:07:49 -07:00
//Define bit positions within engine virable
# define BIT_ENGINE_RUN 0 // Engine running
# define BIT_ENGINE_CRANK 1 // Engine cranking
# define BIT_ENGINE_ASE 2 // after start enrichment (ASE)
# define BIT_ENGINE_WARMUP 3 // Engine in warmup
# define BIT_ENGINE_TPS 4 // in TPS acceleration mode
# define BIT_ENGINE_ACC 5 // in deceleration mode
# define BIT_ENGINE_MAP 6 // in MAP acceleration mode
# define BIT_ENGINE_IDLE 7 // idle on
2014-01-29 21:28:21 -08:00
2014-01-30 16:49:50 -08:00
//Define masks for Squirt
2014-05-06 04:07:49 -07:00
# define BIT_SQUIRT_INJ1 0 //inj1 Squirt
# define BIT_SQUIRT_INJ2 1 //inj2 Squirt
# define BIT_SQUIRT_SCHSQRT 2 //Scheduled to squirt
# define BIT_SQUIRT_SQRTING 3 //Squirting
# define BIT_SQUIRT_INJ2SCHED 4
# define BIT_SQUIRT_INJ2SQRT 5 //Injector2 (Schedule2)
# define BIT_SQUIRT_BOOSTCTRLOFF 6 //Squirting Injector 2
2014-01-29 21:28:21 -08:00
2014-05-12 04:28:24 -07:00
# define SIZE_BYTE 8
# define SIZE_INT 16
2014-12-10 15:21:59 -08:00
//Table sizes
# define CALIBRATION_TABLE_SIZE 512
2014-12-15 05:34:02 -08:00
# define CALIBRATION_TEMPERATURE_OFFSET 40 // All temperature measurements are stored offset by 40 degrees. This is so we can use an unsigned byte (0-255) to represent temperature ranges from -40 to 215
2014-12-10 15:21:59 -08:00
2013-07-09 17:26:16 -07:00
//The status struct contains the current values for all 'live' variables
2013-07-16 05:29:17 -07:00
//In current version this is 64 bytes
2013-07-09 17:26:16 -07:00
struct statuses {
volatile boolean hasSync ;
unsigned int RPM ;
byte MAP ;
2014-02-13 14:27:33 -08:00
byte TPS ; //The current TPS reading (0% - 100%)
byte TPSlast ; //The previous TPS reading
byte tpsADC ; //0-255 byte representation of the TPS
2014-05-07 05:55:15 -07:00
byte tpsDOT ;
2013-07-09 17:26:16 -07:00
byte VE ;
2013-09-23 05:23:34 -07:00
byte O2 ;
2014-12-15 05:34:02 -08:00
int coolant ;
2014-12-10 15:21:59 -08:00
int cltADC ;
2014-12-15 05:34:02 -08:00
int IAT ;
2014-12-10 15:21:59 -08:00
int iatADC ;
int batADC ;
2014-10-14 17:49:11 -07:00
byte battery10 ; //The current BRV in volts (multiplied by 10. Eg 12.5V = 125)
2013-09-24 21:56:38 -07:00
byte advance ;
2014-09-20 15:17:14 -07:00
byte corrections ;
2013-09-17 23:45:53 -07:00
volatile byte squirt ;
2013-08-25 21:11:47 -07:00
byte engine ;
2014-09-21 12:52:32 -07:00
unsigned int PW ; //In uS
2014-05-08 03:46:38 -07:00
volatile byte runSecs ; //Counter of seconds since cranking commenced (overflows at 255 obviously)
volatile byte secl ; //Continous
2014-02-23 21:15:13 -08:00
volatile int loopsPerSecond ;
2013-07-09 17:26:16 -07:00
2013-08-25 21:11:47 -07:00
//Helpful bitwise operations:
//Useful reference: http://playground.arduino.cc/Code/BitMath
// y = (x >> n) & 1; // n=0..15. stores nth bit of x in y. y becomes 0 or 1.
// x &= ~(1 << n); // forces nth bit of x to be 0. all other bits left alone.
// x |= (1 << n); // forces nth bit of x to be 1. all other bits left alone.
2013-07-09 17:26:16 -07:00
} ;
2013-07-16 05:29:17 -07:00
//Page 1 of the config - See the ini file for further reference
//This mostly covers off variables that are required for fuel
struct config1 {
/*
byte engineCylinders ; 1 // May support more than 1 cyl later. Always will assume 1 injector per cylinder.
byte engineInjectorSize ; 80 // In cc/min
byte engineStoich ; 14.7 // Stoichiometric ratio of fuel used
byte engineStrokes ; 4 //Can be 2 stroke or 4 stroke, any other value will cause problems
byte engineDwell ; 3000 //The spark dwell time in uS
*/
2013-07-18 03:36:36 -07:00
byte crankCold ; //Cold cranking pulsewidth modifier. This is added to the fuel pulsewidth when cranking under a certain temp threshold (ms)
byte crankHot ; //Warm cranking pulsewidth modifier. This is added to the fuel pulsewidth when cranking (ms)
byte asePct ; //Afterstart enrichment (%)
2013-07-16 20:09:18 -07:00
byte aseCount ; //Afterstart enrichment cycles. This is the number of ignition cycles that the afterstart enrichment % lasts for
2014-02-26 20:17:14 -08:00
byte wueValues [ 10 ] ; //Warm up enrichment array (10 bytes)
2013-09-15 17:18:33 -07:00
byte taeBins [ 4 ] ; //TPS based acceleration enrichment bin 1 of 4 (ms)
2013-07-16 05:29:17 -07:00
byte taeColdA ;
byte tpsThresh ;
byte taeTime ;
byte tdePct ;
2013-07-18 00:26:24 -07:00
byte egoTemp ; //The temperature at which the EGO / O2 sensor values start being used (Degrees)
2013-07-16 05:29:17 -07:00
byte egoCount ;
byte egoDelta ;
byte egoLimit ;
byte reqFuel ;
byte divider ;
byte alternate ;
byte injOpen ;
byte injOCfuel ;
byte injPwmP ;
byte injPwmT ;
byte battFac ; //Whether to compensate pulsewidth for battery voltage (ms/v)
2014-02-06 01:48:19 -08:00
int rpmk ; //2 bytes
//36
2013-09-16 00:39:24 -07:00
//config1 in ini
2013-09-15 17:18:33 -07:00
byte mapType : 2 ;
byte strokes : 1 ;
byte injType : 1 ;
byte nCylinders : 4 ; //Number of cylinders
2013-09-16 00:39:24 -07:00
//config2 in ini
2013-09-15 17:18:33 -07:00
byte cltType : 2 ;
byte matType : 2 ;
byte nInjectors : 4 ; //Number of injectors
2013-09-16 00:39:24 -07:00
2013-09-15 17:18:33 -07:00
2013-09-16 00:39:24 -07:00
//config3 in ini
2013-09-15 17:18:33 -07:00
byte engineType : 1 ;
byte egoType : 1 ;
byte algorithm : 1 ; //"Speed Density", "Alpha-N"
byte baroCorr : 1 ;
2013-07-16 05:29:17 -07:00
byte primePulse ;
byte egoRPM ;
byte fastIdleT ; //Fast idle temperature
byte egoSwitch ;
byte taeColdM ;
2014-02-06 01:48:19 -08:00
byte tpsMin ;
byte tpsMax ;
2013-09-15 05:39:55 -07:00
byte unused1 ;
2014-02-06 01:48:19 -08:00
//48
2013-07-16 05:29:17 -07:00
} ;
//Page 2 of the config - See the ini file for further reference
//This mostly covers off variables that are required for ignition
struct config2 {
2013-07-16 05:31:01 -07:00
byte triggerAngle ;
2013-07-16 05:29:17 -07:00
byte FixAng ;
byte Trim ;
byte CrankAng ;
byte IgHold ;
2013-09-26 04:23:22 -07:00
byte Trig_plus : 2 ;
byte TrigCrank : 1 ;
byte IgInv : 1 ;
byte oddfire : 4 ;
2013-07-16 05:29:17 -07:00
byte IdleAdv ;
byte IdleAdvTPS ;
byte IdleAdvRPM ;
2014-08-25 05:03:57 -07:00
byte IdleAdvCLT ; //The temperature below which the idle is advanced
2013-07-16 05:29:17 -07:00
byte IdleDelayTime ;
2014-08-25 05:03:57 -07:00
byte StgCycles ; //The number of initial cycles before the ignition should fire when first cranking
2013-07-16 05:31:01 -07:00
byte dwellCont ; //Fixed duty dwell control
2014-08-25 05:03:57 -07:00
byte dwellCrank ; //Dwell time whilst cranking
byte dwellRun ; //Dwell time whilst running
2013-07-16 05:29:17 -07:00
byte triggerTeeth ; //The full count of teeth on the trigger wheel if there were no gaps
byte triggerMissingTeeth ; //The size of the tooth gap (ie number of missing teeth)
2013-09-19 03:49:28 -07:00
byte crankRPM ; //RPM below which the engine is considered to be cranking
byte floodClear ; //TPS value that triggers flood clear mode (No fuel whilst cranking)
2014-01-09 22:17:10 -08:00
byte SoftRevLim ; //Soft rev limit (RPM/100)
byte SoftLimRetard ; //Amount soft limit retards (degrees)
byte SoftLimMax ; //Time the soft limit can run
byte HardRevLim ; //Hard rev limit (RPM/100)
2014-02-17 02:54:28 -08:00
byte taeBins [ 4 ] ; //TPS based acceleration enrichment bins (%/s)
2014-02-26 20:17:14 -08:00
byte taeValues [ 4 ] ; //TPS based acceleration enrichment rates (% to add)
byte wueBins [ 10 ] ; //Warmup Enrichment bins (Values are in configTable1)
2014-02-17 02:54:28 -08:00
byte unused115 ;
byte unused116 ;
byte unused117 ;
byte unused118 ;
byte unused119 ;
byte unused120 ;
byte unused121 ;
byte unused122 ;
byte unused123 ;
byte unused124 ;
byte unused125 ;
byte unused126 ;
byte unused127 ;
2013-07-16 05:29:17 -07:00
} ;
2014-09-03 15:19:17 -07:00
//Pin mappings as per the v0.2 shield
# define pinInjector1 8 //Output pin injector 1 is on
# define pinInjector2 9 //Output pin injector 2 is on
# define pinInjector3 10 //Output pin injector 3 is on
# define pinInjector4 11 //Output pin injector 4 is on
2014-12-18 16:25:53 -08:00
# define pinCoil1 28 //Pin for coil 1
# define pinCoil2 24 //Pin for coil 2
# define pinCoil3 40 //Pin for coil 3
# define pinCoil4 36 //Pin for coil 4
2014-09-03 15:19:17 -07:00
# define pinTrigger 20 //The CAS pin
# define pinTrigger2 21 //The Cam Sensor pin
# define pinTPS A2 //TPS input pin
# define pinMAP A3 //MAP sensor pin
# define pinIAT A0 //IAT sensor pin
# define pinCLT A1 //CLS sensor pin
# define pinO2 A8 //O2 Sensor pin
# define pinBat A4 //O2 Sensor pin
//Pin mappings as per the v0.1 shield
/*
# define pinInjector1 8 //Output pin injector 1 is on
# define pinInjector2 9 //Output pin injector 2 is on
# define pinInjector3 11 //Output pin injector 3 is on
# define pinInjector4 10 //Output pin injector 4 is on
# define pinCoil1 6 //Pin for coil 1
# define pinCoil2 7 //Pin for coil 2
# define pinCoil3 12 //Pin for coil 3
# define pinCoil4 13 //Pin for coil 4
# define pinTrigger 2 //The CAS pin
# define pinTPS A0 //TPS input pin
# define pinMAP A1 //MAP sensor pin
# define pinIAT A2 //IAT sensor pin
# define pinCLT A3 //CLS sensor pin
# define pinO2 A4 //O2 Sensor pin
*/