Basework for new DB board

This commit is contained in:
Josh Stewart 2019-12-15 09:55:46 +11:00
parent 9d89012c3b
commit fbbeb8a7a1
5 changed files with 174 additions and 55 deletions

View File

@ -13,7 +13,7 @@ platform=atmelavr
board=megaatmega2560
framework=arduino
build_unflags = -Os
build_flags = -O3 -ffast-math -Wall -Wextra
build_flags = -O3 -ffast-math -Wall -Wextra -std=c99
lib_deps = EEPROM
[env:teensy35]
@ -22,6 +22,13 @@ board=teensy35
framework=arduino
lib_deps = EEPROM, FlexCAN
[env:DropBearT]
platform=teensy
board=teensy35
framework=arduino
lib_deps = EEPROM, FlexCAN
build_flags = -DUSE_MC33810
[env:teensy40]
platform=teensy
board=teensy40
@ -91,6 +98,9 @@ upload_protocol = sam-ba
;lib_deps = EEPROM
;build_flags = -fpermissive -std=gnu++11 -DUSE_STM32GENERIC -DMENU_USB_SERIAL
[env:custom_monitor_speedrate]
monitor_speed = 115200
[platformio]
src_dir=speeduino
default_envs = megaatmega2560
@ -100,3 +110,6 @@ default_envs = megaatmega2560
;env_default = LaunchPad_tm4c1294ncpdt
;env_default = genericSTM32F103RB
;env_default = bluepill_f103c8
monitor_speed = 115200

View File

@ -1064,6 +1064,11 @@ byte pinIgnBypass; //The pin used for an ignition bypass (Optional)
byte pinFlex; //Pin with the flex sensor attached
byte pinBaro; //Pin that an external barometric pressure sensor is attached to (If used)
byte pinResetControl; // Output pin used control resetting the Arduino
#ifdef USE_MC33810
//If the MC33810 IC\s are in use, these are the chip select pins
byte pinMC33810_1_CS;
byte pinMC33810_2_CS;
#endif
/* global variables */ // from speeduino.ino
extern struct statuses currentStatus; // from speeduino.ino

View File

@ -17,7 +17,7 @@
#include BOARD_H //Note that this is not a real file, it is defined in globals.h.
void initialiseAll()
{
{
pinMode(LED_BUILTIN, OUTPUT);
digitalWrite(LED_BUILTIN, LOW);
table3D_setSize(&fuelTable, 16);
@ -31,7 +31,7 @@ void initialiseAll()
table3D_setSize(&trim2Table, 6);
table3D_setSize(&trim3Table, 6);
table3D_setSize(&trim4Table, 6);
loadConfig();
doUpdates(); //Check if any data items need updating (Occurs with firmware updates)
@ -233,7 +233,7 @@ void initialiseAll()
}
else
{
/*
/*
* The highest sea-level pressure on Earth occurs in Siberia, where the Siberian High often attains a sea-level pressure above 105 kPa;
* with record highs close to 108.5 kPa.
* The lowest measurable sea-level pressure is found at the centers of tropical cyclones and tornadoes, with a record low of 87 kPa;
@ -878,7 +878,6 @@ void initialiseAll()
setFuelSchedule4(100, (primingValue * 100 * 5));
}
initialisationComplete = true;
digitalWrite(LED_BUILTIN, HIGH);
}
@ -1660,6 +1659,41 @@ void setPinMapping(byte boardID)
pinSpareLOut1 = 21; //low current output spare1
break;
#endif
case 55:
//Pin mappings for the DropBear
pinTrigger = 19; //The CAS pin
pinTrigger2 = 18; //The Cam Sensor pin
pinFlex = A16; // Flex sensor
pinTPS = A22; //TPS input pin
pinMAP = A1; //MAP sensor pin
pinBaro = A0; //Baro sensor pin
pinIAT = A19; //IAT sensor pin
pinCLT = A20; //CLS sensor pin
pinO2 = A21; //O2 Sensor pin
pinO2_2 = A18; //Spare 2
pinBat = A14; //Battery reference voltage pin
pinSpareTemp1 = A17; //spare Analog input 1
pinLaunch = A15; //Can be overwritten below
pinTachOut = 7; //Tacho output pin
pinIdle1 = 27; //Single wire idle control
pinIdle2 = 29; //2 wire idle control. Shared with Spare 1 output
pinFuelPump = 8; //Fuel pump output
pinVVT_1 = 28; //Default VVT output
pinStepperDir = 32; //Direction pin for DRV8825 driver
pinStepperStep = 31; //Step pin for DRV8825 driver
pinStepperEnable = 30; //Enable pin for DRV8825 driver
pinBoost = 24; //Boost control
pinSpareLOut1 = 29; //low current output spare1
pinSpareLOut2 = 26; //low current output spare2
pinSpareLOut3 = 28; //low current output spare3
pinSpareLOut4 = 29; //low current output spare4
pinFan = 25; //Pin for the fan output
pinResetControl = 46; //Reset control output PLACEHOLDER value for now
pinMC33810_1_CS = 10;
pinMC33810_2_CS = 9;
break;
#if defined(STM32F4)
case 60:
@ -1978,25 +2012,15 @@ void setPinMapping(byte boardID)
/* Reset control is a special case. If reset control is enabled, it needs its initial state set BEFORE its pinMode.
If that doesn't happen and reset control is in "Serial Command" mode, the Arduino will end up in a reset loop
because the control pin will go low as soon as the pinMode is set to OUTPUT. */
if ( (configPage4.resetControl != 0) && (configPage4.resetControlPin < BOARD_NR_GPIO_PINS) )
if ( (configPage4.resetControlConfig != 0) && (configPage4.resetControlPin < BOARD_NR_GPIO_PINS) )
{
resetControl = configPage4.resetControl;
resetControl = configPage4.resetControlConfig;
pinResetControl = pinTranslate(configPage4.resetControlPin);
setResetControlPinState();
pinMode(pinResetControl, OUTPUT);
}
//Finally, set the relevant pin modes for outputs
pinMode(pinCoil1, OUTPUT);
pinMode(pinCoil2, OUTPUT);
pinMode(pinCoil3, OUTPUT);
pinMode(pinCoil4, OUTPUT);
pinMode(pinCoil5, OUTPUT);
pinMode(pinInjector1, OUTPUT);
pinMode(pinInjector2, OUTPUT);
pinMode(pinInjector3, OUTPUT);
pinMode(pinInjector4, OUTPUT);
pinMode(pinInjector5, OUTPUT);
pinMode(pinTachOut, OUTPUT);
pinMode(pinIdle1, OUTPUT);
pinMode(pinIdle2, OUTPUT);
@ -2012,39 +2036,59 @@ void setPinMapping(byte boardID)
//This is a legacy mode option to revert the MAP reading behaviour to match what was in place prior to the 201905 firmware
if(configPage2.legacyMAP > 0) { digitalWrite(pinMAP, HIGH); }
inj1_pin_port = portOutputRegister(digitalPinToPort(pinInjector1));
inj1_pin_mask = digitalPinToBitMask(pinInjector1);
inj2_pin_port = portOutputRegister(digitalPinToPort(pinInjector2));
inj2_pin_mask = digitalPinToBitMask(pinInjector2);
inj3_pin_port = portOutputRegister(digitalPinToPort(pinInjector3));
inj3_pin_mask = digitalPinToBitMask(pinInjector3);
inj4_pin_port = portOutputRegister(digitalPinToPort(pinInjector4));
inj4_pin_mask = digitalPinToBitMask(pinInjector4);
inj5_pin_port = portOutputRegister(digitalPinToPort(pinInjector5));
inj5_pin_mask = digitalPinToBitMask(pinInjector5);
inj6_pin_port = portOutputRegister(digitalPinToPort(pinInjector6));
inj6_pin_mask = digitalPinToBitMask(pinInjector6);
inj7_pin_port = portOutputRegister(digitalPinToPort(pinInjector7));
inj7_pin_mask = digitalPinToBitMask(pinInjector7);
inj8_pin_port = portOutputRegister(digitalPinToPort(pinInjector8));
inj8_pin_mask = digitalPinToBitMask(pinInjector8);
#ifndef USE_MC33810
pinMode(pinCoil1, OUTPUT);
pinMode(pinCoil2, OUTPUT);
pinMode(pinCoil3, OUTPUT);
pinMode(pinCoil4, OUTPUT);
pinMode(pinCoil5, OUTPUT);
pinMode(pinInjector1, OUTPUT);
pinMode(pinInjector2, OUTPUT);
pinMode(pinInjector3, OUTPUT);
pinMode(pinInjector4, OUTPUT);
pinMode(pinInjector5, OUTPUT);
ign1_pin_port = portOutputRegister(digitalPinToPort(pinCoil1));
ign1_pin_mask = digitalPinToBitMask(pinCoil1);
ign2_pin_port = portOutputRegister(digitalPinToPort(pinCoil2));
ign2_pin_mask = digitalPinToBitMask(pinCoil2);
ign3_pin_port = portOutputRegister(digitalPinToPort(pinCoil3));
ign3_pin_mask = digitalPinToBitMask(pinCoil3);
ign4_pin_port = portOutputRegister(digitalPinToPort(pinCoil4));
ign4_pin_mask = digitalPinToBitMask(pinCoil4);
ign5_pin_port = portOutputRegister(digitalPinToPort(pinCoil5));
ign5_pin_mask = digitalPinToBitMask(pinCoil5);
ign6_pin_port = portOutputRegister(digitalPinToPort(pinCoil6));
ign6_pin_mask = digitalPinToBitMask(pinCoil6);
ign7_pin_port = portOutputRegister(digitalPinToPort(pinCoil7));
ign7_pin_mask = digitalPinToBitMask(pinCoil7);
ign8_pin_port = portOutputRegister(digitalPinToPort(pinCoil8));
ign8_pin_mask = digitalPinToBitMask(pinCoil8);
inj1_pin_port = portOutputRegister(digitalPinToPort(pinInjector1));
inj1_pin_mask = digitalPinToBitMask(pinInjector1);
inj2_pin_port = portOutputRegister(digitalPinToPort(pinInjector2));
inj2_pin_mask = digitalPinToBitMask(pinInjector2);
inj3_pin_port = portOutputRegister(digitalPinToPort(pinInjector3));
inj3_pin_mask = digitalPinToBitMask(pinInjector3);
inj4_pin_port = portOutputRegister(digitalPinToPort(pinInjector4));
inj4_pin_mask = digitalPinToBitMask(pinInjector4);
inj5_pin_port = portOutputRegister(digitalPinToPort(pinInjector5));
inj5_pin_mask = digitalPinToBitMask(pinInjector5);
inj6_pin_port = portOutputRegister(digitalPinToPort(pinInjector6));
inj6_pin_mask = digitalPinToBitMask(pinInjector6);
inj7_pin_port = portOutputRegister(digitalPinToPort(pinInjector7));
inj7_pin_mask = digitalPinToBitMask(pinInjector7);
inj8_pin_port = portOutputRegister(digitalPinToPort(pinInjector8));
inj8_pin_mask = digitalPinToBitMask(pinInjector8);
ign1_pin_port = portOutputRegister(digitalPinToPort(pinCoil1));
ign1_pin_mask = digitalPinToBitMask(pinCoil1);
ign2_pin_port = portOutputRegister(digitalPinToPort(pinCoil2));
ign2_pin_mask = digitalPinToBitMask(pinCoil2);
ign3_pin_port = portOutputRegister(digitalPinToPort(pinCoil3));
ign3_pin_mask = digitalPinToBitMask(pinCoil3);
ign4_pin_port = portOutputRegister(digitalPinToPort(pinCoil4));
ign4_pin_mask = digitalPinToBitMask(pinCoil4);
ign5_pin_port = portOutputRegister(digitalPinToPort(pinCoil5));
ign5_pin_mask = digitalPinToBitMask(pinCoil5);
ign6_pin_port = portOutputRegister(digitalPinToPort(pinCoil6));
ign6_pin_mask = digitalPinToBitMask(pinCoil6);
ign7_pin_port = portOutputRegister(digitalPinToPort(pinCoil7));
ign7_pin_mask = digitalPinToBitMask(pinCoil7);
ign8_pin_port = portOutputRegister(digitalPinToPort(pinCoil8));
ign8_pin_mask = digitalPinToBitMask(pinCoil8);
#else
mc33810_1_pin_port = portOutputRegister(pinMC33810_1_CS);
mc33810_1_pin_mask = digitalPinToBitMask(pinMC33810_1_CS);
mc33810_2_pin_port = portOutputRegister(pinMC33810_2_CS);
mc33810_2_pin_mask = digitalPinToBitMask(pinMC33810_2_CS);
initMC33810();
#endif
tach_pin_port = portOutputRegister(digitalPinToPort(pinTachOut));
tach_pin_mask = digitalPinToBitMask(pinTachOut);

View File

@ -2,7 +2,14 @@
#define SCHEDULEDIO_H
//If coil inverse is on, set the output low, else set it high
//#define beginCoil1Charge() { configPage4.IgInv == 1 ? *ign1_pin_port &= ~(ign1_pin_mask); : *ign1_pin_port |= (ign1_pin_mask); } TACH_PULSE_LOW();
//#define beginCoil1Charge() { configPage4.IgInv == 1 ? coil1Low(); : coil1High(); } tachoOutputFlag = READY;
//#define beginCoil2Charge() { configPage4.IgInv == 1 ? coil2Low(); : coil2High(); } tachoOutputFlag = READY;
//#define beginCoil3Charge() { configPage4.IgInv == 1 ? coil3Low(); : coil3High(); } tachoOutputFlag = READY;
//#define beginCoil4Charge() { configPage4.IgInv == 1 ? coil4Low(); : coil4High(); } tachoOutputFlag = READY;
//#define beginCoil5Charge() { configPage4.IgInv == 1 ? coil5Low(); : coil5High(); } tachoOutputFlag = READY;
//#define beginCoil6Charge() { configPage4.IgInv == 1 ? coil6Low(); : coil6High(); } tachoOutputFlag = READY;
//#define beginCoil7Charge() { configPage4.IgInv == 1 ? coil7Low(); : coil7High(); } tachoOutputFlag = READY;
//#define beginCoil8Charge() { configPage4.IgInv == 1 ? coil8Low(); : coil8High(); } tachoOutputFlag = READY;
inline void beginCoil1Charge();
inline void endCoil1Charge();
@ -38,8 +45,14 @@ void beginCoil1and3Charge();
void endCoil1and3Charge();
void beginCoil2and4Charge();
void endCoil2and4Charge();
/*
#define beginCoil1and3Charge() beginCoil1Charge(); beginCoil3Charge()
#define endCoil1and3Charge()
#define beginCoil2and4Charge() beginCoil2Charge(); beginCoil4Charge()
#define endCoil2and4Charge();
*/
#ifndef USE_MC33810
#define openInjector1() *inj1_pin_port |= (inj1_pin_mask); BIT_SET(currentStatus.status1, BIT_STATUS1_INJ1)
#define closeInjector1() *inj1_pin_port &= ~(inj1_pin_mask); BIT_CLEAR(currentStatus.status1, BIT_STATUS1_INJ1)
#define openInjector2() *inj2_pin_port |= (inj2_pin_mask); BIT_SET(currentStatus.status1, BIT_STATUS1_INJ2)
@ -50,7 +63,6 @@ void endCoil2and4Charge();
#define closeInjector4() *inj4_pin_port &= ~(inj4_pin_mask); BIT_CLEAR(currentStatus.status1, BIT_STATUS1_INJ4)
#define openInjector5() *inj5_pin_port |= (inj5_pin_mask)
#define closeInjector5() *inj5_pin_port &= ~(inj5_pin_mask)
//Dynamic functions below
#define openInjector6() *inj6_pin_port |= (inj6_pin_mask);
#define closeInjector6() *inj6_pin_port &= ~(inj6_pin_mask);
#define openInjector7() *inj7_pin_port |= (inj7_pin_mask);
@ -58,6 +70,27 @@ void endCoil2and4Charge();
#define openInjector8() *inj8_pin_port |= (inj8_pin_mask);
#define closeInjector8() *inj8_pin_port &= ~(inj8_pin_mask);
#else
#include "acc_mc33810.h"
#define openInjector1() openInjector1_MC33810()
#define closeInjector1() closeInjector1_MC33810()
#define openInjector2() openInjector2_MC33810()
#define closeInjector2() closeInjector2_MC33810()
#define openInjector3() openInjector3_MC33810()
#define closeInjector3() closeInjector3_MC33810()
#define openInjector4() openInjector4_MC33810()
#define closeInjector4() closeInjector4_MC33810()
#define openInjector5() openInjector5_MC33810()
#define closeInjector5() closeInjector5_MC33810()
#define openInjector6() openInjector6_MC33810()
#define closeInjector6() closeInjector6_MC33810()
#define openInjector7() openInjector7_MC33810()
#define closeInjector7() closeInjector7_MC33810()
#define openInjector8() openInjector8_MC33810()
#define closeInjector8() closeInjector8_MC33810()
#endif
#define openInjector1and4() openInjector1(); openInjector4()
#define closeInjector1and4() closeInjector1(); closeInjector4()
#define openInjector2and3() openInjector2(); openInjector3()
@ -67,6 +100,7 @@ void endCoil2and4Charge();
#define openInjector3and5() openInjector3(); openInjector5()
#define closeInjector3and5() closeInjector3(); closeInjector5()
#ifndef USE_MC33810
#define coil1Low() (*ign1_pin_port &= ~(ign1_pin_mask))
#define coil1High() (*ign1_pin_port |= (ign1_pin_mask))
#define coil2Low() (*ign2_pin_port &= ~(ign2_pin_mask))
@ -75,6 +109,32 @@ void endCoil2and4Charge();
#define coil3High() (*ign3_pin_port |= (ign3_pin_mask))
#define coil4Low() (*ign4_pin_port &= ~(ign4_pin_mask))
#define coil4High() (*ign4_pin_port |= (ign4_pin_mask))
#define coil5Low() (*ign5_pin_port &= ~(ign5_pin_mask))
#define coil5High() (*ign5_pin_port |= (ign5_pin_mask))
#define coil6Low() (*ign6_pin_port &= ~(ign6_pin_mask))
#define coil6High() (*ign6_pin_port |= (ign6_pin_mask))
#define coil7Low() (*ign7_pin_port &= ~(ign7_pin_mask))
#define coil7High() (*ign7_pin_port |= (ign7_pin_mask))
#define coil8Low() (*ign8_pin_port &= ~(ign8_pin_mask))
#define coil8High() (*ign8_pin_port |= (ign8_pin_mask))
#else
#define coil1Low() coil1Low_MC33810()
#define coil1High() coil1High_MC33810()
#define coil2Low() coil2Low_MC33810()
#define coil2High() coil2High_MC33810()
#define coil3Low() coil3Low_MC33810()
#define coil3High()coil3High_MC33810()
#define coil4Low() coil4Low_MC33810()
#define coil4High() coil4High_MC33810()
#define coil5Low() coil5Low_MC33810()
#define coil5High() coil5High_MC33810()
#define coil6Low() coil6Low_MC33810()
#define coil6High() coil6High_MC33810()
#define coil7Low() coil7Low_MC33810()
#define coil7High() coil7High_MC33810()
#define coil8Low() coil8Low_MC33810()
#define coil8High() coil8High_MC33810()
#endif
void nullCallback();

View File

@ -71,9 +71,6 @@ void setFuelSchedule(struct Schedule *targetSchedule, unsigned long timeout, uns
{
if(targetSchedule->Status != RUNNING) //Check that we're not already part way through a schedule
{
//Callbacks no longer used, but retained for now:
//fuelSchedule1.StartCallback = startCallback;
//fuelSchedule1.EndCallback = endCallback;
targetSchedule->duration = duration;
//Need to check that the timeout doesn't exceed the overflow