PJSC(Pump Jet Solenoid Controller)はArduinoを使用したバイク用燃料噴射コントローラです。このプロジェクトは、オープンソースECUプロジェクト『Speeduino』をベースにしています。
Based on Speeduino Feb.2019 version.
Support dual fuel load.
| @@ -6,7 +6,7 @@ | ||
| 6 | 6 | MTversion = 2.25 |
| 7 | 7 | |
| 8 | 8 | queryCommand = "Q" |
| 9 | - signature = "speeduino - PJSC v1.0" ;[PJSC] | |
| 9 | + signature = "speeduino - PJSC v1.10" ;[PJSC] | |
| 10 | 10 | versionInfo = "S" ;This info is what is displayed to user |
| 11 | 11 | |
| 12 | 12 | [TunerStudio] |
| @@ -152,9 +152,10 @@ | ||
| 152 | 152 | |
| 153 | 153 | endianness = little |
| 154 | 154 | ;[PJSC] nPages = 10 |
| 155 | -;[PJSC] pageSize = 288, 128, 288, 128, 288, 128, 240, 192, 192, 192 | |
| 155 | + ;pageSize = 288, 128, 288, 128, 288, 128, 240, 192, 192, 192 | |
| 156 | +;[PJSC] pageSize = 128, 288, 288, 128, 288, 128, 240, 192, 192, 192 | |
| 156 | 157 | nPages = 11 ;[PJSC] |
| 157 | - pageSize = 288, 128, 288, 128, 288, 128, 240, 192, 192, 192, 288 ;[PJSC] | |
| 158 | + pageSize = 128, 288, 288, 128, 288, 128, 240, 192, 192, 192, 288 ;[PJSC] | |
| 158 | 159 | |
| 159 | 160 | ;burnCommand = "B" |
| 160 | 161 | ;pageActivate = "P\001", "P\002", "P\003", "P\004", "P\005", "P\006", "P\007", "P\010", "P\011", "P\012", "P\013" |
| @@ -191,7 +192,7 @@ | ||
| 191 | 192 | #define PIN_OUT16inv = "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID" |
| 192 | 193 | #define PIN_16inv = "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID" |
| 193 | 194 | |
| 194 | - #define ANALOG_PIN = "A0", "A1", "A2", "A3", "A4", "A5", "A6", "A7", "A8", "A8", "A10", "A11", "A12", "A13", "A14", "A15", $PIN_16inv, $PIN_16inv, $PIN_16inv | |
| 195 | + #define ANALOG_PIN = "A0", "A1", "A2", "A3", "A4", "A5", "A6", "A7", "A8", "A9", "A10", "A11", "A12", "A13", "A14", "A15", $PIN_16inv, $PIN_16inv, $PIN_16inv | |
| 195 | 196 | #define DIGITAL_PIN = "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35", "36", "37", "38", "39", "40", "41", "42", "43", "44", "45", "46", "47", "48", "49", "50", "51", "52", "53", "54", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID" |
| 196 | 197 | #define ANALOG_DIG_PIN_LIST = $DIGITAL_PIN, $ANALOG_PIN |
| 197 | 198 | #define tsCanId_list = "CAN ID 0", "CAN ID 1", "CAN ID 2", "CAN ID 3", "CAN ID 4", "CAN ID 5", "CAN ID 6", "CAN ID 7", "CAN ID 8", "CAN ID 9", "CAN ID 10","CAN ID 11","CAN ID 12","CAN ID 13","CAN ID 14","INVALID" |
| @@ -206,23 +207,13 @@ | ||
| 206 | 207 | #define CAN_ADDRESS_HEX_07XX = "0x700", "0x701", "0x702", "0x703", "0x704", "0x705", "0x706", "0x707", "0x708", "0x709", "0x70A", "0x70B", "0x70C", "0x70D", "0x70E", "0x70F", "0x710", "0x711", "0x712", "0x713", "0x714", "0x715", "0x716", "0x717", "0x718", "0x719", "0x71A", "0x71B", "0x71C", "0x71D", "0x71E", "0x71F", "0x720", "0x721", "0x722", "0x723", "0x724", "0x725", "0x726", "0x727", "0x728", "0x729", "0x72A", "0x72B", "0x72C", "0x72D", "0x72E", "0x72F", "0x730", "0x731", "0x732", "0x733", "0x734", "0x735", "0x736", "0x737", "0x738", "0x739", "0x73A", "0x73B", "0x73C", "0x73D", "0x73E", "0x73F", "0x740", "0x741", "0x742", "0x743", "0x744", "0x745", "0x746", "0x747", "0x748", "0x749", "0x74A", "0x74B", "0x74C", "0x74D", "0x74E", "0x74F", "0x750", "0x751", "0x752", "0x753", "0x754", "0x755", "0x756", "0x757", "0x758", "0x759", "0x75A", "0x75B", "0x75C", "0x75D", "0x75E", "0x75F" ,"0x760", "0x761", "0x762", "0x763", "0x764", "0x765", "0x766", "0x767", "0x768", "0x769", "0x76A", "0x76B", "0x76C", "0x76D", "0x76E", "0x76F", "0x770", "0x771", "0x772", "0x773", "0x774", "0x775", "0x776", "0x777", "0x778", "0x779", "0x77A", "0x77B", "0x77C", "0x77D", "0x77E", "0x77F", "0x780", "0x781", "0x782", "0x783", "0x784", "0x785", "0x786", "0x787", "0x788", "0x789", "0x78A", "0x78B", "0x78C", "0x78D", "0x78E", "0x78F" ,"0x790", "0x791", "0x792", "0x793", "0x794", "0x795", "0x796", "0x797", "0x798", "0x799", "0x79A", "0x79B", "0x79C", "0x79D", "0x79E", "0x79F", "0x7A0", "0x7A1", "0x7A2", "0x7A3", "0x7A4", "0x7A5", "0x7A6", "0x7A7", "0x7A8", "0x7A9", "0x7AA", "0x7AB", "0x7AC", "0x7AD", "0x7AE", "0x7AF", "0x7B0", "0x7B1", "0x7B2", "0x7B3", "0x7B4", "0x7B5", "0x7B6", "0x7B7", "0x7B8", "0x7B9", "0x7BA", "0x7BB", "0x7BC", "0x7BD", "0x7BE", "0x7BF" ,"0x7C0", "0x7C1", "0x7C2", "0x7C3", "0x7C4", "0x7C5", "0x7C6", "0x7C7", "0x7C8", "0x7C9", "0x7CA", "0x7CB", "0x7CC", "0x7CD", "0x7CE", "0x7CF", "0x7D0", "0x7D1", "0x7D2", "0x7D3", "0x7D4", "0x7D5", "0x7D6", "0x7D7", "0x7D8", "0x7D9", "0x7DA", "0x7DB", "0x7DC", "0x7DD", "0x7DE", "0x7DF", "0x7E0", "0x7E1", "0x7E2", "0x7E3", "0x7E4", "0x7E5", "0x7E6", "0x7E7", "0x7E8", "0x7E9", "0x7EA", "0x7EB", "0x7EC", "0x7ED", "0x7EE", "0x7EF" ,"0x7F0", "0x7F1", "0x7F2", "0x7F3", "0x7F4", "0x7F5", "0x7F6", "0x7F7", "0x7F8", "0x7F9", "0x7FA", "0x7FB", "0x7FC", "0x7FD", "0x7FE", "0x7FF" |
| 207 | 208 | #define CAN_ADDRESS_HEX = $CAN_ADDRESS_HEX_01XX, $CAN_ADDRESS_HEX_02XX, $CAN_ADDRESS_HEX_03XX, $CAN_ADDRESS_HEX_04XX, $CAN_ADDRESS_HEX_05XX, $CAN_ADDRESS_HEX_06XX, $CAN_ADDRESS_HEX_07XX, $CAN_ADDRESS_HEX_inv255 |
| 208 | 209 | |
| 209 | -;Page 1 is the fuel map and axis bins only | |
| 210 | -page = 1 | |
| 211 | - ; name = bits, type, offset, bits | |
| 212 | - ; name = array, type, offset, shape, units, scale, translate, lo, hi, digits | |
| 213 | - ; name = scalar, type, offset, units, scale, translate, lo, hi, digits | |
| 214 | - veTable = array, U08, 0, [16x16],"%", 1.0, 0.0, 0.0, 255.0, 0 | |
| 215 | - rpmBins = array, U08, 256, [ 16], "RPM", 100.0, 0.0, 100.0, 25500.0, 0 | |
| 216 | - fuelLoadBins = array, U08, 272, [ 16], { bitStringValue(algorithmUnits , algorithm) }, 2.0, 0.0, 0.0, {fuelLoadMax}, 0 | |
| 217 | - ;fuelLoadBins = array, U08, 272, [ 16], { bitStringValue(algorithmUnits , algorithm) }, 2.0, 0.0, 0.0, { arrayValue(rpmBins , algorithm) }, 0 | |
| 218 | 210 | |
| 219 | 211 | |
| 220 | - | |
| 221 | 212 | ;-------------------------------------------------- |
| 222 | -;Start Page 2 | |
| 223 | -;Page 2 is all general settings (Previously part of page 1) | |
| 213 | +;Start Page 1 | |
| 214 | +;Page 1 is all general settings. Note that some of these (algorithm and ignAlgorithm) MUST come before their use in the bitStringValue() calls in the fuel and ignition tables | |
| 224 | 215 | ;-------------------------------------------------- |
| 225 | -page = 2 | |
| 216 | +page = 1 | |
| 226 | 217 | unused2-1 = scalar, S08, 0, "kPa", 1.0, 0.0, -127, 127, 0 |
| 227 | 218 | unused2-2 = scalar, U08, 1, "kPa", 1.0, 0.0, 0.0, 255, 0 |
| 228 | 219 | asePct = scalar, U08, 2, "%", 1.0, 0.0, 0.0, 95.0, 0 |
| @@ -230,7 +221,7 @@ | ||
| 230 | 221 | wueRates = array, U08, 4, [10], "%", 1.0, 0.0, 0.0, 255, 0 |
| 231 | 222 | crankingPct = scalar, U08, 14, "%", 1.0, 0.0, 0.0, 255, 0 |
| 232 | 223 | ;[PJSC] pinLayout = bits, U08, 15, [0:7], "Speeduino v0.1", "Speeduino v0.2", "Speeduino v0.3", "Speeduino v0.4", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "NA6 MX5 PNP", "Turtana PCB", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "Plazomat I/O 0.1", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "Daz V6 Shield 0.1", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "NO2C", "UA4C", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "dvjcodec Teensy RevA", "dvjcodec Teensy RevB", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID" |
| 233 | - pinLayout = bits, U08, 15, [0:7], "Speeduino v0.1", "Speeduino v0.2", "Speeduino v0.3", "Speeduino v0.4", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "NA6 MX5 PNP", "Turtana PCB", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "Plazomat I/O 0.1", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "Daz V6 Shield 0.1", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "NO2C", "UA4C", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "dvjcodec Teensy RevA", "dvjcodec Teensy RevB", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "PJSC v1.0", "PJSC v0.2", "PJSC v0.3", "PJSC v0.4", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID" ;[PJSC] Boad ID: PJSC boad ver1.0/0.2/0.3 (2018/20/19) | |
| 224 | + pinLayout = bits, U08, 15, [0:7], "Speeduino v0.1", "Speeduino v0.2", "Speeduino v0.3", "Speeduino v0.4", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "NA6 MX5 PNP", "Turtana PCB", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "Plazomat I/O 0.1", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "Daz V6 Shield 0.1", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "NO2C", "UA4C", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "dvjcodec Teensy RevA", "dvjcodec Teensy RevB", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "PJSC v1.0", "PJSC v0.2", "PJSC v0.3", "PJSC v0.4", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID" ;[PJSC] Boad ID: PJSC boad ver1.0/0.2/0.3 (2018/20/19) | |
| 234 | 225 | tachoPin = bits, U08, 16, [0:5], "Board Default", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35", "36", "37", "38", "39", "40", "41", "42", "43", "44", "45", "46", "47", "48", "49", "50", "51", "52", "53", "54", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID" |
| 235 | 226 | tachoDiv = bits, U08, 16, [6:7], "Normal", "Half", "INVALID", "INVALID" |
| 236 | 227 | unused2-17 = scalar, U08, 17, "ms", 0.1, 0.0, 0.0, 25.5, 1 |
| @@ -315,53 +306,67 @@ | ||
| 315 | 306 | baroMax = scalar, U16, 65, "kpa", 1.0, 0.0, 0.0, 25500, 0 |
| 316 | 307 | EMAPMin = scalar, S08, 67, "kpa", 1.0, 0.0, -100, 127.0, 0 |
| 317 | 308 | EMAPMax = scalar, U16, 68, "kpa", 1.0, 0.0, 0.0, 25500, 0 |
| 318 | -;[PJSC] unused2-67 = array, U08, 70, [57], "%", 1.0, 0.0, 0.0, 255, 0 | |
| 319 | - pjscFreq = scalar, U08, 70, "Hz", 2.0, 0.0, 10, 511, 0 ;[PJSC] | |
| 320 | - exValvePosMin = scalar, U08, 71, "ADC", 1.0, 0.0, 0.0, 255.0, 0 ; | | |
| 321 | - exValvePosMax = scalar, U08, 72, "ADC", 1.0, 0.0, 0.0, 255.0, 0 ; | | |
| 322 | - exTrigHysteresis = scalar, U08, 73, "deg", 1.0, 0.0, 0.0, 255.0, 0 ; V | |
| 323 | - squirtDeviceType = bits, U08, 74, [0:0], "Injector", "Solenoid valve" ;[PJSC] | |
| 324 | - multiVEmapEnabled = bits, U08, 74, [1:2], "Disable", "Separate", "Switching", "Dual Fuel Load" ;[PJSC v1.10] For Dual Fuel Load | |
| 325 | - exTrigModeSelect = bits, U08, 74, [3:4], "Disable", "Spark timing capture", "MAP select switch", "INVALID" ;[PJSC] | |
| 326 | - externalTrigEdge = bits, U08, 74, [5:5], "Rising", "Falling" ; | | |
| 327 | - exValveCaptureEnabled = bits, U08, 74, [6:6], "Disable", "Exhaust Valve Position capture" ; | | |
| 328 | - dutyPulseCaptureEnabled = bits, U08, 74, [7:7], "Disable", "PWM input" ; | | |
| 329 | - dutyPulseCaptureEnabled2 = bits, U08, 75, [0:0], "Disable", "PWM input" ; | | |
| 330 | - dutyPulseOnLevel = bits, U08, 75, [1:1], "High", "Low" ; | | |
| 331 | - dutyPulseOnLevel2 = bits, U08, 75, [2:2], "High", "Low" ; V | |
| 332 | - exValveCalibrationMode = bits, U08, 75, [3:3], "Off", "On" ;[PJSC] | |
| 333 | - algorithm2 = bits, U08, 75, [4:6], $loadSourceNames ;[PJSC v1.10] For Dual Fuel Load | |
| 334 | - secondaryFuelUsage = bits, U08, 75, [7:7], "additive", "multiplicitive" ;[PJSC v1.10] For Dual Fuel Load | |
| 335 | - veMapSelection1 = bits, U08, 76, [0:7], "VE Table 1","VE Table 2","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID" | |
| 336 | - veMapSelection2 = bits, U08, 77, [0:7], "VE Table 1","VE Table 2","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID" | |
| 337 | - veMapSelection3 = bits, U08, 78, [0:7], "VE Table 1","VE Table 2","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID" | |
| 338 | - veMapSelection4 = bits, U08, 79, [0:7], "VE Table 1","VE Table 2","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID" | |
| 339 | - veMapSelection1_2 = bits, U08, 80, [0:7], "VE Table 1","VE Table 2","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID" | |
| 340 | - veMapSelection2_2 = bits, U08, 81, [0:7], "VE Table 1","VE Table 2","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID" | |
| 341 | - veMapSelection3_2 = bits, U08, 82, [0:7], "VE Table 1","VE Table 2","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID" | |
| 342 | - veMapSelection4_2 = bits, U08, 83, [0:7], "VE Table 1","VE Table 2","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID" | |
| 343 | - dutyFreqTst1 = scalar, U08, 84, "Hz", 2.0, 0.0, 10, 511, 0 ;[PJSC v1.10] | |
| 344 | - dutyFreqTst2 = scalar, U08, 85, "Hz", 2.0, 0.0, 10, 511, 0 ;[PJSC v1.10] | |
| 345 | - dutyFreqTst3 = scalar, U08, 86, "Hz", 2.0, 0.0, 10, 511, 0 ;[PJSC v1.10] | |
| 346 | - dutyFreqTst4 = scalar, U08, 87, "Hz", 2.0, 0.0, 10, 511, 0 ;[PJSC v1.10] | |
| 347 | - dutyRatioTst1 = scalar, U08, 88, "%", 1.0, 0.0, 0.0, 100.0, 0 ;[PJSC v1.10] | |
| 348 | - dutyRatioTst2 = scalar, U08, 89, "%", 1.0, 0.0, 0.0, 100.0, 0 ;[PJSC v1.10] | |
| 349 | - dutyRatioTst3 = scalar, U08, 90, "%", 1.0, 0.0, 0.0, 100.0, 0 ;[PJSC v1.10] | |
| 350 | - dutyRatioTst4 = scalar, U08, 91, "%", 1.0, 0.0, 0.0, 100.0, 0 ;[PJSC v1.10] | |
| 351 | - testop_fp = bits, U08, 92, [0:0], "Off", "On" | |
| 352 | - testop_inj = bits, U08, 92, [1:2], "Off", "One", "INVALID", "All" | |
| 353 | - testop_coil = bits, U08, 92, [3:4], "Off", "One", "INVALID", "INVALID" | |
| 354 | - testsel_inj = bits, U08, 92, [5:6], "Inj1", "Inj2", "Inj3", "Inj4" | |
| 355 | - testsel_coil = bits, U08, 92, [7:7], "CoilA", "CoilB" | |
| 356 | - testint = scalar, U16, 93, "ms", 0.01, 0.00, 0, 655.35, 1 | |
| 357 | - testrpm = scalar, U16, 93, "RPM", 1.0, { 60000/testint }, 0, 60000, 0 | |
| 358 | - testpw = scalar, U16, 95, "ms", 0.01, 0.00, 0, 655.35, 1 ; * ( 1 byte) | |
| 359 | - testinjcnt = scalar, U16, 97, "", 1, 0, 0, 65535, 0, noLocalUpdate | |
| 360 | - muxout1selection = bits, U08, 99, [0:3], "Disable", "IDLE control", "Thermo Fan control", "Launch control", "Fuel pump control", "Boost control", "VVT control", "Tach output", "INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID" | |
| 361 | - muxout2selection = bits, U08, 99, [4:7], "Disable", "IDLE control", "Thermo Fan control", "Launch control", "Fuel pump control", "Boost control", "VVT control", "Tach output", "INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID" | |
| 362 | - unused2-100 = array, U08, 100, [28], "%", 1.0, 0.0, 0.0, 255, 0 ;[PJSC v1.10] | |
| 363 | 309 | |
| 310 | + fanWhenOff = bits, U08, 70, [0:0], "No", "Yes" | |
| 311 | + unused_fan_bits = bits, U08, 70,[1:7] | |
| 364 | 312 | |
| 313 | +;[PJSC] unused2-67 = array, U08, 71, [56], "%", 1.0, 0.0, 0.0, 255, 0 | |
| 314 | + pjscFreq = scalar, U08, 71, "Hz", 2.0, 0.0, 10, 511, 0 ;[PJSC] | |
| 315 | + exValvePosMin = scalar, U08, 72, "ADC", 1.0, 0.0, 0.0, 255.0, 0 ; | | |
| 316 | + exValvePosMax = scalar, U08, 73, "ADC", 1.0, 0.0, 0.0, 255.0, 0 ; | | |
| 317 | + exTrigHysteresis = scalar, U08, 74, "deg", 1.0, 0.0, 0.0, 255.0, 0 ; V | |
| 318 | + squirtDeviceType = bits, U08, 75, [0:0], "Injector", "Solenoid valve" ;[PJSC] | |
| 319 | + multiVEmapEnabled = bits, U08, 75, [1:2], "Disable", "Separate", "Switching", "Dual Fuel Load" ;[PJSC v1.10] For Dual Fuel Load | |
| 320 | + exTrigModeSelect = bits, U08, 75, [3:4], "Disable", "Spark timing capture", "MAP select switch", "INVALID" ;[PJSC] | |
| 321 | + externalTrigEdge = bits, U08, 75, [5:5], "Rising", "Falling" ; | | |
| 322 | + exValveCaptureEnabled = bits, U08, 75, [6:6], "Disable", "Exhaust Valve Position capture" ; | | |
| 323 | + dutyPulseCaptureEnabled = bits, U08, 75, [7:7], "Disable", "PWM input" ; | | |
| 324 | + dutyPulseCaptureEnabled2 = bits, U08, 76, [0:0], "Disable", "PWM input" ; | | |
| 325 | + dutyPulseOnLevel = bits, U08, 76, [1:1], "High", "Low" ; | | |
| 326 | + dutyPulseOnLevel2 = bits, U08, 76, [2:2], "High", "Low" ; V | |
| 327 | + exValveCalibrationMode = bits, U08, 76, [3:3], "Off", "On" ;[PJSC] | |
| 328 | + algorithm2 = bits, U08, 76, [4:6], $loadSourceNames ;[PJSC v1.10] For Dual Fuel Load | |
| 329 | + secondaryFuelUsage = bits, U08, 76, [7:7], "additive", "multiplicitive" ;[PJSC v1.10] For Dual Fuel Load | |
| 330 | + veMapSelection1 = bits, U08, 77, [0:7], "VE Table 1","VE Table 2","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID" | |
| 331 | + veMapSelection2 = bits, U08, 78, [0:7], "VE Table 1","VE Table 2","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID" | |
| 332 | + veMapSelection3 = bits, U08, 79, [0:7], "VE Table 1","VE Table 2","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID" | |
| 333 | + veMapSelection4 = bits, U08, 80, [0:7], "VE Table 1","VE Table 2","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID" | |
| 334 | + veMapSelection1_2 = bits, U08, 81, [0:7], "VE Table 1","VE Table 2","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID" | |
| 335 | + veMapSelection2_2 = bits, U08, 82, [0:7], "VE Table 1","VE Table 2","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID" | |
| 336 | + veMapSelection3_2 = bits, U08, 83, [0:7], "VE Table 1","VE Table 2","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID" | |
| 337 | + veMapSelection4_2 = bits, U08, 84, [0:7], "VE Table 1","VE Table 2","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID" | |
| 338 | + dutyFreqTst1 = scalar, U08, 85, "Hz", 2.0, 0.0, 10, 511, 0 ;[PJSC v1.10] | |
| 339 | + dutyFreqTst2 = scalar, U08, 86, "Hz", 2.0, 0.0, 10, 511, 0 ;[PJSC v1.10] | |
| 340 | + dutyFreqTst3 = scalar, U08, 87, "Hz", 2.0, 0.0, 10, 511, 0 ;[PJSC v1.10] | |
| 341 | + dutyFreqTst4 = scalar, U08, 88, "Hz", 2.0, 0.0, 10, 511, 0 ;[PJSC v1.10] | |
| 342 | + dutyRatioTst1 = scalar, U08, 89, "%", 1.0, 0.0, 0.0, 100.0, 0 ;[PJSC v1.10] | |
| 343 | + dutyRatioTst2 = scalar, U08, 90, "%", 1.0, 0.0, 0.0, 100.0, 0 ;[PJSC v1.10] | |
| 344 | + dutyRatioTst3 = scalar, U08, 91, "%", 1.0, 0.0, 0.0, 100.0, 0 ;[PJSC v1.10] | |
| 345 | + dutyRatioTst4 = scalar, U08, 92, "%", 1.0, 0.0, 0.0, 100.0, 0 ;[PJSC v1.10] | |
| 346 | + testop_fp = bits, U08, 93, [0:0], "Off", "On" | |
| 347 | + testop_inj = bits, U08, 93, [1:2], "Off", "One", "INVALID", "All" | |
| 348 | + testop_coil = bits, U08, 93, [3:4], "Off", "One", "INVALID", "INVALID" | |
| 349 | + testsel_inj = bits, U08, 93, [5:6], "Inj1", "Inj2", "Inj3", "Inj4" | |
| 350 | + testsel_coil = bits, U08, 93, [7:7], "CoilA", "CoilB" | |
| 351 | + testint = scalar, U16, 94, "ms", 0.01, 0.00, 0, 655.35, 1 | |
| 352 | + testrpm = scalar, U16, 94, "RPM", 1.0, { 60000/testint }, 0, 60000, 0 | |
| 353 | + testpw = scalar, U16, 96, "ms", 0.01, 0.00, 0, 655.35, 1 ; * ( 1 byte) | |
| 354 | + testinjcnt = scalar, U16, 98, "", 1, 0, 0, 65535, 0, noLocalUpdate | |
| 355 | + muxout1selection = bits, U08, 100, [0:3], "Disable", "IDLE control", "Thermo Fan control", "Launch control", "Fuel pump control", "Boost control", "VVT control", "Tach output", "INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID" | |
| 356 | + muxout2selection = bits, U08, 100, [4:7], "Disable", "IDLE control", "Thermo Fan control", "Launch control", "Fuel pump control", "Boost control", "VVT control", "Tach output", "INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID" | |
| 357 | + unused2-100 = array, U08, 101, [27], "%", 1.0, 0.0, 0.0, 255, 0 ;[PJSC v1.10] | |
| 358 | + | |
| 359 | + | |
| 360 | +;Page 2 is the fuel map and axis bins only | |
| 361 | +page = 2 | |
| 362 | + ; name = bits, type, offset, bits | |
| 363 | + ; name = array, type, offset, shape, units, scale, translate, lo, hi, digits | |
| 364 | + ; name = scalar, type, offset, units, scale, translate, lo, hi, digits | |
| 365 | + veTable = array, U08, 0, [16x16],"%", 1.0, 0.0, 0.0, 255.0, 0 | |
| 366 | + rpmBins = array, U08, 256, [ 16], "RPM", 100.0, 0.0, 100.0, 25500.0, 0 | |
| 367 | + fuelLoadBins = array, U08, 272, [ 16], { bitStringValue(algorithmUnits , algorithm) }, 2.0, 0.0, 0.0, {fuelLoadMax}, 0 | |
| 368 | + ;fuelLoadBins = array, U08, 272, [ 16], { bitStringValue(algorithmUnits , algorithm) }, 2.0, 0.0, 0.0, { arrayValue(rpmBins , algorithm) }, 0 | |
| 369 | + | |
| 365 | 370 | ;-------------------------------------------------- |
| 366 | 371 | ;Start Ignition table (Page 3) |
| 367 | 372 | ;-------------------------------------------------- |
| @@ -368,7 +373,6 @@ | ||
| 368 | 373 | page = 3 |
| 369 | 374 | advTable1 = array, U08, 0,[16x16], "deg", 1.0, -40, -40, 215.0, 0 |
| 370 | 375 | rpmBins2 = array, U08, 256,[ 16], "RPM", 100.0, 0.0, 100, 25500, 0 |
| 371 | - ;ignLoadBins= array, U08, 272, [ 16], { bitStringValue(algorithmUnits , ignAlgorithm) }, 2.0, 0.0, 0.0, {ignLoadMax}, 0 | |
| 372 | 376 | mapBins1= array, U08, 272, [ 16], { bitStringValue(algorithmUnits , ignAlgorithm) }, 2.0, 0.0, 0.0, {ignLoadMax}, 0 ; This name has to be used in order for the table to show up in MLVs table. I can't find the regexs that make this work :( |
| 373 | 377 | |
| 374 | 378 | ;-------------------------------------------------- |
| @@ -588,7 +592,7 @@ | ||
| 588 | 592 | ; Begin fan control vairables |
| 589 | 593 | fanInv = bits, U08, 120, [0:0], "No", "Yes" |
| 590 | 594 | fanEnable = bits, U08, 120, [1:1], "Off", "On/Off" |
| 591 | - fanPin = bits , U08, 120, [2:7], "Board Default", "INVALID", "INVALID", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35", "36", "37", "38", "39", "40", "41", "42", "43", "44", "45", "46", "47", "48", "49", "50", "51", "52", "53", "54", "A8", "A9", "A10", "A11", "A12", "A13", "A14", "A15", "INVALID" | |
| 595 | + fanPin = bits, U08, 120, [2:7], "Board Default", "INVALID", "INVALID", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35", "36", "37", "38", "39", "40", "41", "42", "43", "44", "45", "46", "47", "48", "49", "50", "51", "52", "53", "54", "A8", "A9", "A10", "A11", "A12", "A13", "A14", "A15", "INVALID" | |
| 592 | 596 | #if CELSIUS |
| 593 | 597 | fanSP = scalar, U08, 121, "C", 1.0, -40, -40, 215.0, 0 |
| 594 | 598 | fanHyster = scalar, U08, 122, "C", 1.0, 0.0, 0.0, 40, 0 |
| @@ -908,7 +912,9 @@ | ||
| 908 | 912 | ;unused10_150 = scalar, U08, 150, "", 1, 0, 0, 255, 0 |
| 909 | 913 | ;unused10_151 = scalar, U08, 151, "", 1, 0, 0, 255, 0 |
| 910 | 914 | ;unused10_152 = scalar, U08, 152, "", 1, 0, 0, 255, 0 |
| 911 | - unused10_153 = scalar, U08, 153, "", 1, 0, 0, 255, 0 | |
| 915 | + ;unused10_153 = scalar, U08, 153, "", 1, 0, 0, 255, 0 | |
| 916 | + iacStepperInv = bits, U08, 153, [0:0], "No", "Yes" | |
| 917 | + | |
| 912 | 918 | unused10_154 = scalar, U08, 154, "", 1, 0, 0, 255, 0 |
| 913 | 919 | unused10_155 = scalar, U08, 155, "", 1, 0, 0, 255, 0 |
| 914 | 920 | unused10_156 = scalar, U08, 156, "", 1, 0, 0, 255, 0 |
| @@ -1111,7 +1117,7 @@ | ||
| 1111 | 1117 | requiresPowerCycle = caninput_sel0b |
| 1112 | 1118 | requiresPowerCycle = caninput_sel1a |
| 1113 | 1119 | requiresPowerCycle = caninput_sel1b |
| 1114 | - requiresPowerCycle = caninput_sel2a | |
| 1120 | + requiresPowerCycle = caninput_sel2a | |
| 1115 | 1121 | requiresPowerCycle = caninput_sel2b |
| 1116 | 1122 | requiresPowerCycle = caninput_sel3a |
| 1117 | 1123 | requiresPowerCycle = caninput_sel3b |
| @@ -1337,9 +1343,9 @@ | ||
| 1337 | 1343 | ;[PJSC] subMenu = flexFueling, "Flex Fuel", 2 |
| 1338 | 1344 | ;[PJSC] subMenu = veTableDialog, "VE Table", 0 |
| 1339 | 1345 | ;[PJSC] subMenu = sparkTbl, "Spark Table", 2 |
| 1340 | - subMenu = veMapSelectDialog, "VE Table select" ;[PJSC] | |
| 1341 | - subMenu = veTable1Dialog, "&VE Table 1", 0 ; V | |
| 1342 | - subMenu = veTable2Dialog, "&VE Table 2", 0, { multiVEmapEnabled <= 1 } ;[PJSC] | |
| 1346 | + subMenu = veMapSelectDialog, "VE Table select" ;[PJSC] | |
| 1347 | + subMenu = veTable1Dialog, "&VE Table 1", 0 ; V | |
| 1348 | + subMenu = veTable2Dialog, "&VE Table 2", 0, { multiVEmapEnabled <= 1 } ;[PJSC] | |
| 1343 | 1349 | subMenu = afrTable1Tbl, "AFR Table", 5 |
| 1344 | 1350 | subMenu = std_separator |
| 1345 | 1351 | subMenu = inj_trimad, "Sequential fuel trim", 9 |
| @@ -1436,8 +1442,8 @@ | ||
| 1436 | 1442 | menuDialog = main |
| 1437 | 1443 | menu = "Hardware Testing" |
| 1438 | 1444 | ;[PJSC v1.10] subMenu = outputtest1, "Test Output Hardware" |
| 1439 | - subMenu = outputtest1, "Output Test Mode - PWM" ;[PJSC v1.10] | |
| 1440 | - subMenu = outputtest2, "Output Test Mode - Pulse" ;[PJSC v1.10] | |
| 1445 | + subMenu = outputtest1, "Output Test Mode - PWM" ;[PJSC v1.10] | |
| 1446 | + subMenu = outputtest2, "Output Test Mode - Pulse" ;[PJSC v1.10] | |
| 1441 | 1447 | #endif |
| 1442 | 1448 | |
| 1443 | 1449 | menu = "Help" |
| @@ -1492,6 +1498,7 @@ | ||
| 1492 | 1498 | iacCLmaxDuty= "When using closed loop idle control, this is the maximum duty cycle that the PID loop will allow. Combined with the minimum value, this specifies the working range of your idle valve" |
| 1493 | 1499 | iacFastTemp = "Below this temperature, the idle output will be high (On). Above this temperature, it will turn off." |
| 1494 | 1500 | idleUpPolarity = "Normal polarity is a ground switch where an earthed signal activates the Idle Up. The internal pullup will be enabled with Normal polarity. \n Inverted may be used if a 5v signal is used to enable the Idle Up." |
| 1501 | + idleUpAdder = "The amount (In either Duty Cycle % or Steps (Depending on the idle control method in use), that the idle control will increase by when Idle Up is active" | |
| 1495 | 1502 | |
| 1496 | 1503 | oddfire2 = "The ATDC angle of channel 2 for oddfire engines. This is relative to the TDC angle of channel 1" |
| 1497 | 1504 | oddfire3 = "The ATDC angle of channel 3 for oddfire engines. This is relative to the TDC angle of channel 1 (NOT channel 2)" |
| @@ -1920,18 +1927,21 @@ | ||
| 1920 | 1927 | panel = veTable2Dialog_north, North ; V |
| 1921 | 1928 | panel = veTable2Dialog_south, South ;[PJSC] |
| 1922 | 1929 | |
| 1923 | - dialog = injChars, "Injector Characteristics" | |
| 1924 | - field = "Squirt Device", squirtDeviceType ;[PJSC] | |
| 1925 | - field = "PJSC solenoid freq.", pjscFreq, { squirtDeviceType == 1 } ;[PJSC] | |
| 1926 | - field = "Injector Open Time", injOpen, { squirtDeviceType == 0 } ;[PJSC] | |
| 1927 | - field = "Injector close angle", { squirtDeviceType == 0 } ;[PJSC] | |
| 1928 | - field = "", inj1Ang, { indInjAng == 0 && squirtDeviceType == 0 } ;[PJSC] | |
| 1929 | - field = "Individual channel setting", indInjAng, { squirtDeviceType == 0 } ;[PJSC] | |
| 1930 | - field = "Channel 1", inj1Ang, { indInjAng && squirtDeviceType == 0 } ;[PJSC] | |
| 1931 | - field = "Channel 2", inj2Ang, { nCylinders > 1 && indInjAng && squirtDeviceType == 0 } ;[PJSC] | |
| 1932 | - field = "Channel 3", inj3Ang, { indInjAng && (nCylinders > 4 || nCylinders == 3 || ((nCylinders == 4) && (injLayout == 3))) && squirtDeviceType == 0 } ;[PJSC] | |
| 1933 | - field = "Channel 4", inj4Ang, { indInjAng && (nCylinders > 6 || ((nCylinders == 4) && (injLayout == 3))) && squirtDeviceType == 0 } ;[PJSC] | |
| 1934 | - field = "Injector Duty Limit", dutyLim, { squirtDeviceType == 0 } ;[PJSC] | |
| 1930 | + dialog = injChars, "Injector Characteristics" ;[PJSC] | |
| 1931 | + field = "Squirt Device", squirtDeviceType ; | | |
| 1932 | + field = "PJSC solenoid freq.", pjscFreq, { squirtDeviceType == 1 } ; | | |
| 1933 | + field = "Injector Open Time", injOpen, { squirtDeviceType == 0 } ; | | |
| 1934 | + field = "Injector close angle", { squirtDeviceType == 0 } ; | | |
| 1935 | + field = "", inj1Ang, { indInjAng == 0 && squirtDeviceType == 0 } ; | | |
| 1936 | + field = "Individual channel setting", indInjAng, { squirtDeviceType == 0 } ; | | |
| 1937 | + field = "Channel 1", inj1Ang, { indInjAng && squirtDeviceType == 0 } ; | | |
| 1938 | + field = "Channel 2", inj2Ang, { nCylinders > 1 && indInjAng && squirtDeviceType == 0 } ; | | |
| 1939 | + field = "Channel 3", inj3Ang, { indInjAng && (nCylinders > 4 || nCylinders == 3 || ((nCylinders == 4) && (injLayout == 3))) && squirtDeviceType == 0 } ; | | |
| 1940 | + field = "Channel 4", inj4Ang, { indInjAng && (nCylinders > 6 || ((nCylinders == 4) && (injLayout == 3))) && squirtDeviceType == 0 } ; | | |
| 1941 | + field = "Injector Duty Limit", dutyLim, { squirtDeviceType == 0 } ; V | |
| 1942 | + panel = injector_voltage_curve ;[PJSC] | |
| 1943 | + | |
| 1944 | +;[PJSC] dialog = injChars, "Injector Characteristics" | |
| 1935 | 1945 | ;[PJSC] field = "Injector Open Time", injOpen |
| 1936 | 1946 | ;[PJSC] field = "Injector close angle" |
| 1937 | 1947 | ;[PJSC] field = "", inj1Ang, { indInjAng == 0 } |
| @@ -1941,7 +1951,7 @@ | ||
| 1941 | 1951 | ;[PJSC] field = "Channel 3", inj3Ang, { indInjAng && (nCylinders > 4 || nCylinders == 3 || ((nCylinders == 4) && (injLayout == 3))) } |
| 1942 | 1952 | ;[PJSC] field = "Channel 4", inj4Ang, { indInjAng && (nCylinders > 6 || ((nCylinders == 4) && (injLayout == 3))) } |
| 1943 | 1953 | ;[PJSC] field = "Injector Duty Limit", dutyLim |
| 1944 | - panel = injector_voltage_curve | |
| 1954 | +;[PJSC] panel = injector_voltage_curve | |
| 1945 | 1955 | |
| 1946 | 1956 | dialog = egoControl, "" |
| 1947 | 1957 | topicHelp = "http://speeduino.com/wiki/index.php/AFR/O2" |
| @@ -1962,6 +1972,7 @@ | ||
| 1962 | 1972 | |
| 1963 | 1973 | dialog = fanSettings,"Fan Settings",7 |
| 1964 | 1974 | field = "Fan Mode", fanEnable |
| 1975 | + field = "Fan when off", fanWhenOff, { fanEnable } | |
| 1965 | 1976 | field = "Fan output pin", fanPin, { fanEnable } |
| 1966 | 1977 | field = "Fan Output Inverted", fanInv , { fanEnable } |
| 1967 | 1978 | field = "Fan temperature SP", fanSP, { fanEnable } |
| @@ -1971,6 +1982,7 @@ | ||
| 1971 | 1982 | field = "Step time (ms)", iacStepTime, { iacAlgorithm == 4 || iacAlgorithm == 5 } |
| 1972 | 1983 | field = "Home steps", iacStepHome, { iacAlgorithm == 4 || iacAlgorithm == 5 } |
| 1973 | 1984 | field = "Minimum Steps", iacStepHyster, { iacAlgorithm == 4 || iacAlgorithm == 5 } |
| 1985 | + field = "Stepper Inverted", iacStepperInv, { iacAlgorithm == 4 || iacAlgorithm == 5 } | |
| 1974 | 1986 | |
| 1975 | 1987 | dialog = pwm_idle, "PWM Idle" |
| 1976 | 1988 | field = "Number of outputs", iacChannels, { iacAlgorithm == 2 || iacAlgorithm == 3 } |
| @@ -1996,7 +2008,8 @@ | ||
| 1996 | 2008 | dialog = idleUpSettings, "Idle Up Settings" |
| 1997 | 2009 | field = "Idle Up Enabled", idleUpEnabled |
| 1998 | 2010 | field = "Idle Up Pin", idleUpPin, { idleUpEnabled } |
| 1999 | - field = "Idle Up Polarity", idleUpPolarity, { idleUpEnabled } | |
| 2011 | + field = "Idle Up Pin Polarity", idleUpPolarity, { idleUpEnabled } | |
| 2012 | + field = "Idle Up Amount", idleUpAdder, { idleUpEnabled } | |
| 2000 | 2013 | |
| 2001 | 2014 | dialog = fuelpump, "Fuel pump" |
| 2002 | 2015 | field = "Fuel pump pin", fuelPumpPin |
| @@ -2058,7 +2071,7 @@ | ||
| 2058 | 2071 | ;[PJSC] field = "Cranking advance Angle", CrankAng |
| 2059 | 2072 | ;[PJSC] field = "Spark Outputs triggers", IgInv |
| 2060 | 2073 | ;[PJSC] field = "" |
| 2061 | -;[PJSC] field = "Enabled Fixed/Locked timing", fixAngEnable | |
| 2074 | +;[PJSC] field = "Enabled Fixed/Locked timing", fixAngEnable | |
| 2062 | 2075 | ;[PJSC] field = "Fixed Angle", FixAng, { fixAngEnable } |
| 2063 | 2076 | ;[PJSC] field = "#Note: During cranking the fixed/locked timing angle is overriden by the Cranking advance angle value above" |
| 2064 | 2077 | ;[PJSC] field = "" |
| @@ -2152,8 +2165,8 @@ | ||
| 2152 | 2165 | field = "Nitrous is armed when pin is", n2o_pin_polarity,{ n2o_enable > 0 } |
| 2153 | 2166 | field = "Minimum CLT", n2o_minCLT, { n2o_enable > 0 } |
| 2154 | 2167 | field = "Minimum TPS", n2o_minTPS, { n2o_enable > 0 } |
| 2155 | - field = "Maximum MAP", n2o_maxMAP, { n2o_enable > 0 } | |
| 2156 | - field = "Leanest AFR", n2o_maxAFR, { n2o_enable > 0 } | |
| 2168 | + field = "Maximum MAP", n2o_maxMAP, { n2o_enable > 0 } | |
| 2169 | + field = "Leanest AFR", n2o_maxAFR, { n2o_enable > 0 } | |
| 2157 | 2170 | |
| 2158 | 2171 | dialog = NitrousControl, "Nitrous" |
| 2159 | 2172 | panel = NitrousMain, North |
| @@ -2401,7 +2414,7 @@ | ||
| 2401 | 2414 | ;[PJSC] panel = outputtest_spark |
| 2402 | 2415 | ;panel = outputtest_io2 |
| 2403 | 2416 | panel = outputtest_warningmessage |
| 2404 | - | |
| 2417 | + | |
| 2405 | 2418 | ;[PJSC v1.10] For test mode - outputs pulse ========================================================================= |
| 2406 | 2419 | dialog = outputTestbuttons1a, "", xAxis |
| 2407 | 2420 | ;commandButton = "Label Text", command, { Enabled Condition }, optionalFlags |
| @@ -2461,7 +2474,7 @@ | ||
| 2461 | 2474 | panel = outputtest_r |
| 2462 | 2475 | |
| 2463 | 2476 | ;[PJSC v1.10] For test mode - outputs pulse ========================================================================= |
| 2464 | - | |
| 2477 | + | |
| 2465 | 2478 | dialog = Auxin_north |
| 2466 | 2479 | displayOnlyField = #"Secondary Serial ENABLED", blankfield, {enable_secondarySerial},{enable_secondarySerial} |
| 2467 | 2480 | displayOnlyField = !"Secondary Serial DISABLED", blankfield, {enable_secondarySerial == 0},{enable_secondarySerial == 0} |
| @@ -2812,7 +2825,7 @@ | ||
| 2812 | 2825 | displayOnlyField = "Off 1", blankfield, {},{(caninput_sel1a == 0 && (!enable_secondarySerial && (!enable_intcan || (enable_intcan && intcan_available == 0)))) || (caninput_sel1b == 0 && ((enable_secondarySerial && enable_intcan) || (enable_secondarySerial && !enable_intcan) || (!enable_secondarySerial && enable_intcan)))} |
| 2813 | 2826 | displayOnlyField = "External Source 1 Via Secondary Serial", blankfield, {},{(caninput_sel1b == 1 && enable_secondarySerial && ((enable_intcan && intcan_available == 0) || !enable_intcan)) || (caninput_sel1b == 1 && enable_secondarySerial && (enable_intcan && intcan_available) && caninput_sel1extsourceb == 0)} |
| 2814 | 2827 | displayOnlyField = "External Source 1 Via Internal CAN", blankfield, {},{(caninput_sel1b == 1 && enable_secondarySerial && (enable_intcan && intcan_available) && caninput_sel1extsourceb == 1) ||(caninput_sel1b == 1 && !enable_secondarySerial && (enable_intcan && intcan_available) && caninput_sel1extsourcec == 1)} |
| 2815 | - field = "Local Analog Source 1 Pin No:", Auxin1pina , {}, {(caninput_sel1a == 2 && (!enable_secondarySerial && (!enable_intcan || (enable_intcan && intcan_available == 0)) || (caninput_sel1b == 2 && (enable_secondarySerial || enable_intcan))} | |
| 2828 | + field = "Local Analog Source 1 Pin No:", Auxin1pina , {}, {(caninput_sel1a == 2 && (!enable_secondarySerial && (!enable_intcan || (enable_intcan && intcan_available == 0)))) || (caninput_sel1b == 2 && (enable_secondarySerial || (enable_intcan && intcan_available == 1 )))} | |
| 2816 | 2829 | field = "Local Digital Source 1 Pin No:", Auxin1pinb , {}, {(caninput_sel1a == 3 && (!enable_secondarySerial && (!enable_intcan || (enable_intcan && intcan_available == 0)))) || (caninput_sel1b == 3 && (enable_secondarySerial || (enable_intcan && intcan_available == 1 )))} |
| 2817 | 2830 | |
| 2818 | 2831 | displayOnlyField = "Off 2", blankfield, {},{(caninput_sel2a == 0 && (!enable_secondarySerial && !enable_intcan)) || (caninput_sel2b == 0 && (enable_secondarySerial && enable_intcan)) || (caninput_sel2b == 0 && (enable_secondarySerial && !enable_intcan)) || (caninput_sel2b == 0 && (!enable_secondarySerial && enable_intcan))} |
| @@ -3531,7 +3544,7 @@ | ||
| 3531 | 3544 | softlimitOn = bits, U08, 31, [3:3] |
| 3532 | 3545 | boostCutSpark = bits, U08, 31, [4:4] |
| 3533 | 3546 | error = bits, U08, 31, [5:5] |
| 3534 | - idle = bits, U08, 31, [6:6] | |
| 3547 | + idleControlOn = bits, U08, 31, [6:6] | |
| 3535 | 3548 | sync = bits, U08, 31, [7:7] |
| 3536 | 3549 | rpmDOT = scalar, S16, 32, "rpm/s", 1.000, 0.000 |
| 3537 | 3550 | flex = scalar, U08, 34, "%", 1.000, 0.000 |
| @@ -3580,17 +3593,17 @@ | ||
| 3580 | 3593 | fuelLoad = scalar, S16, 85, { bitStringValue( algorithmUnits , algorithm ) }, 1.000, 0.000 |
| 3581 | 3594 | ignLoad = scalar, S16, 87, { bitStringValue( algorithmUnits , ignAlgorithm ) }, 1.000, 0.000 |
| 3582 | 3595 | syncLossCounter = scalar, U08, 89, "", 1.000, 0.000 |
| 3583 | - veCurr2 = scalar, U08, 90, "%", 1.000, 0.000 ;[PJSC]Multi VE Map support | |
| 3584 | - valvePosition = scalar, U08, 91, "%", 1.000, 0.000 ;[PJSC]Extend output channel for External Trigger | |
| 3585 | - valvePositionADC = scalar, U08, 92, "ADC", 1.000, 0.000 ;[PJSC]Extend output channel for External Trigger | |
| 3586 | - sparkedAngle = scalar, S16, 93, "deg", 1.000, 0.000 ;[PJSC]Extend output channel for External Trigger | |
| 3587 | - dutyFreq = scalar, U16, 95, "Hz", 1.000, 0.000 ;[PJSC]For capturing duty pulse | |
| 3588 | - dutyRatio = scalar, U16, 97, "%", 1.000, 0.000 ;[PJSC]For capturing duty pulse | |
| 3589 | - dutyFreq2 = scalar, U16, 99, "Hz", 1.000, 0.000 ;[PJSC]For capturing duty pulse | |
| 3590 | - dutyRatio2 = scalar, U16, 101, "%", 1.000, 0.000 ;[PJSC]For capturing duty pulse | |
| 3591 | - testCnt = scalar, U16, 103, "", 1.000, 0.000 ;[PJSC v1.10]For test mode | |
| 3592 | - afr2 = scalar, U08, 105, "O2", 0.100, 0.000 ;[PJSC v1.10] | |
| 3593 | - fuelLoad2 = scalar, S16, 106, { bitStringValue( algorithmUnits2 , algorithm2 ) }, 1.000, 0.000 | |
| 3596 | + veCurr2 = scalar, U08, 90, "%", 1.000, 0.000 ;[PJSC]Multi VE Map support | |
| 3597 | + valvePosition = scalar, U08, 91, "%", 1.000, 0.000 ;[PJSC]Extend output channel for External Trigger | |
| 3598 | + valvePositionADC = scalar, U08, 92, "ADC", 1.000, 0.000 ;[PJSC]Extend output channel for External Trigger | |
| 3599 | + sparkedAngle = scalar, S16, 93, "deg", 1.000, 0.000 ;[PJSC]Extend output channel for External Trigger | |
| 3600 | + dutyFreq = scalar, U16, 95, "Hz", 1.000, 0.000 ;[PJSC]For capturing duty pulse | |
| 3601 | + dutyRatio = scalar, U16, 97, "%", 1.000, 0.000 ;[PJSC]For capturing duty pulse | |
| 3602 | + dutyFreq2 = scalar, U16, 99, "Hz", 1.000, 0.000 ;[PJSC]For capturing duty pulse | |
| 3603 | + dutyRatio2 = scalar, U16, 101, "%", 1.000, 0.000 ;[PJSC]For capturing duty pulse | |
| 3604 | + testCnt = scalar, U16, 103, "", 1.000, 0.000 ;[PJSC v1.10]For test mode | |
| 3605 | + afr2 = scalar, U08, 105, "O2", 0.100, 0.000 ;[PJSC v1.10] | |
| 3606 | + fuelLoad2 = scalar, S16, 106, { bitStringValue( algorithmUnits2 , algorithm2 ) }, 1.000, 0.000 ;[PJSC v1.10]For dual fuel load | |
| 3594 | 3607 | |
| 3595 | 3608 | |
| 3596 | 3609 | #if CELSIUS |
| @@ -3722,16 +3735,16 @@ | ||
| 3722 | 3735 | startCommand = "H" |
| 3723 | 3736 | stopCommand = "h" |
| 3724 | 3737 | dataReadCommand = "T" ; Basic TS command format |
| 3725 | - dataReadTimeout = 15000 ; time in ms | |
| 3726 | - dataReadyCondition = { toothLog1Ready } | |
| 3738 | + dataReadTimeout = 5000 ; time in ms | |
| 3739 | + dataReadyCondition = { toothLog1Ready == 1 } | |
| 3727 | 3740 | ;dataLength = 256 ; in bytes, including headers, footers and data (not used) |
| 3728 | - dataLength = 128 ; in bytes, including headers, footers and data (not used) | |
| 3741 | + ;dataLength = 128 ; in bytes, including headers, footers and data (not used) | |
| 3729 | 3742 | |
| 3730 | 3743 | ;recordDef = headerLen. footerLen, recordLen |
| 3731 | - recordDef = 0, 0, 2; in bytes, the recordLen is for each record, currently limited to 4 bytes | |
| 3744 | + recordDef = 0, 0, 4; in bytes, the recordLen is for each record, currently limited to 4 bytes | |
| 3732 | 3745 | |
| 3733 | 3746 | ;recordField = Name, HeaderName, startBit, bitCount, scale, units, updateCondition |
| 3734 | - recordField = toothTime, "ToothTime", 0, 16, 1.0, "uS" | |
| 3747 | + recordField = toothTime, "ToothTime", 0, 32, 1.0, "uS" | |
| 3735 | 3748 | |
| 3736 | 3749 | loggerDef = compositeLogger, "Composite Logger", composite |
| 3737 | 3750 | startCommand = "J" |
| @@ -3738,7 +3751,7 @@ | ||
| 3738 | 3751 | stopCommand = "j" |
| 3739 | 3752 | dataReadCommand = "T" ; Basic TS command format. Note that this is shared with the composite logger. Firmware detects which log is currently running |
| 3740 | 3753 | dataReadTimeout = 5000 ; time in ms |
| 3741 | - dataReadyCondition = { toothLog1Ready } | |
| 3754 | + dataReadyCondition = { toothLog1Ready == 1 } | |
| 3742 | 3755 | ;dataLength = 256 ; in bytes, including headers, footers and data (not used) |
| 3743 | 3756 | ;dataLength = 320 ; in bytes, including headers, footers and data (not used) |
| 3744 | 3757 |
| @@ -3750,10 +3763,10 @@ | ||
| 3750 | 3763 | recordField = secLevel, "SecLevel", 1, 1, 1.0, "Flag" |
| 3751 | 3764 | recordField = trigger, "Trigger", 2, 1, 1.0, "Flag" |
| 3752 | 3765 | recordField = sync, "Sync", 3, 1, 1.0, "Flag" |
| 3753 | - recordField = refTime, "RefTime", 8, 32, 0.001, "ms", hidden | |
| 3766 | + recordField = refTime, "RefTime", 8, 32, 0.001, "ms" | |
| 3754 | 3767 | |
| 3755 | 3768 | ; hidden calcField serves as intermediate variable |
| 3756 | - calcField = maxTime, "MaxTime", "ms", { maxValue(refTime) }, hidden | |
| 3769 | + calcField = maxTime, "MaxTime", "ms", { maxValue(refTime) } | |
| 3757 | 3770 | |
| 3758 | 3771 | calcField = toothTime, "ToothTime", "ms", { refTime - pastValue(refTime, 1) } |
| 3759 | 3772 | ;recordField = time, "Time", 24, 16, 1.0, "ms" |
| @@ -1,6 +1,8 @@ | ||
| 1 | 1 | #ifndef AUX_H |
| 2 | 2 | #define AUX_H |
| 3 | 3 | |
| 4 | +#include BOARD_H //Note that this is not a real file, it is defined in globals.h. | |
| 5 | + | |
| 4 | 6 | void initialiseAuxPWM(); |
| 5 | 7 | void boostControl(); |
| 6 | 8 | void boostDisable(); |
| @@ -10,55 +12,6 @@ | ||
| 10 | 12 | void nitrousControl(); |
| 11 | 13 | void fanControl(); |
| 12 | 14 | |
| 13 | -#if defined(CORE_AVR) | |
| 14 | - #define ENABLE_BOOST_TIMER() TIMSK1 |= (1 << OCIE1A) | |
| 15 | - #define DISABLE_BOOST_TIMER() TIMSK1 &= ~(1 << OCIE1A) | |
| 16 | - #define ENABLE_VVT_TIMER() TIMSK1 |= (1 << OCIE1B) | |
| 17 | - #define DISABLE_VVT_TIMER() TIMSK1 &= ~(1 << OCIE1B) | |
| 18 | - | |
| 19 | - #define BOOST_TIMER_COMPARE OCR1A | |
| 20 | - #define BOOST_TIMER_COUNTER TCNT1 | |
| 21 | - #define VVT_TIMER_COMPARE OCR1B | |
| 22 | - #define VVT_TIMER_COUNTER TCNT1 | |
| 23 | - | |
| 24 | -#elif defined(CORE_TEENSY) | |
| 25 | - #define ENABLE_BOOST_TIMER() FTM1_C0SC |= FTM_CSC_CHIE | |
| 26 | - #define DISABLE_BOOST_TIMER() FTM1_C0SC &= ~FTM_CSC_CHIE | |
| 27 | - | |
| 28 | - #define ENABLE_VVT_TIMER() FTM1_C1SC |= FTM_CSC_CHIE | |
| 29 | - #define DISABLE_VVT_TIMER() FTM1_C1SC &= ~FTM_CSC_CHIE | |
| 30 | - | |
| 31 | - #define BOOST_TIMER_COMPARE FTM1_C0V | |
| 32 | - #define BOOST_TIMER_COUNTER FTM1_CNT | |
| 33 | - #define VVT_TIMER_COMPARE FTM1_C1V | |
| 34 | - #define VVT_TIMER_COUNTER FTM1_CNT | |
| 35 | - | |
| 36 | -#elif defined(CORE_STM32) | |
| 37 | - #if defined(ARDUINO_ARCH_STM32) // STM32GENERIC core | |
| 38 | - #define ENABLE_BOOST_TIMER() (TIM1)->CCER |= TIM_CCER_CC2E | |
| 39 | - #define DISABLE_BOOST_TIMER() (TIM1)->CCER &= ~TIM_CCER_CC2E | |
| 40 | - | |
| 41 | - #define ENABLE_VVT_TIMER() (TIM1)->CCER |= TIM_CCER_CC3E | |
| 42 | - #define DISABLE_VVT_TIMER() (TIM1)->CCER &= ~TIM_CCER_CC3E | |
| 43 | - | |
| 44 | - #define BOOST_TIMER_COMPARE (TIM1)->CCR2 | |
| 45 | - #define BOOST_TIMER_COUNTER (TIM1)->CNT | |
| 46 | - #define VVT_TIMER_COMPARE (TIM1)->CCR3 | |
| 47 | - #define VVT_TIMER_COUNTER (TIM1)->CNT | |
| 48 | - #else //libmaple core aka STM32DUINO | |
| 49 | - #define ENABLE_BOOST_TIMER() (TIMER1->regs).gen->CCER |= TIMER_CCER_CC2E | |
| 50 | - #define DISABLE_BOOST_TIMER() (TIMER1->regs).gen->CCER &= ~TIMER_CCER_CC2E | |
| 51 | - | |
| 52 | - #define ENABLE_VVT_TIMER() (TIMER1->regs).gen->CCER |= TIMER_CCER_CC3E | |
| 53 | - #define DISABLE_VVT_TIMER() (TIMER1->regs).gen->CCER &= ~TIMER_CCER_CC3E | |
| 54 | - | |
| 55 | - #define BOOST_TIMER_COMPARE (TIMER1->regs).gen->CCR2 | |
| 56 | - #define BOOST_TIMER_COUNTER (TIMER1->regs).gen->CNT | |
| 57 | - #define VVT_TIMER_COMPARE (TIMER1->regs).gen->CCR3 | |
| 58 | - #define VVT_TIMER_COUNTER (TIMER1->regs).gen->CNT | |
| 59 | - #endif | |
| 60 | -#endif | |
| 61 | - | |
| 62 | 15 | #define BOOST_PIN_LOW() *boost_pin_port &= ~(boost_pin_mask) |
| 63 | 16 | #define BOOST_PIN_HIGH() *boost_pin_port |= (boost_pin_mask) |
| 64 | 17 | #define VVT_PIN_LOW() *vvt_pin_port &= ~(vvt_pin_mask) |
| @@ -71,17 +24,17 @@ | ||
| 71 | 24 | #define N2O_STAGE2_PIN_HIGH() *n2o_stage2_pin_port |= (n2o_stage2_pin_mask) |
| 72 | 25 | #define READ_N2O_ARM_PIN() ((*n2o_arming_pin_port & n2o_arming_pin_mask) ? true : false) |
| 73 | 26 | |
| 74 | -volatile byte *boost_pin_port; | |
| 27 | +volatile PORT_TYPE *boost_pin_port; | |
| 75 | 28 | volatile byte boost_pin_mask; |
| 76 | -volatile byte *vvt_pin_port; | |
| 29 | +volatile PORT_TYPE *vvt_pin_port; | |
| 77 | 30 | volatile byte vvt_pin_mask; |
| 78 | -volatile byte *fan_pin_port; | |
| 31 | +volatile PORT_TYPE *fan_pin_port; | |
| 79 | 32 | volatile byte fan_pin_mask; |
| 80 | -volatile byte *n2o_stage1_pin_port; | |
| 33 | +volatile PORT_TYPE *n2o_stage1_pin_port; | |
| 81 | 34 | volatile byte n2o_stage1_pin_mask; |
| 82 | -volatile byte *n2o_stage2_pin_port; | |
| 35 | +volatile PORT_TYPE *n2o_stage2_pin_port; | |
| 83 | 36 | volatile byte n2o_stage2_pin_mask; |
| 84 | -volatile byte *n2o_arming_pin_port; | |
| 37 | +volatile PORT_TYPE *n2o_arming_pin_port; | |
| 85 | 38 | volatile byte n2o_arming_pin_mask; |
| 86 | 39 | |
| 87 | 40 | volatile bool boost_pwm_state; |
| @@ -98,10 +51,8 @@ | ||
| 98 | 51 | unsigned int vvt_pwm_max_count; //Used for variable PWM frequency |
| 99 | 52 | volatile unsigned int vvt_pwm_cur_value; |
| 100 | 53 | long vvt_pwm_target_value; |
| 101 | -#if defined (CORE_TEENSY) || defined(CORE_STM32) | |
| 102 | - static inline void boostInterrupt(); | |
| 103 | - static inline void vvtInterrupt(); | |
| 104 | -#endif | |
| 54 | +static inline void boostInterrupt(); | |
| 55 | +static inline void vvtInterrupt(); | |
| 105 | 56 | |
| 106 | 57 | |
| 107 | 58 | #endif |
| @@ -0,0 +1,143 @@ | ||
| 1 | +#ifndef AVR2560_H | |
| 2 | +#define AVR2560_H | |
| 3 | +#if defined(CORE_AVR) | |
| 4 | + | |
| 5 | +#include <avr/interrupt.h> | |
| 6 | +#include <avr/io.h> | |
| 7 | + | |
| 8 | +/* | |
| 9 | +*********************************************************************************************************** | |
| 10 | +* General | |
| 11 | +*/ | |
| 12 | + #define PORT_TYPE uint8_t //Size of the port variables (Eg inj1_pin_port). | |
| 13 | + void initBoard(); | |
| 14 | + uint16_t freeRam(); | |
| 15 | + | |
| 16 | + #if defined(TIMER5_MICROS) | |
| 17 | + //#define micros() (((timer5_overflow_count << 16) + TCNT5) * 4) //Fast version of micros() that uses the 4uS tick of timer5. See timers.ino for the overflow ISR of timer5 | |
| 18 | + #define millis() (ms_counter) //Replaces the standard millis() function with this macro. It is both faster and more accurate. See timers.ino for its counter increment. | |
| 19 | + static inline unsigned long micros_safe(); //A version of micros() that is interrupt safe | |
| 20 | + #else | |
| 21 | + #define micros_safe() micros() //If the timer5 method is not used, the micros_safe() macro is simply an alias for the normal micros() | |
| 22 | + #endif | |
| 23 | + | |
| 24 | + //Mega 2561 MCU does not have a serial3 available. | |
| 25 | + #if not defined(__AVR_ATmega2561__) | |
| 26 | + #define USE_SERIAL3 | |
| 27 | + #endif | |
| 28 | + | |
| 29 | +/* | |
| 30 | +*********************************************************************************************************** | |
| 31 | +* Schedules | |
| 32 | +*/ | |
| 33 | + //Refer to http://svn.savannah.nongnu.org/viewvc/trunk/avr-libc/include/avr/iomxx0_1.h?root=avr-libc&view=markup | |
| 34 | + #define FUEL1_COUNTER TCNT3 | |
| 35 | + #define FUEL2_COUNTER TCNT3 | |
| 36 | + #define FUEL3_COUNTER TCNT3 | |
| 37 | + #define FUEL4_COUNTER TCNT4 | |
| 38 | + #define FUEL5_COUNTER TCNT1 | |
| 39 | + #define FUEL6_COUNTER TCNT4 //Replaces ignition 4 | |
| 40 | + #define FUEL7_COUNTER TCNT5 //Replaces ignition 3 | |
| 41 | + #define FUEL8_COUNTER TCNT5 //Replaces ignition 2 | |
| 42 | + | |
| 43 | + #define IGN1_COUNTER TCNT5 | |
| 44 | + #define IGN2_COUNTER TCNT5 | |
| 45 | + #define IGN3_COUNTER TCNT5 | |
| 46 | + #define IGN4_COUNTER TCNT4 | |
| 47 | + #define IGN5_COUNTER TCNT1 | |
| 48 | + #define IGN6_COUNTER TCNT4 //Replaces injector 4 | |
| 49 | + #define IGN7_COUNTER TCNT3 //Replaces injector 3 | |
| 50 | + #define IGN8_COUNTER TCNT3 //Replaces injector 2 | |
| 51 | + | |
| 52 | + #define FUEL1_COMPARE OCR3A | |
| 53 | + #define FUEL2_COMPARE OCR3B | |
| 54 | + #define FUEL3_COMPARE OCR3C | |
| 55 | + #define FUEL4_COMPARE OCR4B | |
| 56 | + #define FUEL5_COMPARE OCR1C //Shared with FUEL1 | |
| 57 | + #define FUEL6_COMPARE OCR4A //Replaces ignition4 | |
| 58 | + #define FUEL7_COMPARE OCR5C //Replaces ignition3 | |
| 59 | + #define FUEL8_COMPARE OCR5B //Replaces ignition2 | |
| 60 | + | |
| 61 | + #define IGN1_COMPARE OCR5A | |
| 62 | + #define IGN2_COMPARE OCR5B | |
| 63 | + #define IGN3_COMPARE OCR5C | |
| 64 | + #define IGN4_COMPARE OCR4A | |
| 65 | + #define IGN5_COMPARE OCR1C | |
| 66 | + #define IGN6_COMPARE OCR4B //Replaces injector 4 | |
| 67 | + #define IGN7_COMPARE OCR3C //Replaces injector 3 | |
| 68 | + #define IGN8_COMPARE OCR3B //Replaces injector 2 | |
| 69 | + | |
| 70 | + #define FUEL1_TIMER_ENABLE() TIMSK3 |= (1 << OCIE3A) //Turn on the A compare unit (ie turn on the interrupt) | |
| 71 | + #define FUEL2_TIMER_ENABLE() TIMSK3 |= (1 << OCIE3B) //Turn on the B compare unit (ie turn on the interrupt) | |
| 72 | + #define FUEL3_TIMER_ENABLE() TIMSK3 |= (1 << OCIE3C) //Turn on the C compare unit (ie turn on the interrupt) | |
| 73 | + #define FUEL4_TIMER_ENABLE() TIMSK4 |= (1 << OCIE4B) //Turn on the B compare unit (ie turn on the interrupt) | |
| 74 | + #define FUEL5_TIMER_ENABLE() TIMSK1 |= (1 << OCIE1C) // | |
| 75 | + #define FUEL6_TIMER_ENABLE() TIMSK4 |= (1 << OCIE4A) // | |
| 76 | + #define FUEL7_TIMER_ENABLE() TIMSK5 |= (1 << OCIE5C) // | |
| 77 | + #define FUEL8_TIMER_ENABLE() TIMSK5 |= (1 << OCIE5B) // | |
| 78 | + | |
| 79 | + #define FUEL1_TIMER_DISABLE() TIMSK3 &= ~(1 << OCIE3A); //Turn off this output compare unit | |
| 80 | + #define FUEL2_TIMER_DISABLE() TIMSK3 &= ~(1 << OCIE3B); //Turn off this output compare unit | |
| 81 | + #define FUEL3_TIMER_DISABLE() TIMSK3 &= ~(1 << OCIE3C); //Turn off this output compare unit | |
| 82 | + #define FUEL4_TIMER_DISABLE() TIMSK4 &= ~(1 << OCIE4B); //Turn off this output compare unit | |
| 83 | + #define FUEL5_TIMER_DISABLE() TIMSK1 &= ~(1 << OCIE1C); // | |
| 84 | + #define FUEL6_TIMER_DISABLE() TIMSK4 &= ~(1 << OCIE4A); // | |
| 85 | + #define FUEL7_TIMER_DISABLE() TIMSK5 &= ~(1 << OCIE5C); // | |
| 86 | + #define FUEL8_TIMER_DISABLE() TIMSK5 &= ~(1 << OCIE5B); // | |
| 87 | + | |
| 88 | + #define IGN1_TIMER_ENABLE() TIMSK5 |= (1 << OCIE5A) //Turn on the A compare unit (ie turn on the interrupt) | |
| 89 | + #define IGN2_TIMER_ENABLE() TIMSK5 |= (1 << OCIE5B) //Turn on the B compare unit (ie turn on the interrupt) | |
| 90 | + #define IGN3_TIMER_ENABLE() TIMSK5 |= (1 << OCIE5C) //Turn on the C compare unit (ie turn on the interrupt) | |
| 91 | + #define IGN4_TIMER_ENABLE() TIMSK4 |= (1 << OCIE4A) //Turn on the A compare unit (ie turn on the interrupt) | |
| 92 | + #define IGN5_TIMER_ENABLE() TIMSK1 |= (1 << OCIE1C) //Turn on the A compare unit (ie turn on the interrupt) | |
| 93 | + #define IGN6_TIMER_ENABLE() TIMSK4 |= (1 << OCIE4B) //Replaces injector 4 | |
| 94 | + #define IGN7_TIMER_ENABLE() TIMSK3 |= (1 << OCIE3C) //Replaces injector 3 | |
| 95 | + #define IGN8_TIMER_ENABLE() TIMSK3 |= (1 << OCIE3B) //Replaces injector 2 | |
| 96 | + | |
| 97 | + #define IGN1_TIMER_DISABLE() TIMSK5 &= ~(1 << OCIE5A) //Turn off this output compare unit | |
| 98 | + #define IGN2_TIMER_DISABLE() TIMSK5 &= ~(1 << OCIE5B) //Turn off this output compare unit | |
| 99 | + #define IGN3_TIMER_DISABLE() TIMSK5 &= ~(1 << OCIE5C) //Turn off this output compare unit | |
| 100 | + #define IGN4_TIMER_DISABLE() TIMSK4 &= ~(1 << OCIE4A) //Turn off this output compare unit | |
| 101 | + #define IGN5_TIMER_DISABLE() TIMSK1 &= ~(1 << OCIE1C) //Turn off this output compare unit | |
| 102 | + #define IGN6_TIMER_DISABLE() TIMSK4 &= ~(1 << OCIE4B) //Replaces injector 4 | |
| 103 | + #define IGN7_TIMER_DISABLE() TIMSK3 &= ~(1 << OCIE3C) //Replaces injector 3 | |
| 104 | + #define IGN8_TIMER_DISABLE() TIMSK3 &= ~(1 << OCIE3B) //Replaces injector 2 | |
| 105 | + | |
| 106 | + #define MAX_TIMER_PERIOD 262140UL //The longest period of time (in uS) that the timer can permit (IN this case it is 65535 * 4, as each timer tick is 4uS) | |
| 107 | + #define MAX_TIMER_PERIOD_SLOW 1048560UL //The longest period of time (in uS) that the timer can permit (IN this case it is 65535 * 16, as each timer tick is 16uS) | |
| 108 | + #define uS_TO_TIMER_COMPARE(uS1) (uS1 >> 2) //Converts a given number of uS into the required number of timer ticks until that time has passed | |
| 109 | + //This is a hack until I make all the AVR timers run at the same speed | |
| 110 | + #define uS_TO_TIMER_COMPARE_SLOW(uS1) (uS1 >> 4) | |
| 111 | + | |
| 112 | +/* | |
| 113 | +*********************************************************************************************************** | |
| 114 | +* Auxilliaries | |
| 115 | +*/ | |
| 116 | + #define ENABLE_BOOST_TIMER() TIMSK1 |= (1 << OCIE1A) | |
| 117 | + #define DISABLE_BOOST_TIMER() TIMSK1 &= ~(1 << OCIE1A) | |
| 118 | + #define ENABLE_VVT_TIMER() TIMSK1 |= (1 << OCIE1B) | |
| 119 | + #define DISABLE_VVT_TIMER() TIMSK1 &= ~(1 << OCIE1B) | |
| 120 | + | |
| 121 | + #define BOOST_TIMER_COMPARE OCR1A | |
| 122 | + #define BOOST_TIMER_COUNTER TCNT1 | |
| 123 | + #define VVT_TIMER_COMPARE OCR1B | |
| 124 | + #define VVT_TIMER_COUNTER TCNT1 | |
| 125 | + | |
| 126 | +/* | |
| 127 | +*********************************************************************************************************** | |
| 128 | +* Idle | |
| 129 | +*/ | |
| 130 | + #define IDLE_COUNTER TCNT4 | |
| 131 | + #define IDLE_COMPARE OCR4C | |
| 132 | + | |
| 133 | + #define IDLE_TIMER_ENABLE() TIMSK4 |= (1 << OCIE4C) | |
| 134 | + #define IDLE_TIMER_DISABLE() TIMSK4 &= ~(1 << OCIE4C) | |
| 135 | + | |
| 136 | +/* | |
| 137 | +*********************************************************************************************************** | |
| 138 | +* CAN / Second serial | |
| 139 | +*/ | |
| 140 | + | |
| 141 | + | |
| 142 | +#endif //CORE_AVR | |
| 143 | +#endif //AVR2560_H |
| @@ -0,0 +1,295 @@ | ||
| 1 | +#ifndef STM32_H | |
| 2 | +#define STM32_H | |
| 3 | +#if defined(CORE_STM32) | |
| 4 | + | |
| 5 | +/* | |
| 6 | +*********************************************************************************************************** | |
| 7 | +* General | |
| 8 | +*/ | |
| 9 | + #define PORT_TYPE uint8_t | |
| 10 | + #define micros_safe() micros() //timer5 method is not used on anything but AVR, the micros_safe() macro is simply an alias for the normal micros() | |
| 11 | + #define USE_SERIAL3 | |
| 12 | + void initBoard(); | |
| 13 | + uint16_t freeRam(); | |
| 14 | + | |
| 15 | + #if defined(USE_STM32GENERIC) | |
| 16 | + #define Serial Serial1 | |
| 17 | + #endif | |
| 18 | + | |
| 19 | + //Much of the below is not correct, but included to allow compilation | |
| 20 | + //STM32F1/variants/.../board.cpp | |
| 21 | + #if defined (STM32F4) | |
| 22 | + #define A0 PA0 | |
| 23 | + #define A1 PA1 | |
| 24 | + #define A2 PA2 | |
| 25 | + #define A3 PA3 | |
| 26 | + #define A4 PA4 | |
| 27 | + #define A5 PA5 | |
| 28 | + #define A6 PA6 | |
| 29 | + #define A7 PA7 | |
| 30 | + #define A8 PB0 | |
| 31 | + #define A9 PB1 | |
| 32 | + #define A10 PC0 | |
| 33 | + #define A11 PC1 | |
| 34 | + #define A12 PC2 | |
| 35 | + #define A13 PC3 | |
| 36 | + #define A14 PC4 | |
| 37 | + #define A15 PC5 | |
| 38 | + #else | |
| 39 | + #define A0 PB0 | |
| 40 | + #define A1 PA7 | |
| 41 | + #define A2 PA6 | |
| 42 | + #define A3 PA5 | |
| 43 | + #define A4 PA4 | |
| 44 | + #define A5 PA3 | |
| 45 | + #define A6 PA2 | |
| 46 | + #define A7 PA1 | |
| 47 | + #define A8 PA0 | |
| 48 | + //STM32F1 have only 9 12bit adc | |
| 49 | + #define A9 PB0 | |
| 50 | + #define A10 PA7 | |
| 51 | + #define A11 PA6 | |
| 52 | + #define A12 PA5 | |
| 53 | + #define A13 PA4 | |
| 54 | + #define A14 PA3 | |
| 55 | + #define A15 PA2 | |
| 56 | + #endif | |
| 57 | + | |
| 58 | + | |
| 59 | +/* | |
| 60 | +*********************************************************************************************************** | |
| 61 | +* Schedules | |
| 62 | +*/ | |
| 63 | + #define MAX_TIMER_PERIOD 131070 //The longest period of time (in uS) that the timer can permit (IN this case it is 65535 * 2, as each timer tick is 2uS) | |
| 64 | + #define MAX_TIMER_PERIOD_SLOW 131070 //The longest period of time (in uS) that the timer can permit (IN this case it is 65535 * 2, as each timer tick is 2uS) | |
| 65 | + #define uS_TO_TIMER_COMPARE(uS) (uS >> 1) //Converts a given number of uS into the required number of timer ticks until that time has passed. | |
| 66 | + #define uS_TO_TIMER_COMPARE_SLOW(uS) (uS >> 1) //Converts a given number of uS into the required number of timer ticks until that time has passed. | |
| 67 | + #if defined(ARDUINO_ARCH_STM32) // STM32GENERIC core | |
| 68 | + #define FUEL1_COUNTER (TIM2)->CNT | |
| 69 | + #define FUEL2_COUNTER (TIM2)->CNT | |
| 70 | + #define FUEL3_COUNTER (TIM2)->CNT | |
| 71 | + #define FUEL4_COUNTER (TIM2)->CNT | |
| 72 | + | |
| 73 | + #define FUEL1_COMPARE (TIM2)->CCR1 | |
| 74 | + #define FUEL2_COMPARE (TIM2)->CCR2 | |
| 75 | + #define FUEL3_COMPARE (TIM2)->CCR3 | |
| 76 | + #define FUEL4_COMPARE (TIM2)->CCR4 | |
| 77 | + | |
| 78 | + #define IGN1_COUNTER (TIM3)->CNT | |
| 79 | + #define IGN2_COUNTER (TIM3)->CNT | |
| 80 | + #define IGN3_COUNTER (TIM3)->CNT | |
| 81 | + #define IGN4_COUNTER (TIM3)->CNT | |
| 82 | + | |
| 83 | + #define IGN1_COMPARE (TIM3)->CCR1 | |
| 84 | + #define IGN2_COMPARE (TIM3)->CCR2 | |
| 85 | + #define IGN3_COMPARE (TIM3)->CCR3 | |
| 86 | + #define IGN4_COMPARE (TIM3)->CCR4 | |
| 87 | + | |
| 88 | + #ifndef SMALL_FLASH_MODE | |
| 89 | + #define FUEL5_COUNTER (TIM5)->CNT | |
| 90 | + #define FUEL6_COUNTER (TIM5)->CNT | |
| 91 | + #define FUEL7_COUNTER (TIM5)->CNT | |
| 92 | + #define FUEL8_COUNTER (TIM5)->CNT | |
| 93 | + | |
| 94 | + #define FUEL5_COMPARE (TIM5)->CCR1 | |
| 95 | + #define FUEL6_COMPARE (TIM5)->CCR2 | |
| 96 | + #define FUEL7_COMPARE (TIM5)->CCR3 | |
| 97 | + #define FUEL8_COMPARE (TIM5)->CCR4 | |
| 98 | + | |
| 99 | + #define IGN5_COUNTER (TIM4)->CNT | |
| 100 | + #define IGN6_COUNTER (TIM4)->CNT | |
| 101 | + #define IGN7_COUNTER (TIM4)->CNT | |
| 102 | + #define IGN8_COUNTER (TIM4)->CNT | |
| 103 | + | |
| 104 | + #define IGN5_COMPARE (TIM4)->CCR1 | |
| 105 | + #define IGN6_COMPARE (TIM4)->CCR2 | |
| 106 | + #define IGN7_COMPARE (TIM4)->CCR3 | |
| 107 | + #define IGN8_COMPARE (TIM4)->CCR4 | |
| 108 | + #endif | |
| 109 | + //https://github.com/rogerclarkmelbourne/Arduino_STM32/blob/754bc2969921f1ef262bd69e7faca80b19db7524/STM32F1/system/libmaple/include/libmaple/timer.h#L444 | |
| 110 | + #define FUEL1_TIMER_ENABLE() (TIM2)->CCER |= TIM_CCER_CC1E | |
| 111 | + #define FUEL2_TIMER_ENABLE() (TIM2)->CCER |= TIM_CCER_CC2E | |
| 112 | + #define FUEL3_TIMER_ENABLE() (TIM2)->CCER |= TIM_CCER_CC3E | |
| 113 | + #define FUEL4_TIMER_ENABLE() (TIM2)->CCER |= TIM_CCER_CC4E | |
| 114 | + | |
| 115 | + #define FUEL1_TIMER_DISABLE() (TIM2)->CCER &= ~TIM_CCER_CC1E | |
| 116 | + #define FUEL2_TIMER_DISABLE() (TIM2)->CCER &= ~TIM_CCER_CC2E | |
| 117 | + #define FUEL3_TIMER_DISABLE() (TIM2)->CCER &= ~TIM_CCER_CC3E | |
| 118 | + #define FUEL4_TIMER_DISABLE() (TIM2)->CCER &= ~TIM_CCER_CC4E | |
| 119 | + | |
| 120 | + #define IGN1_TIMER_ENABLE() (TIM3)->CCER |= TIM_CCER_CC1E | |
| 121 | + #define IGN2_TIMER_ENABLE() (TIM3)->CCER |= TIM_CCER_CC2E | |
| 122 | + #define IGN3_TIMER_ENABLE() (TIM3)->CCER |= TIM_CCER_CC3E | |
| 123 | + #define IGN4_TIMER_ENABLE() (TIM3)->CCER |= TIM_CCER_CC4E | |
| 124 | + | |
| 125 | + #define IGN1_TIMER_DISABLE() (TIM3)->CCER &= ~TIM_CCER_CC1E | |
| 126 | + #define IGN2_TIMER_DISABLE() (TIM3)->CCER &= ~TIM_CCER_CC2E | |
| 127 | + #define IGN3_TIMER_DISABLE() (TIM3)->CCER &= ~TIM_CCER_CC3E | |
| 128 | + #define IGN4_TIMER_DISABLE() (TIM3)->CCER &= ~TIM_CCER_CC4E | |
| 129 | + | |
| 130 | + #ifndef SMALL_FLASH_MODE | |
| 131 | + #define FUEL5_TIMER_ENABLE() (TIM5)->CCER |= TIM_CCER_CC1E | |
| 132 | + #define FUEL6_TIMER_ENABLE() (TIM5)->CCER |= TIM_CCER_CC2E | |
| 133 | + #define FUEL7_TIMER_ENABLE() (TIM5)->CCER |= TIM_CCER_CC3E | |
| 134 | + #define FUEL8_TIMER_ENABLE() (TIM5)->CCER |= TIM_CCER_CC4E | |
| 135 | + | |
| 136 | + #define FUEL5_TIMER_DISABLE() (TIM5)->CCER &= ~TIM_CCER_CC1E | |
| 137 | + #define FUEL6_TIMER_DISABLE() (TIM5)->CCER &= ~TIM_CCER_CC2E | |
| 138 | + #define FUEL7_TIMER_DISABLE() (TIM5)->CCER &= ~TIM_CCER_CC3E | |
| 139 | + #define FUEL8_TIMER_DISABLE() (TIM5)->CCER &= ~TIM_CCER_CC4E | |
| 140 | + | |
| 141 | + #define IGN5_TIMER_ENABLE() (TIM4)->CCER |= TIM_CCER_CC1E | |
| 142 | + #define IGN6_TIMER_ENABLE() (TIM4)->CCER |= TIM_CCER_CC2E | |
| 143 | + #define IGN7_TIMER_ENABLE() (TIM4)->CCER |= TIM_CCER_CC3E | |
| 144 | + #define IGN8_TIMER_ENABLE() (TIM4)->CCER |= TIM_CCER_CC4E | |
| 145 | + | |
| 146 | + #define IGN5_TIMER_DISABLE() (TIM4)->CCER &= ~TIM_CCER_CC1E | |
| 147 | + #define IGN6_TIMER_DISABLE() (TIM4)->CCER &= ~TIM_CCER_CC2E | |
| 148 | + #define IGN7_TIMER_DISABLE() (TIM4)->CCER &= ~TIM_CCER_CC3E | |
| 149 | + #define IGN8_TIMER_DISABLE() (TIM4)->CCER &= ~TIM_CCER_CC4E | |
| 150 | + #endif | |
| 151 | + #else //libmaple core aka STM32DUINO | |
| 152 | + #define FUEL1_COUNTER (TIMER2->regs).gen->CNT | |
| 153 | + #define FUEL2_COUNTER (TIMER2->regs).gen->CNT | |
| 154 | + #define FUEL3_COUNTER (TIMER2->regs).gen->CNT | |
| 155 | + #define FUEL4_COUNTER (TIMER2->regs).gen->CNT | |
| 156 | + | |
| 157 | + #define FUEL1_COMPARE (TIMER2->regs).gen->CCR1 | |
| 158 | + #define FUEL2_COMPARE (TIMER2->regs).gen->CCR2 | |
| 159 | + #define FUEL3_COMPARE (TIMER2->regs).gen->CCR3 | |
| 160 | + #define FUEL4_COMPARE (TIMER2->regs).gen->CCR4 | |
| 161 | + | |
| 162 | + #define IGN1_COUNTER (TIMER3->regs).gen->CNT | |
| 163 | + #define IGN2_COUNTER (TIMER3->regs).gen->CNT | |
| 164 | + #define IGN3_COUNTER (TIMER3->regs).gen->CNT | |
| 165 | + #define IGN4_COUNTER (TIMER3->regs).gen->CNT | |
| 166 | + | |
| 167 | + #define IGN1_COMPARE (TIMER3->regs).gen->CCR1 | |
| 168 | + #define IGN2_COMPARE (TIMER3->regs).gen->CCR2 | |
| 169 | + #define IGN3_COMPARE (TIMER3->regs).gen->CCR3 | |
| 170 | + #define IGN4_COMPARE (TIMER3->regs).gen->CCR4 | |
| 171 | + | |
| 172 | + #ifndef SMALL_FLASH_MODE | |
| 173 | + #define FUEL5_COUNTER (TIMER5->regs).gen->CNT | |
| 174 | + #define FUEL6_COUNTER (TIMER5->regs).gen->CNT | |
| 175 | + #define FUEL7_COUNTER (TIMER5->regs).gen->CNT | |
| 176 | + #define FUEL8_COUNTER (TIMER5->regs).gen->CNT | |
| 177 | + | |
| 178 | + #define FUEL5_COMPARE (TIMER5->regs).gen->CCR1 | |
| 179 | + #define FUEL6_COMPARE (TIMER5->regs).gen->CCR2 | |
| 180 | + #define FUEL7_COMPARE (TIMER5->regs).gen->CCR3 | |
| 181 | + #define FUEL8_COMPARE (TIMER5->regs).gen->CCR4 | |
| 182 | + | |
| 183 | + #define IGN5_COUNTER (TIMER4->regs).gen->CNT | |
| 184 | + #define IGN6_COUNTER (TIMER4->regs).gen->CNT | |
| 185 | + #define IGN7_COUNTER (TIMER4->regs).gen->CNT | |
| 186 | + #define IGN8_COUNTER (TIMER4->regs).gen->CNT | |
| 187 | + | |
| 188 | + #define IGN5_COMPARE (TIMER4->regs).gen->CCR1 | |
| 189 | + #define IGN6_COMPARE (TIMER4->regs).gen->CCR2 | |
| 190 | + #define IGN7_COMPARE (TIMER4->regs).gen->CCR3 | |
| 191 | + #define IGN8_COMPARE (TIMER4->regs).gen->CCR4 | |
| 192 | + #endif | |
| 193 | + //https://github.com/rogerclarkmelbourne/Arduino_STM32/blob/754bc2969921f1ef262bd69e7faca80b19db7524/STM32F1/system/libmaple/include/libmaple/timer.h#L444 | |
| 194 | + #define FUEL1_TIMER_ENABLE() (TIMER2->regs).gen->CCER |= TIMER_CCER_CC1E | |
| 195 | + #define FUEL2_TIMER_ENABLE() (TIMER2->regs).gen->CCER |= TIMER_CCER_CC2E | |
| 196 | + #define FUEL3_TIMER_ENABLE() (TIMER2->regs).gen->CCER |= TIMER_CCER_CC3E | |
| 197 | + #define FUEL4_TIMER_ENABLE() (TIMER2->regs).gen->CCER |= TIMER_CCER_CC4E | |
| 198 | + | |
| 199 | + #define FUEL1_TIMER_DISABLE() (TIMER2->regs).gen->CCER &= ~TIMER_CCER_CC1E | |
| 200 | + #define FUEL2_TIMER_DISABLE() (TIMER2->regs).gen->CCER &= ~TIMER_CCER_CC2E | |
| 201 | + #define FUEL3_TIMER_DISABLE() (TIMER2->regs).gen->CCER &= ~TIMER_CCER_CC3E | |
| 202 | + #define FUEL4_TIMER_DISABLE() (TIMER2->regs).gen->CCER &= ~TIMER_CCER_CC4E | |
| 203 | + | |
| 204 | + #define IGN1_TIMER_DISABLE() (TIMER3->regs).gen->CCER &= ~TIMER_CCER_CC1E | |
| 205 | + #define IGN2_TIMER_DISABLE() (TIMER3->regs).gen->CCER &= ~TIMER_CCER_CC2E | |
| 206 | + #define IGN3_TIMER_DISABLE() (TIMER3->regs).gen->CCER &= ~TIMER_CCER_CC3E | |
| 207 | + #define IGN4_TIMER_DISABLE() (TIMER3->regs).gen->CCER &= ~TIMER_CCER_CC4E | |
| 208 | + | |
| 209 | + #define IGN1_TIMER_ENABLE() (TIMER3->regs).gen->CCER |= TIMER_CCER_CC1E | |
| 210 | + #define IGN2_TIMER_ENABLE() (TIMER3->regs).gen->CCER |= TIMER_CCER_CC2E | |
| 211 | + #define IGN3_TIMER_ENABLE() (TIMER3->regs).gen->CCER |= TIMER_CCER_CC3E | |
| 212 | + #define IGN4_TIMER_ENABLE() (TIMER3->regs).gen->CCER |= TIMER_CCER_CC4E | |
| 213 | + | |
| 214 | + #ifndef SMALL_FLASH_MODE | |
| 215 | + #define FUEL5_TIMER_ENABLE() (TIMER5->regs).gen->CCER |= TIMER_CCER_CC1E | |
| 216 | + #define FUEL6_TIMER_ENABLE() (TIMER5->regs).gen->CCER |= TIMER_CCER_CC2E | |
| 217 | + #define FUEL7_TIMER_ENABLE() (TIMER5->regs).gen->CCER |= TIMER_CCER_CC3E | |
| 218 | + #define FUEL8_TIMER_ENABLE() (TIMER5->regs).gen->CCER |= TIMER_CCER_CC4E | |
| 219 | + | |
| 220 | + #define IGN5_TIMER_ENABLE() (TIMER4->regs).gen->CCER |= TIMER_CCER_CC1E | |
| 221 | + #define IGN6_TIMER_ENABLE() (TIMER4->regs).gen->CCER |= TIMER_CCER_CC2E | |
| 222 | + #define IGN7_TIMER_ENABLE() (TIMER4->regs).gen->CCER |= TIMER_CCER_CC3E | |
| 223 | + #define IGN8_TIMER_ENABLE() (TIMER4->regs).gen->CCER |= TIMER_CCER_CC4E | |
| 224 | + | |
| 225 | + #define FUEL5_TIMER_DISABLE() (TIMER5->regs).gen->CCER &= ~TIMER_CCER_CC1E | |
| 226 | + #define FUEL6_TIMER_DISABLE() (TIMER5->regs).gen->CCER &= ~TIMER_CCER_CC2E | |
| 227 | + #define FUEL7_TIMER_DISABLE() (TIMER5->regs).gen->CCER &= ~TIMER_CCER_CC3E | |
| 228 | + #define FUEL8_TIMER_DISABLE() (TIMER5->regs).gen->CCER &= ~TIMER_CCER_CC4E | |
| 229 | + | |
| 230 | + #define IGN5_TIMER_DISABLE() (TIMER4->regs).gen->CCER &= ~TIMER_CCER_CC1E | |
| 231 | + #define IGN6_TIMER_DISABLE() (TIMER4->regs).gen->CCER &= ~TIMER_CCER_CC2E | |
| 232 | + #define IGN7_TIMER_DISABLE() (TIMER4->regs).gen->CCER &= ~TIMER_CCER_CC3E | |
| 233 | + #define IGN8_TIMER_DISABLE() (TIMER4->regs).gen->CCER &= ~TIMER_CCER_CC4E | |
| 234 | + #endif | |
| 235 | +#endif | |
| 236 | + | |
| 237 | +/* | |
| 238 | +*********************************************************************************************************** | |
| 239 | +* Auxilliaries | |
| 240 | +*/ | |
| 241 | + #if defined(ARDUINO_ARCH_STM32) // STM32GENERIC core | |
| 242 | + #define ENABLE_BOOST_TIMER() (TIM1)->CCER |= TIM_CCER_CC2E | |
| 243 | + #define DISABLE_BOOST_TIMER() (TIM1)->CCER &= ~TIM_CCER_CC2E | |
| 244 | + | |
| 245 | + #define ENABLE_VVT_TIMER() (TIM1)->CCER |= TIM_CCER_CC3E | |
| 246 | + #define DISABLE_VVT_TIMER() (TIM1)->CCER &= ~TIM_CCER_CC3E | |
| 247 | + | |
| 248 | + #define BOOST_TIMER_COMPARE (TIM1)->CCR2 | |
| 249 | + #define BOOST_TIMER_COUNTER (TIM1)->CNT | |
| 250 | + #define VVT_TIMER_COMPARE (TIM1)->CCR3 | |
| 251 | + #define VVT_TIMER_COUNTER (TIM1)->CNT | |
| 252 | + #else //libmaple core aka STM32DUINO | |
| 253 | + #define ENABLE_BOOST_TIMER() (TIMER1->regs).gen->CCER |= TIMER_CCER_CC2E | |
| 254 | + #define DISABLE_BOOST_TIMER() (TIMER1->regs).gen->CCER &= ~TIMER_CCER_CC2E | |
| 255 | + | |
| 256 | + #define ENABLE_VVT_TIMER() (TIMER1->regs).gen->CCER |= TIMER_CCER_CC3E | |
| 257 | + #define DISABLE_VVT_TIMER() (TIMER1->regs).gen->CCER &= ~TIMER_CCER_CC3E | |
| 258 | + | |
| 259 | + #define BOOST_TIMER_COMPARE (TIMER1->regs).gen->CCR2 | |
| 260 | + #define BOOST_TIMER_COUNTER (TIMER1->regs).gen->CNT | |
| 261 | + #define VVT_TIMER_COMPARE (TIMER1->regs).gen->CCR3 | |
| 262 | + #define VVT_TIMER_COUNTER (TIMER1->regs).gen->CNT | |
| 263 | + #endif | |
| 264 | + | |
| 265 | +/* | |
| 266 | +*********************************************************************************************************** | |
| 267 | +* Idle | |
| 268 | +*/ | |
| 269 | + #if defined(ARDUINO_ARCH_STM32) // STM32GENERIC core | |
| 270 | + #define IDLE_COUNTER (TIM1)->CNT | |
| 271 | + #define IDLE_COMPARE (TIM1)->CCR4 | |
| 272 | + | |
| 273 | + #define IDLE_TIMER_ENABLE() (TIM1)->CCER |= TIM_CCER_CC4E | |
| 274 | + #define IDLE_TIMER_DISABLE() (TIM1)->CCER &= ~TIM_CCER_CC4E | |
| 275 | + #else //libmaple core aka STM32DUINO | |
| 276 | + #define IDLE_COUNTER (TIMER1->regs).gen->CNT | |
| 277 | + #define IDLE_COMPARE (TIMER1->regs).gen->CCR4 | |
| 278 | + | |
| 279 | + #define IDLE_TIMER_ENABLE() (TIMER1->regs).gen->CCER |= TIMER_CCER_CC4E | |
| 280 | + #define IDLE_TIMER_DISABLE() (TIMER1->regs).gen->CCER &= ~TIMER_CCER_CC4E | |
| 281 | + #endif | |
| 282 | + | |
| 283 | +/* | |
| 284 | +*********************************************************************************************************** | |
| 285 | +* Timers | |
| 286 | +*/ | |
| 287 | + | |
| 288 | + | |
| 289 | +/* | |
| 290 | +*********************************************************************************************************** | |
| 291 | +* CAN / Second serial | |
| 292 | +*/ | |
| 293 | + | |
| 294 | +#endif //CORE_STM32 | |
| 295 | +#endif //STM32_H | |
| \ No newline at end of file |
| @@ -0,0 +1,138 @@ | ||
| 1 | +#ifndef TEENSY35_H | |
| 2 | +#define TEENSY35_H | |
| 3 | +#if defined(CORE_TEENSY) | |
| 4 | + | |
| 5 | +/* | |
| 6 | +*********************************************************************************************************** | |
| 7 | +* General | |
| 8 | +*/ | |
| 9 | + void initBoard(); | |
| 10 | + uint16_t freeRam(); | |
| 11 | + #define PORT_TYPE uint8_t //Size of the port variables | |
| 12 | + #define BOARD_DIGITAL_GPIO_PINS 34 | |
| 13 | + #define BOARD_NR_GPIO_PINS 34 | |
| 14 | + #define USE_SERIAL3 | |
| 15 | + | |
| 16 | + #define micros_safe() micros() //timer5 method is not used on anything but AVR, the micros_safe() macro is simply an alias for the normal micros() | |
| 17 | + | |
| 18 | +/* | |
| 19 | +*********************************************************************************************************** | |
| 20 | +* Schedules | |
| 21 | +*/ | |
| 22 | + //http://shawnhymel.com/661/learning-the-teensy-lc-interrupt-service-routines/ | |
| 23 | + #define FUEL1_COUNTER FTM0_CNT | |
| 24 | + #define FUEL2_COUNTER FTM0_CNT | |
| 25 | + #define FUEL3_COUNTER FTM0_CNT | |
| 26 | + #define FUEL4_COUNTER FTM0_CNT | |
| 27 | + #define FUEL5_COUNTER FTM3_CNT | |
| 28 | + #define FUEL6_COUNTER FTM3_CNT | |
| 29 | + #define FUEL7_COUNTER FTM3_CNT | |
| 30 | + #define FUEL8_COUNTER FTM3_CNT | |
| 31 | + | |
| 32 | + #define IGN1_COUNTER FTM0_CNT | |
| 33 | + #define IGN2_COUNTER FTM0_CNT | |
| 34 | + #define IGN3_COUNTER FTM0_CNT | |
| 35 | + #define IGN4_COUNTER FTM0_CNT | |
| 36 | + #define IGN5_COUNTER FTM3_CNT | |
| 37 | + #define IGN6_COUNTER FTM3_CNT | |
| 38 | + #define IGN7_COUNTER FTM3_CNT | |
| 39 | + #define IGN8_COUNTER FTM3_CNT | |
| 40 | + | |
| 41 | + #define FUEL1_COMPARE FTM0_C0V | |
| 42 | + #define FUEL2_COMPARE FTM0_C1V | |
| 43 | + #define FUEL3_COMPARE FTM0_C2V | |
| 44 | + #define FUEL4_COMPARE FTM0_C3V | |
| 45 | + #define FUEL5_COMPARE FTM3_C0V | |
| 46 | + #define FUEL6_COMPARE FTM3_C1V | |
| 47 | + #define FUEL7_COMPARE FTM3_C2V | |
| 48 | + #define FUEL8_COMPARE FTM3_C3V | |
| 49 | + | |
| 50 | + #define IGN1_COMPARE FTM0_C4V | |
| 51 | + #define IGN2_COMPARE FTM0_C5V | |
| 52 | + #define IGN3_COMPARE FTM0_C6V | |
| 53 | + #define IGN4_COMPARE FTM0_C7V | |
| 54 | + #define IGN5_COMPARE FTM3_C4V | |
| 55 | + #define IGN6_COMPARE FTM3_C5V | |
| 56 | + #define IGN7_COMPARE FTM3_C6V | |
| 57 | + #define IGN8_COMPARE FTM3_C7V | |
| 58 | + | |
| 59 | + #define FUEL1_TIMER_ENABLE() FTM0_C0SC |= FTM_CSC_CHIE //Write 1 to the CHIE (Channel Interrupt Enable) bit of channel 0 Status/Control | |
| 60 | + #define FUEL2_TIMER_ENABLE() FTM0_C1SC |= FTM_CSC_CHIE | |
| 61 | + #define FUEL3_TIMER_ENABLE() FTM0_C2SC |= FTM_CSC_CHIE | |
| 62 | + #define FUEL4_TIMER_ENABLE() FTM0_C3SC |= FTM_CSC_CHIE | |
| 63 | + #define FUEL5_TIMER_ENABLE() FTM3_C0SC |= FTM_CSC_CHIE | |
| 64 | + #define FUEL6_TIMER_ENABLE() FTM3_C1SC |= FTM_CSC_CHIE | |
| 65 | + #define FUEL7_TIMER_ENABLE() FTM3_C2SC |= FTM_CSC_CHIE | |
| 66 | + #define FUEL8_TIMER_ENABLE() FTM3_C3SC |= FTM_CSC_CHIE | |
| 67 | + | |
| 68 | + #define FUEL1_TIMER_DISABLE() FTM0_C0SC &= ~FTM_CSC_CHIE //Write 0 to the CHIE (Channel Interrupt Enable) bit of channel 0 Status/Control | |
| 69 | + #define FUEL2_TIMER_DISABLE() FTM0_C1SC &= ~FTM_CSC_CHIE | |
| 70 | + #define FUEL3_TIMER_DISABLE() FTM0_C2SC &= ~FTM_CSC_CHIE | |
| 71 | + #define FUEL4_TIMER_DISABLE() FTM0_C3SC &= ~FTM_CSC_CHIE | |
| 72 | + #define FUEL5_TIMER_DISABLE() FTM3_C0SC &= ~FTM_CSC_CHIE //Write 0 to the CHIE (Channel Interrupt Enable) bit of channel 0 Status/Control | |
| 73 | + #define FUEL6_TIMER_DISABLE() FTM3_C1SC &= ~FTM_CSC_CHIE | |
| 74 | + #define FUEL7_TIMER_DISABLE() FTM3_C2SC &= ~FTM_CSC_CHIE | |
| 75 | + #define FUEL8_TIMER_DISABLE() FTM3_C3SC &= ~FTM_CSC_CHIE | |
| 76 | + | |
| 77 | + #define IGN1_TIMER_ENABLE() FTM0_C4SC |= FTM_CSC_CHIE | |
| 78 | + #define IGN2_TIMER_ENABLE() FTM0_C5SC |= FTM_CSC_CHIE | |
| 79 | + #define IGN3_TIMER_ENABLE() FTM0_C6SC |= FTM_CSC_CHIE | |
| 80 | + #define IGN4_TIMER_ENABLE() FTM0_C7SC |= FTM_CSC_CHIE | |
| 81 | + #define IGN5_TIMER_ENABLE() FTM3_C4SC |= FTM_CSC_CHIE | |
| 82 | + #define IGN6_TIMER_ENABLE() FTM3_C5SC |= FTM_CSC_CHIE | |
| 83 | + #define IGN7_TIMER_ENABLE() FTM3_C6SC |= FTM_CSC_CHIE | |
| 84 | + #define IGN8_TIMER_ENABLE() FTM3_C7SC |= FTM_CSC_CHIE | |
| 85 | + | |
| 86 | + #define IGN1_TIMER_DISABLE() FTM0_C4SC &= ~FTM_CSC_CHIE | |
| 87 | + #define IGN2_TIMER_DISABLE() FTM0_C5SC &= ~FTM_CSC_CHIE | |
| 88 | + #define IGN3_TIMER_DISABLE() FTM0_C6SC &= ~FTM_CSC_CHIE | |
| 89 | + #define IGN4_TIMER_DISABLE() FTM0_C7SC &= ~FTM_CSC_CHIE | |
| 90 | + #define IGN5_TIMER_DISABLE() FTM3_C4SC &= ~FTM_CSC_CHIE | |
| 91 | + #define IGN6_TIMER_DISABLE() FTM3_C5SC &= ~FTM_CSC_CHIE | |
| 92 | + #define IGN7_TIMER_DISABLE() FTM3_C6SC &= ~FTM_CSC_CHIE | |
| 93 | + #define IGN8_TIMER_DISABLE() FTM3_C7SC &= ~FTM_CSC_CHIE | |
| 94 | + | |
| 95 | + #define MAX_TIMER_PERIOD 139808 // 2.13333333uS * 65535 | |
| 96 | + #define MAX_TIMER_PERIOD_SLOW 139808 | |
| 97 | + #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. | |
| 98 | + //Hack compatibility with AVR timers that run at different speeds | |
| 99 | + #define uS_TO_TIMER_COMPARE_SLOW(uS) ((uS * 15) >> 5) | |
| 100 | + | |
| 101 | +/* | |
| 102 | +*********************************************************************************************************** | |
| 103 | +* Auxilliaries | |
| 104 | +*/ | |
| 105 | + #define ENABLE_BOOST_TIMER() FTM1_C0SC |= FTM_CSC_CHIE | |
| 106 | + #define DISABLE_BOOST_TIMER() FTM1_C0SC &= ~FTM_CSC_CHIE | |
| 107 | + | |
| 108 | + #define ENABLE_VVT_TIMER() FTM1_C1SC |= FTM_CSC_CHIE | |
| 109 | + #define DISABLE_VVT_TIMER() FTM1_C1SC &= ~FTM_CSC_CHIE | |
| 110 | + | |
| 111 | + #define BOOST_TIMER_COMPARE FTM1_C0V | |
| 112 | + #define BOOST_TIMER_COUNTER FTM1_CNT | |
| 113 | + #define VVT_TIMER_COMPARE FTM1_C1V | |
| 114 | + #define VVT_TIMER_COUNTER FTM1_CNT | |
| 115 | + | |
| 116 | + static inline void boostInterrupt(); | |
| 117 | + static inline void vvtInterrupt(); | |
| 118 | + | |
| 119 | +/* | |
| 120 | +*********************************************************************************************************** | |
| 121 | +* Idle | |
| 122 | +*/ | |
| 123 | + #define IDLE_COUNTER FTM2_CNT | |
| 124 | + #define IDLE_COMPARE FTM2_C0V | |
| 125 | + | |
| 126 | + #define IDLE_TIMER_ENABLE() FTM2_C0SC |= FTM_CSC_CHIE | |
| 127 | + #define IDLE_TIMER_DISABLE() FTM2_C0SC &= ~FTM_CSC_CHIE | |
| 128 | + | |
| 129 | + static inline void idleInterrupt(); | |
| 130 | + | |
| 131 | +/* | |
| 132 | +*********************************************************************************************************** | |
| 133 | +* CAN / Second serial | |
| 134 | +*/ | |
| 135 | + //Uart CANSerial (&sercom3, 0, 1, SERCOM_RX_PAD_1, UART_TX_PAD_0); | |
| 136 | + | |
| 137 | +#endif //CORE_TEENSY | |
| 138 | +#endif //TEENSY35_H | |
| \ No newline at end of file |
| @@ -0,0 +1,142 @@ | ||
| 1 | +#ifndef TEMPLATE_H | |
| 2 | +#define TEMPLATE_H | |
| 3 | +#if defined(CORE_TEMPLATE) | |
| 4 | + | |
| 5 | +/* | |
| 6 | +*********************************************************************************************************** | |
| 7 | +* General | |
| 8 | +*/ | |
| 9 | + #define PORT_TYPE uint32_t //Size of the port variables (Eg inj1_pin_port). Most systems use a byte, but SAMD21 and possibly others are a 32-bit unsigned int | |
| 10 | + #define BOARD_NR_GPIO_PINS 52 //Not sure this is correct | |
| 11 | + #define BOARD_DIGITAL_GPIO_PINS 52 //Pretty sure this isn't right | |
| 12 | + #define micros_safe() micros() //timer5 method is not used on anything but AVR, the micros_safe() macro is simply an alias for the normal micros() | |
| 13 | + void initBoard(); | |
| 14 | + uint16_t freeRam(); | |
| 15 | + | |
| 16 | + | |
| 17 | +/* | |
| 18 | +*********************************************************************************************************** | |
| 19 | +* Schedules | |
| 20 | +*/ | |
| 21 | + | |
| 22 | + #define FUEL1_COUNTER <register here> | |
| 23 | + #define FUEL2_COUNTER <register here> | |
| 24 | + #define FUEL3_COUNTER <register here> | |
| 25 | + #define FUEL4_COUNTER <register here> | |
| 26 | + //The below are optional, but recommended if there are sufficient timers/compares | |
| 27 | + #define FUEL5_COUNTER <register here> | |
| 28 | + #define FUEL6_COUNTER <register here> | |
| 29 | + #define FUEL7_COUNTER <register here> | |
| 30 | + #define FUEL8_COUNTER <register here> | |
| 31 | + | |
| 32 | + #define IGN1_COUNTER <register here> | |
| 33 | + #define IGN2_COUNTER <register here> | |
| 34 | + #define IGN3_COUNTER <register here> | |
| 35 | + #define IGN4_COUNTER <register here> | |
| 36 | + //The below are optional, but recommended if there are sufficient timers/compares | |
| 37 | + #define IGN5_COUNTER <register here> | |
| 38 | + #define IGN6_COUNTER <register here> | |
| 39 | + #define IGN7_COUNTER <register here> | |
| 40 | + #define IGN8_COUNTER <register here> | |
| 41 | + | |
| 42 | + #define FUEL1_COMPARE <register here> | |
| 43 | + #define FUEL2_COMPARE <register here> | |
| 44 | + #define FUEL3_COMPARE <register here> | |
| 45 | + #define FUEL4_COMPARE <register here> | |
| 46 | + //The below are optional, but recommended if there are sufficient timers/compares | |
| 47 | + #define FUEL5_COMPARE <register here> | |
| 48 | + #define FUEL6_COMPARE <register here> | |
| 49 | + #define FUEL7_COMPARE <register here> | |
| 50 | + #define FUEL8_COMPARE <register here> | |
| 51 | + | |
| 52 | + #define IGN1_COMPARE <register here> | |
| 53 | + #define IGN2_COMPARE <register here> | |
| 54 | + #define IGN3_COMPARE <register here> | |
| 55 | + #define IGN4_COMPARE <register here> | |
| 56 | + //The below are optional, but recommended if there are sufficient timers/compares | |
| 57 | + #define IGN5_COMPARE <register here> | |
| 58 | + #define IGN6_COMPARE <register here> | |
| 59 | + #define IGN7_COMPARE <register here> | |
| 60 | + #define IGN8_COMPARE <register here> | |
| 61 | + | |
| 62 | + #define FUEL1_TIMER_ENABLE() <macro here> | |
| 63 | + #define FUEL2_TIMER_ENABLE() <macro here> | |
| 64 | + #define FUEL3_TIMER_ENABLE() <macro here> | |
| 65 | + #define FUEL4_TIMER_ENABLE() <macro here> | |
| 66 | + //The below are optional, but recommended if there are sufficient timers/compares | |
| 67 | + #define FUEL5_TIMER_ENABLE() <macro here> | |
| 68 | + #define FUEL6_TIMER_ENABLE() <macro here> | |
| 69 | + #define FUEL7_TIMER_ENABLE() <macro here> | |
| 70 | + #define FUEL8_TIMER_ENABLE() <macro here> | |
| 71 | + | |
| 72 | + #define FUEL1_TIMER_DISABLE() <macro here> | |
| 73 | + #define FUEL2_TIMER_DISABLE() <macro here> | |
| 74 | + #define FUEL3_TIMER_DISABLE() <macro here> | |
| 75 | + #define FUEL4_TIMER_DISABLE() <macro here> | |
| 76 | + //The below are optional, but recommended if there are sufficient timers/compares | |
| 77 | + #define FUEL5_TIMER_DISABLE() <macro here> | |
| 78 | + #define FUEL6_TIMER_DISABLE() <macro here> | |
| 79 | + #define FUEL7_TIMER_DISABLE() <macro here> | |
| 80 | + #define FUEL8_TIMER_DISABLE() <macro here> | |
| 81 | + | |
| 82 | + #define IGN1_TIMER_ENABLE() <macro here> | |
| 83 | + #define IGN2_TIMER_ENABLE() <macro here> | |
| 84 | + #define IGN3_TIMER_ENABLE() <macro here> | |
| 85 | + #define IGN4_TIMER_ENABLE() <macro here> | |
| 86 | + //The below are optional, but recommended if there are sufficient timers/compares | |
| 87 | + #define IGN5_TIMER_ENABLE() <macro here> | |
| 88 | + #define IGN6_TIMER_ENABLE() <macro here> | |
| 89 | + #define IGN7_TIMER_ENABLE() <macro here> | |
| 90 | + #define IGN8_TIMER_ENABLE() <macro here> | |
| 91 | + | |
| 92 | + #define IGN1_TIMER_DISABLE() <macro here> | |
| 93 | + #define IGN2_TIMER_DISABLE() <macro here> | |
| 94 | + #define IGN3_TIMER_DISABLE() <macro here> | |
| 95 | + #define IGN4_TIMER_DISABLE() <macro here> | |
| 96 | + //The below are optional, but recommended if there are sufficient timers/compares | |
| 97 | + #define IGN5_TIMER_DISABLE() <macro here> | |
| 98 | + #define IGN6_TIMER_DISABLE() <macro here> | |
| 99 | + #define IGN7_TIMER_DISABLE() <macro here> | |
| 100 | + #define IGN8_TIMER_DISABLE() <macro here> | |
| 101 | + | |
| 102 | + | |
| 103 | + #define MAX_TIMER_PERIOD 139808 //This is the maximum time, in uS, that the compare channels can run before overflowing. It is typically 65535 * <how long each tick represents> | |
| 104 | + #define MAX_TIMER_PERIOD_SLOW 139808 //If there is a second timer speed used, this is the same as above for that | |
| 105 | + #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. | |
| 106 | + #define uS_TO_TIMER_COMPARE_SLOW(uS) ((uS * 15) >> 5) //As above, but for the alternative slow timer if required | |
| 107 | + | |
| 108 | +/* | |
| 109 | +*********************************************************************************************************** | |
| 110 | +* Auxilliaries | |
| 111 | +*/ | |
| 112 | + //macro functions for enabling and disabling timer interrupts for the boost and vvt functions | |
| 113 | + #define ENABLE_BOOST_TIMER() <macro here> | |
| 114 | + #define DISABLE_BOOST_TIMER() <macro here> | |
| 115 | + | |
| 116 | + #define ENABLE_VVT_TIMER() <macro here> | |
| 117 | + #define DISABLE_VVT_TIMER() <macro here> | |
| 118 | + | |
| 119 | + #define BOOST_TIMER_COMPARE <register here> | |
| 120 | + #define BOOST_TIMER_COUNTER <register here> | |
| 121 | + #define VVT_TIMER_COMPARE <register here> | |
| 122 | + #define VVT_TIMER_COUNTER <register here> | |
| 123 | + | |
| 124 | +/* | |
| 125 | +*********************************************************************************************************** | |
| 126 | +* Idle | |
| 127 | +*/ | |
| 128 | + //Same as above, but for the timer controlling PWM idle | |
| 129 | + #define IDLE_COUNTER <register here> | |
| 130 | + #define IDLE_COMPARE <register here> | |
| 131 | + | |
| 132 | + #define IDLE_TIMER_ENABLE() <macro here> | |
| 133 | + #define IDLE_TIMER_DISABLE() <macro here> | |
| 134 | + | |
| 135 | +/* | |
| 136 | +*********************************************************************************************************** | |
| 137 | +* CAN / Second serial | |
| 138 | +*/ | |
| 139 | + | |
| 140 | + | |
| 141 | +#endif //CORE_TEMPLATE | |
| 142 | +#endif //TEMPLATE_H | |
| \ No newline at end of file |
| @@ -1,7 +1,5 @@ | ||
| 1 | 1 | #ifndef CANCOMMS_H |
| 2 | 2 | #define CANCOMMS_H |
| 3 | -//These are the page numbers that the Tuner Studio serial protocol uses to transverse the different map and config pages. | |
| 4 | -#define veMapPage 1 | |
| 5 | 3 | |
| 6 | 4 | #define CAN_PACKET_SIZE 75 |
| 7 | 5 |
| @@ -30,4 +28,4 @@ | ||
| 30 | 28 | void sendcanValues(uint16_t offset, uint16_t packetLength, byte cmd, byte portNum); |
| 31 | 29 | void sendCancommand(uint8_t cmdtype , uint16_t canadddress, uint8_t candata1, uint8_t candata2, uint16_t sourcecanAddress); |
| 32 | 30 | |
| 33 | -#endif // CANCOMMS_H | |
| 31 | +#endif // CANCOMMS_H |
| @@ -1,8 +1,8 @@ | ||
| 1 | 1 | #ifndef COMMS_H |
| 2 | 2 | #define COMMS_H |
| 3 | 3 | //These are the page numbers that the Tuner Studio serial protocol uses to transverse the different map and config pages. |
| 4 | -#define veMapPage 1 | |
| 5 | -#define veSetPage 2//Config Page 1 | |
| 4 | +#define veMapPage 2 | |
| 5 | +#define veSetPage 1 //Note that this and the veMapPage were swapped in Feb 2019 as the 'algorithm' field must be declared in the ini before it's used in the fuel table | |
| 6 | 6 | #define ignMapPage 3 |
| 7 | 7 | #define ignSetPage 4//Config Page 2 |
| 8 | 8 | #define afrMapPage 5 |
| @@ -48,12 +48,12 @@ | ||
| 48 | 48 | }; |
| 49 | 49 | |
| 50 | 50 | void command();//This is the heart of the Command Line Interpeter. All that needed to be done was to make it human readable. |
| 51 | -void sendValues(uint16_t offset, uint16_t packetlength,byte cmd, byte portnum); | |
| 52 | -void receiveValue(int offset, byte newValue); | |
| 51 | +void sendValues(uint16_t, uint16_t,byte, byte); | |
| 52 | +void receiveValue(int, byte); | |
| 53 | 53 | void saveConfig(); |
| 54 | -void sendPage(bool useChar); | |
| 55 | -void receiveCalibration(byte tableID); | |
| 56 | -void sendToothLog(bool useChar); | |
| 54 | +void sendPage(bool); | |
| 55 | +void receiveCalibration(byte); | |
| 56 | +void sendToothLog(bool); | |
| 57 | 57 | void testComm(); |
| 58 | 58 | void commandButtons(); |
| 59 | 59 |
| @@ -3,7 +3,7 @@ | ||
| 3 | 3 | #include <Arduino.h> |
| 4 | 4 | #include "table.h" |
| 5 | 5 | |
| 6 | -//These are configuration options for changing around the outputs that are used | |
| 6 | +//These are configuration options for changing around the outputs that are used. THese are just the defaults and may be changed in the sections below based on the hardware in use. | |
| 7 | 7 | #define INJ_CHANNELS 4 |
| 8 | 8 | #define IGN_CHANNELS 5 |
| 9 | 9 |
| @@ -12,15 +12,16 @@ | ||
| 12 | 12 | #define BOARD_NR_GPIO_PINS 62 |
| 13 | 13 | #define LED_BUILTIN 13 |
| 14 | 14 | #define CORE_AVR |
| 15 | + #define BOARD_H "board_avr2560.h" | |
| 15 | 16 | |
| 16 | 17 | //#define TIMER5_MICROS |
| 17 | 18 | |
| 18 | 19 | #elif defined(CORE_TEENSY) |
| 19 | - #define BOARD_DIGITAL_GPIO_PINS 34 | |
| 20 | - #define BOARD_NR_GPIO_PINS 34 | |
| 20 | + #define BOARD_H "board_teensy35.h" | |
| 21 | 21 | |
| 22 | 22 | #elif defined(STM32_MCU_SERIES) || defined(ARDUINO_ARCH_STM32) || defined(__STM32F1__) || defined(STM32F4) || defined(STM32) |
| 23 | 23 | #define CORE_STM32 |
| 24 | + #define BOARD_H "board_stm32.h" | |
| 24 | 25 | #ifndef word |
| 25 | 26 | #define word(h, l) ((h << 8) | l) //word() function not defined for this platform in the main library |
| 26 | 27 | #endif |
| @@ -34,10 +35,16 @@ | ||
| 34 | 35 | #define BOARD_DIGITAL_GPIO_PINS 80 |
| 35 | 36 | #define BOARD_NR_GPIO_PINS 80 |
| 36 | 37 | #define LED_BUILTIN PA7 |
| 38 | + | |
| 39 | + //These boards always make 8/8 channels available | |
| 40 | + #undef INJ_CHANNELS | |
| 41 | + #undef IGN_CHANNELS | |
| 42 | + #define INJ_CHANNELS 8 | |
| 43 | + #define IGN_CHANNELS 8 | |
| 37 | 44 | #endif |
| 38 | 45 | |
| 39 | 46 | //Specific mode for Bluepill due to its small flash size. This disables a number of strings from being compiled into the flash |
| 40 | - #if defined(MCU_STM32F103C8) | defined(MCU_STM32F103CB) | |
| 47 | + #if defined(MCU_STM32F103C8) || defined(MCU_STM32F103CB) | |
| 41 | 48 | #define SMALL_FLASH_MODE |
| 42 | 49 | #endif |
| 43 | 50 |
| @@ -51,10 +58,16 @@ | ||
| 51 | 58 | #define portOutputRegister(port) (volatile byte *)( &(port->regs->ODR) ) |
| 52 | 59 | #define portInputRegister(port) (volatile byte *)( &(port->regs->IDR) ) |
| 53 | 60 | #endif |
| 61 | +#elif defined(__SAMD21G18A__) | |
| 62 | + #define BOARD_H "board_samd21.h" | |
| 63 | + #define CORE_SAMD21 | |
| 54 | 64 | #else |
| 55 | 65 | #error Incorrect board selected. Please select the correct board (Usually Mega 2560) and upload again |
| 56 | 66 | #endif |
| 57 | 67 | |
| 68 | +//This can only be included after the above section | |
| 69 | +#include BOARD_H //Note that this is not a real file, it is defined in globals.h. | |
| 70 | + | |
| 58 | 71 | //Handy bitsetting macros |
| 59 | 72 | #define BIT_SET(a,b) ((a) |= (1<<(b))) |
| 60 | 73 | #define BIT_CLEAR(a,b) ((a) &= ~(1<<(b))) |
| @@ -85,7 +98,7 @@ | ||
| 85 | 98 | #define BIT_STATUS1_INJ2 1 //inj2 |
| 86 | 99 | #define BIT_STATUS1_INJ3 2 //inj3 |
| 87 | 100 | #define BIT_STATUS1_INJ4 3 //inj4 |
| 88 | -#define BIT_STATUS1_DFCO 4 //Decelleration fuel cutoff | |
| 101 | +#define BIT_STATUS1_DFCO 4 //Decelleration fuel cutoff | |
| 89 | 102 | #define BIT_STATUS1_BOOSTCUT 5 //Fuel component of MAP based boost cut out |
| 90 | 103 | #define BIT_STATUS1_TOOTHLOG1READY 6 //Used to flag if tooth log 1 is ready |
| 91 | 104 | #define BIT_STATUS1_TOOTHLOG2READY 7 //Used to flag if tooth log 2 is ready (Log is not currently used) |
| @@ -100,8 +113,8 @@ | ||
| 100 | 113 | #define BIT_SPARK_IDLE 6 // idle on |
| 101 | 114 | #define BIT_SPARK_SYNC 7 // Whether engine has sync or not |
| 102 | 115 | |
| 103 | -#define BIT_SPARK2_FLATSH 0 //Flat shift hard cut | |
| 104 | -#define BIT_SPARK2_FLATSS 1 //Flat shift soft cut | |
| 116 | +#define BIT_SPARK2_FLATSH 0 //Flat shift hard cut | |
| 117 | +#define BIT_SPARK2_FLATSS 1 //Flat shift soft cut | |
| 105 | 118 | #define BIT_SPARK2_UNUSED3 2 |
| 106 | 119 | #define BIT_SPARK2_UNUSED4 3 |
| 107 | 120 | #define BIT_SPARK2_UNUSED5 4 |
| @@ -149,7 +162,7 @@ | ||
| 149 | 162 | #define VALID_MAP_MIN 2 //The smallest ADC value that is valid for the MAP sensor |
| 150 | 163 | |
| 151 | 164 | #define TOOTH_LOG_SIZE 64 |
| 152 | -#define TOOTH_LOG_BUFFER 256 | |
| 165 | +#define TOOTH_LOG_BUFFER 128 //256 | |
| 153 | 166 | |
| 154 | 167 | #define COMPOSITE_LOG_PRI 0 |
| 155 | 168 | #define COMPOSITE_LOG_SEC 1 |
| @@ -229,7 +242,7 @@ | ||
| 229 | 242 | |
| 230 | 243 | const byte data_structure_version = 2; //This identifies the data structure when reading / writing. |
| 231 | 244 | //const byte page_size = 64; |
| 232 | -//[PJSC]const int16_t npage_size[11] = {0,288,128,288,128,288,128,240,192,192,192}; | |
| 245 | +//[PJSC]const int16_t npage_size[11] PROGMEM = {0,288,128,288,128,288,128,240,192,192,192}; | |
| 233 | 246 | const int16_t npage_size[12] = {0,288,128,288,128,288,128,240,192,192,192,288}; //[PJSC] |
| 234 | 247 | //const byte page11_size = 128; |
| 235 | 248 | #define MAP_PAGE_SIZE 288 |
| @@ -278,48 +291,48 @@ | ||
| 278 | 291 | struct table2D knockWindowDurationTable; |
| 279 | 292 | |
| 280 | 293 | //These are for the direct port manipulation of the injectors, coils and aux outputs |
| 281 | -volatile byte *inj1_pin_port; | |
| 294 | +volatile PORT_TYPE *inj1_pin_port; | |
| 282 | 295 | volatile byte inj1_pin_mask; |
| 283 | -volatile byte *inj2_pin_port; | |
| 296 | +volatile PORT_TYPE *inj2_pin_port; | |
| 284 | 297 | volatile byte inj2_pin_mask; |
| 285 | -volatile byte *inj3_pin_port; | |
| 298 | +volatile PORT_TYPE *inj3_pin_port; | |
| 286 | 299 | volatile byte inj3_pin_mask; |
| 287 | -volatile byte *inj4_pin_port; | |
| 300 | +volatile PORT_TYPE *inj4_pin_port; | |
| 288 | 301 | volatile byte inj4_pin_mask; |
| 289 | -volatile byte *inj5_pin_port; | |
| 302 | +volatile PORT_TYPE *inj5_pin_port; | |
| 290 | 303 | volatile byte inj5_pin_mask; |
| 291 | -volatile byte *inj6_pin_port; | |
| 304 | +volatile PORT_TYPE *inj6_pin_port; | |
| 292 | 305 | volatile byte inj6_pin_mask; |
| 293 | -volatile byte *inj7_pin_port; | |
| 306 | +volatile PORT_TYPE *inj7_pin_port; | |
| 294 | 307 | volatile byte inj7_pin_mask; |
| 295 | -volatile byte *inj8_pin_port; | |
| 308 | +volatile PORT_TYPE *inj8_pin_port; | |
| 296 | 309 | volatile byte inj8_pin_mask; |
| 297 | 310 | |
| 298 | -volatile byte *ign1_pin_port; | |
| 311 | +volatile PORT_TYPE *ign1_pin_port; | |
| 299 | 312 | volatile byte ign1_pin_mask; |
| 300 | -volatile byte *ign2_pin_port; | |
| 313 | +volatile PORT_TYPE *ign2_pin_port; | |
| 301 | 314 | volatile byte ign2_pin_mask; |
| 302 | -volatile byte *ign3_pin_port; | |
| 315 | +volatile PORT_TYPE *ign3_pin_port; | |
| 303 | 316 | volatile byte ign3_pin_mask; |
| 304 | -volatile byte *ign4_pin_port; | |
| 317 | +volatile PORT_TYPE *ign4_pin_port; | |
| 305 | 318 | volatile byte ign4_pin_mask; |
| 306 | -volatile byte *ign5_pin_port; | |
| 319 | +volatile PORT_TYPE *ign5_pin_port; | |
| 307 | 320 | volatile byte ign5_pin_mask; |
| 308 | -volatile byte *ign6_pin_port; | |
| 321 | +volatile PORT_TYPE *ign6_pin_port; | |
| 309 | 322 | volatile byte ign6_pin_mask; |
| 310 | -volatile byte *ign7_pin_port; | |
| 323 | +volatile PORT_TYPE *ign7_pin_port; | |
| 311 | 324 | volatile byte ign7_pin_mask; |
| 312 | -volatile byte *ign8_pin_port; | |
| 325 | +volatile PORT_TYPE *ign8_pin_port; | |
| 313 | 326 | volatile byte ign8_pin_mask; |
| 314 | 327 | |
| 315 | -volatile byte *tach_pin_port; | |
| 328 | +volatile PORT_TYPE *tach_pin_port; | |
| 316 | 329 | volatile byte tach_pin_mask; |
| 317 | -volatile byte *pump_pin_port; | |
| 330 | +volatile PORT_TYPE *pump_pin_port; | |
| 318 | 331 | volatile byte pump_pin_mask; |
| 319 | 332 | |
| 320 | -volatile byte *triggerPri_pin_port; | |
| 333 | +volatile PORT_TYPE *triggerPri_pin_port; | |
| 321 | 334 | volatile byte triggerPri_pin_mask; |
| 322 | -volatile byte *triggerSec_pin_port; | |
| 335 | +volatile PORT_TYPE *triggerSec_pin_port; | |
| 323 | 336 | volatile byte triggerSec_pin_mask; |
| 324 | 337 | |
| 325 | 338 | volatile byte captureDutyPulseInterrupt; //[PJSC] For capture duty pulse |
| @@ -345,7 +358,7 @@ | ||
| 345 | 358 | int ignition5EndAngle = 0; |
| 346 | 359 | |
| 347 | 360 | //These are variables used across multiple files |
| 348 | -bool initialisationComplete = false; //Tracks whether the setup() functino has run completely | |
| 361 | +bool initialisationComplete = false; //Tracks whether the setup() function has run completely | |
| 349 | 362 | volatile uint16_t mainLoopCount; |
| 350 | 363 | unsigned long revolutionTime; //The time in uS that one revolution would take at current speed (The time tooth 1 was last seen, minus the time it was seen prior to that) |
| 351 | 364 | volatile unsigned long timer5_overflow_count = 0; //Increments every time counter 5 overflows. Used for the fast version of micros() |
| @@ -353,7 +366,7 @@ | ||
| 353 | 366 | uint16_t fixedCrankingOverride = 0; |
| 354 | 367 | bool clutchTrigger; |
| 355 | 368 | bool previousClutchTrigger; |
| 356 | -volatile uint16_t toothHistory[TOOTH_LOG_BUFFER]; | |
| 369 | +volatile uint32_t toothHistory[TOOTH_LOG_BUFFER]; | |
| 357 | 370 | volatile uint8_t compositeLogHistory[TOOTH_LOG_BUFFER]; |
| 358 | 371 | volatile bool fpPrimed = false; //Tracks whether or not the fuel pump priming has been completed yet |
| 359 | 372 | volatile unsigned int toothHistoryIndex = 0; |
| @@ -362,7 +375,7 @@ | ||
| 362 | 375 | byte secondaryTriggerEdge; |
| 363 | 376 | int CRANK_ANGLE_MAX = 720; |
| 364 | 377 | int CRANK_ANGLE_MAX_IGN = 360; |
| 365 | -int CRANK_ANGLE_MAX_INJ = 360; // The number of crank degrees that the system track over. 360 for wasted / timed batch and 720 for sequential | |
| 378 | +int CRANK_ANGLE_MAX_INJ = 360; //The number of crank degrees that the system track over. 360 for wasted / timed batch and 720 for sequential | |
| 366 | 379 | |
| 367 | 380 | |
| 368 | 381 | //This needs to be here because using the config page directly can prevent burning the setting |
| @@ -599,8 +612,12 @@ | ||
| 599 | 612 | |
| 600 | 613 | int8_t EMAPMin; //Must be signed |
| 601 | 614 | uint16_t EMAPMax; |
| 602 | - //[PJSC] byte unused1_70[58]; | |
| 603 | - byte pjscFreq; //[PJSC] Offset 70 | |
| 615 | + | |
| 616 | + byte fanWhenOff : 1; // Only run fan when engine is running | |
| 617 | + byte fanUnused : 7; | |
| 618 | + | |
| 619 | + //[PJSC] byte unused1_70[57]; | |
| 620 | + byte pjscFreq; //[PJSC] Offset 71 | |
| 604 | 621 | byte exValvePosMin; // | |
| 605 | 622 | byte exValvePosMax; // | |
| 606 | 623 | byte exTrigHysteresis; // | |
| @@ -631,7 +648,7 @@ | ||
| 631 | 648 | uint16_t testinjcnt; // | |
| 632 | 649 | byte muxout1Selection: 4; // | MUX output1 selection |
| 633 | 650 | byte muxout2Selection: 4; // V MUX output2 selection |
| 634 | - byte unused1_100[28]; //[PJSC v1.10] For test mode | |
| 651 | + byte unused1_101[27]; //[PJSC v1.10] For test mode | |
| 635 | 652 | |
| 636 | 653 | #if defined(CORE_AVR) |
| 637 | 654 | }; |
| @@ -737,7 +754,7 @@ | ||
| 737 | 754 | byte egoTPSMax; //TPS must be below this for closed loop to function |
| 738 | 755 | byte vvtPin : 6; |
| 739 | 756 | byte useExtBaro : 1; |
| 740 | - byte boostMode : 1; //Simple of full boost contrl | |
| 757 | + byte boostMode : 1; //Simple of full boost control | |
| 741 | 758 | byte boostPin : 6; |
| 742 | 759 | byte VVTasOnOff : 1; //Whether or not to use the VVT table as an on/off map |
| 743 | 760 | byte useEMAP : 1; |
| @@ -787,7 +804,7 @@ | ||
| 787 | 804 | byte iacAlgorithm : 3; //Valid values are: "None", "On/Off", "PWM", "PWM Closed Loop", "Stepper", "Stepper Closed Loop" |
| 788 | 805 | byte iacStepTime : 3; //How long to pulse the stepper for to ensure the step completes (ms) |
| 789 | 806 | byte iacChannels : 1; //How many outputs to use in PWM mode (0 = 1 channel, 1 = 2 channels) |
| 790 | - byte iacPWMdir : 1; //Directino of the PWM valve. 0 = Normal = Higher RPM with more duty. 1 = Reverse = Lower RPM with more duty | |
| 807 | + byte iacPWMdir : 1; //Direction of the PWM valve. 0 = Normal = Higher RPM with more duty. 1 = Reverse = Lower RPM with more duty | |
| 791 | 808 | |
| 792 | 809 | byte iacFastTemp; //Fast idle temp when using a simple on/off valve |
| 793 | 810 |
| @@ -801,6 +818,7 @@ | ||
| 801 | 818 | byte fanHyster; // Fan hysteresis |
| 802 | 819 | byte fanFreq; // Fan PWM frequency |
| 803 | 820 | byte fanPWMBins[4]; //Temperature Bins for the PWM fan control |
| 821 | + | |
| 804 | 822 | #if defined(CORE_AVR) |
| 805 | 823 | }; |
| 806 | 824 | #else |
| @@ -835,8 +853,9 @@ | ||
| 835 | 853 | uint16_t obd_address; //speeduino OBD diagnostic address |
| 836 | 854 | uint8_t Auxinpina[16]; //analog pin number when internal aux in use |
| 837 | 855 | uint8_t Auxinpinb[16]; // digital pin number when internal aux in use |
| 838 | - | |
| 839 | - byte unused10_152; | |
| 856 | + | |
| 857 | + byte iacStepperInv : 1; //stepper direction of travel to allow reversing. 0=normal, 1=inverted. | |
| 858 | + | |
| 840 | 859 | byte unused10_153; |
| 841 | 860 | byte unused10_154; |
| 842 | 861 | byte unused10_155; |
| @@ -1055,7 +1074,6 @@ | ||
| 1055 | 1074 | extern struct config9 configPage9; |
| 1056 | 1075 | extern struct config10 configPage10; |
| 1057 | 1076 | extern struct config11 configPage11; //[PJSC] |
| 1058 | -//[PJSC]extern struct config12 configPage12; //[PJSC] | |
| 1059 | 1077 | extern unsigned long currentLoopTime; //The time the current loop started (uS) |
| 1060 | 1078 | extern unsigned long previousLoopTime; //The time the previous loop started (uS) |
| 1061 | 1079 | volatile uint16_t ignitionCount; //The count of ignition events that have taken place since the engine started |
| @@ -3,6 +3,7 @@ | ||
| 3 | 3 | |
| 4 | 4 | #include "globals.h" |
| 5 | 5 | #include "table.h" |
| 6 | +#include BOARD_H //Note that this is not a real file, it is defined in globals.h. | |
| 6 | 7 | |
| 7 | 8 | #define IAC_ALGORITHM_NONE 0 |
| 8 | 9 | #define IAC_ALGORITHM_ONOFF 1 |
| @@ -23,38 +24,10 @@ | ||
| 23 | 24 | int targetIdleStep; //What the targetted step is |
| 24 | 25 | volatile StepperStatus stepperStatus; |
| 25 | 26 | volatile unsigned long stepStartTime; //The time the curren |
| 27 | + byte lessAirDirection; | |
| 28 | + byte moreAirDirection; | |
| 26 | 29 | }; |
| 27 | 30 | |
| 28 | -#if defined(CORE_AVR) | |
| 29 | - #define IDLE_COUNTER TCNT4 | |
| 30 | - #define IDLE_COMPARE OCR4C | |
| 31 | - | |
| 32 | - #define IDLE_TIMER_ENABLE() TIMSK4 |= (1 << OCIE4C) | |
| 33 | - #define IDLE_TIMER_DISABLE() TIMSK4 &= ~(1 << OCIE4C) | |
| 34 | - | |
| 35 | -#elif defined(CORE_TEENSY) | |
| 36 | - #define IDLE_COUNTER FTM2_CNT | |
| 37 | - #define IDLE_COMPARE FTM2_C0V | |
| 38 | - | |
| 39 | - #define IDLE_TIMER_ENABLE() FTM2_C0SC |= FTM_CSC_CHIE | |
| 40 | - #define IDLE_TIMER_DISABLE() FTM2_C0SC &= ~FTM_CSC_CHIE | |
| 41 | - | |
| 42 | -#elif defined(CORE_STM32) | |
| 43 | - #if defined(ARDUINO_ARCH_STM32) // STM32GENERIC core | |
| 44 | - #define IDLE_COUNTER (TIM1)->CNT | |
| 45 | - #define IDLE_COMPARE (TIM1)->CCR4 | |
| 46 | - | |
| 47 | - #define IDLE_TIMER_ENABLE() (TIM1)->CCER |= TIM_CCER_CC4E | |
| 48 | - #define IDLE_TIMER_DISABLE() (TIM1)->CCER &= ~TIM_CCER_CC4E | |
| 49 | - #else //libmaple core aka STM32DUINO | |
| 50 | - #define IDLE_COUNTER (TIMER1->regs).gen->CNT | |
| 51 | - #define IDLE_COMPARE (TIMER1->regs).gen->CCR4 | |
| 52 | - | |
| 53 | - #define IDLE_TIMER_ENABLE() (TIMER1->regs).gen->CCER |= TIMER_CCER_CC4E | |
| 54 | - #define IDLE_TIMER_DISABLE() (TIMER1->regs).gen->CCER &= ~TIMER_CCER_CC4E | |
| 55 | - #endif | |
| 56 | -#endif | |
| 57 | - | |
| 58 | 31 | struct table2D iacClosedLoopTable; |
| 59 | 32 | struct table2D iacPWMTable; |
| 60 | 33 | struct table2D iacStepTable; |
| @@ -68,10 +41,11 @@ | ||
| 68 | 41 | unsigned int iacStepTime; |
| 69 | 42 | unsigned int completedHomeSteps; |
| 70 | 43 | |
| 71 | -volatile byte *idle_pin_port; | |
| 44 | +volatile PORT_TYPE *idle_pin_port; | |
| 72 | 45 | volatile byte idle_pin_mask; |
| 73 | -volatile byte *idle2_pin_port; | |
| 46 | +volatile PORT_TYPE *idle2_pin_port; | |
| 74 | 47 | volatile byte idle2_pin_mask; |
| 48 | + | |
| 75 | 49 | volatile bool idle_pwm_state; |
| 76 | 50 | unsigned int idle_pwm_max_count; //Used for variable PWM frequency |
| 77 | 51 | volatile unsigned int idle_pwm_cur_value; |
| @@ -86,8 +60,6 @@ | ||
| 86 | 60 | static inline byte isStepperHomed(); |
| 87 | 61 | static inline byte checkForStepping(); |
| 88 | 62 | static inline void doStep(); |
| 89 | -#if defined (CORE_TEENSY) || defined(CORE_STM32) | |
| 90 | - static inline void idleInterrupt(); | |
| 91 | -#endif | |
| 63 | +static inline void idleInterrupt(); | |
| 92 | 64 | |
| 93 | 65 | #endif |
| @@ -0,0 +1,12 @@ | ||
| 1 | +#ifndef INIT_H | |
| 2 | +#define INIT_H | |
| 3 | + | |
| 4 | +void initialiseAll(); | |
| 5 | +void initialiseTriggers(); | |
| 6 | +void setPinMapping(byte); | |
| 7 | +void initialiseExternalTrigger(); //[PJSC] For External Trigger Interruot | |
| 8 | +void changeMapSelectSw(); //[PJSC v1.10] For MAP switch | |
| 9 | +void initialiseCaptureDutyPulse(); //[PJSC] For capturing duty pulse | |
| 10 | +void initialiseCaptureDutyPulse2(); //[PJSC] For capturing duty pulse | |
| 11 | + | |
| 12 | +#endif | |
| \ No newline at end of file |
| @@ -27,346 +27,7 @@ | ||
| 27 | 27 | |
| 28 | 28 | #define USE_IGN_REFRESH |
| 29 | 29 | #define IGNITION_REFRESH_THRESHOLD 30 //Time in uS that the refresh functions will check to ensure there is enough time before changing the end compare |
| 30 | -#if defined(CORE_AVR) | |
| 31 | - #include <avr/interrupt.h> | |
| 32 | - #include <avr/io.h> | |
| 33 | 30 | |
| 34 | - //Refer to http://svn.savannah.nongnu.org/viewvc/trunk/avr-libc/include/avr/iomxx0_1.h?root=avr-libc&view=markup | |
| 35 | - #define FUEL1_COUNTER TCNT3 | |
| 36 | - #define FUEL2_COUNTER TCNT3 | |
| 37 | - #define FUEL3_COUNTER TCNT3 | |
| 38 | - #define FUEL4_COUNTER TCNT4 | |
| 39 | - #define FUEL5_COUNTER TCNT1 | |
| 40 | - #define FUEL6_COUNTER TCNT4 //Replaces ignition 4 | |
| 41 | - #define FUEL7_COUNTER TCNT5 //Replaces ignition 3 | |
| 42 | - #define FUEL8_COUNTER TCNT5 //Replaces ignition 2 | |
| 43 | - | |
| 44 | - #define IGN1_COUNTER TCNT5 | |
| 45 | - #define IGN2_COUNTER TCNT5 | |
| 46 | - #define IGN3_COUNTER TCNT5 | |
| 47 | - #define IGN4_COUNTER TCNT4 | |
| 48 | - #define IGN5_COUNTER TCNT1 | |
| 49 | - #define IGN6_COUNTER TCNT4 //Replaces injector 4 | |
| 50 | - #define IGN7_COUNTER TCNT3 //Replaces injector 3 | |
| 51 | - #define IGN8_COUNTER TCNT3 //Replaces injector 2 | |
| 52 | - | |
| 53 | - #define FUEL1_COMPARE OCR3A | |
| 54 | - #define FUEL2_COMPARE OCR3B | |
| 55 | - #define FUEL3_COMPARE OCR3C | |
| 56 | - #define FUEL4_COMPARE OCR4B | |
| 57 | - #define FUEL5_COMPARE OCR1C //Shared with FUEL1 | |
| 58 | - #define FUEL6_COMPARE OCR4A //Replaces ignition4 | |
| 59 | - #define FUEL7_COMPARE OCR5C //Replaces ignition3 | |
| 60 | - #define FUEL8_COMPARE OCR5B //Replaces ignition2 | |
| 61 | - | |
| 62 | - #define IGN1_COMPARE OCR5A | |
| 63 | - #define IGN2_COMPARE OCR5B | |
| 64 | - #define IGN3_COMPARE OCR5C | |
| 65 | - #define IGN4_COMPARE OCR4A | |
| 66 | - #define IGN5_COMPARE OCR1C | |
| 67 | - #define IGN6_COMPARE OCR4B //Replaces injector 4 | |
| 68 | - #define IGN7_COMPARE OCR3C //Replaces injector 3 | |
| 69 | - #define IGN8_COMPARE OCR3B //Replaces injector 2 | |
| 70 | - | |
| 71 | - #define FUEL1_TIMER_ENABLE() TIMSK3 |= (1 << OCIE3A) //Turn on the A compare unit (ie turn on the interrupt) | |
| 72 | - #define FUEL2_TIMER_ENABLE() TIMSK3 |= (1 << OCIE3B) //Turn on the B compare unit (ie turn on the interrupt) | |
| 73 | - #define FUEL3_TIMER_ENABLE() TIMSK3 |= (1 << OCIE3C) //Turn on the C compare unit (ie turn on the interrupt) | |
| 74 | - #define FUEL4_TIMER_ENABLE() TIMSK4 |= (1 << OCIE4B) //Turn on the B compare unit (ie turn on the interrupt) | |
| 75 | - #define FUEL5_TIMER_ENABLE() TIMSK1 |= (1 << OCIE1C) // | |
| 76 | - #define FUEL6_TIMER_ENABLE() TIMSK4 |= (1 << OCIE4A) // | |
| 77 | - #define FUEL7_TIMER_ENABLE() TIMSK5 |= (1 << OCIE5C) // | |
| 78 | - #define FUEL8_TIMER_ENABLE() TIMSK5 |= (1 << OCIE5B) // | |
| 79 | - | |
| 80 | - #define FUEL1_TIMER_DISABLE() TIMSK3 &= ~(1 << OCIE3A); //Turn off this output compare unit | |
| 81 | - #define FUEL2_TIMER_DISABLE() TIMSK3 &= ~(1 << OCIE3B); //Turn off this output compare unit | |
| 82 | - #define FUEL3_TIMER_DISABLE() TIMSK3 &= ~(1 << OCIE3C); //Turn off this output compare unit | |
| 83 | - #define FUEL4_TIMER_DISABLE() TIMSK4 &= ~(1 << OCIE4B); //Turn off this output compare unit | |
| 84 | - #define FUEL5_TIMER_DISABLE() TIMSK1 &= ~(1 << OCIE1C); // | |
| 85 | - #define FUEL6_TIMER_DISABLE() TIMSK4 &= ~(1 << OCIE4A); // | |
| 86 | - #define FUEL7_TIMER_DISABLE() TIMSK5 &= ~(1 << OCIE5C); // | |
| 87 | - #define FUEL8_TIMER_DISABLE() TIMSK5 &= ~(1 << OCIE5B); // | |
| 88 | - | |
| 89 | - #define IGN1_TIMER_ENABLE() TIMSK5 |= (1 << OCIE5A) //Turn on the A compare unit (ie turn on the interrupt) | |
| 90 | - #define IGN2_TIMER_ENABLE() TIMSK5 |= (1 << OCIE5B) //Turn on the B compare unit (ie turn on the interrupt) | |
| 91 | - #define IGN3_TIMER_ENABLE() TIMSK5 |= (1 << OCIE5C) //Turn on the C compare unit (ie turn on the interrupt) | |
| 92 | - #define IGN4_TIMER_ENABLE() TIMSK4 |= (1 << OCIE4A) //Turn on the A compare unit (ie turn on the interrupt) | |
| 93 | - #define IGN5_TIMER_ENABLE() TIMSK1 |= (1 << OCIE1C) //Turn on the A compare unit (ie turn on the interrupt) | |
| 94 | - #define IGN6_TIMER_ENABLE() TIMSK4 |= (1 << OCIE4B) //Replaces injector 4 | |
| 95 | - #define IGN7_TIMER_ENABLE() TIMSK3 |= (1 << OCIE3C) //Replaces injector 3 | |
| 96 | - #define IGN8_TIMER_ENABLE() TIMSK3 |= (1 << OCIE3B) //Replaces injector 2 | |
| 97 | - | |
| 98 | - #define IGN1_TIMER_DISABLE() TIMSK5 &= ~(1 << OCIE5A) //Turn off this output compare unit | |
| 99 | - #define IGN2_TIMER_DISABLE() TIMSK5 &= ~(1 << OCIE5B) //Turn off this output compare unit | |
| 100 | - #define IGN3_TIMER_DISABLE() TIMSK5 &= ~(1 << OCIE5C) //Turn off this output compare unit | |
| 101 | - #define IGN4_TIMER_DISABLE() TIMSK4 &= ~(1 << OCIE4A) //Turn off this output compare unit | |
| 102 | - #define IGN5_TIMER_DISABLE() TIMSK1 &= ~(1 << OCIE1C) //Turn off this output compare unit | |
| 103 | - #define IGN6_TIMER_DISABLE() TIMSK4 &= ~(1 << OCIE4B) //Replaces injector 4 | |
| 104 | - #define IGN7_TIMER_DISABLE() TIMSK3 &= ~(1 << OCIE3C) //Replaces injector 3 | |
| 105 | - #define IGN8_TIMER_DISABLE() TIMSK3 &= ~(1 << OCIE3B) //Replaces injector 2 | |
| 106 | - | |
| 107 | - #define MAX_TIMER_PERIOD 262140UL //The longest period of time (in uS) that the timer can permit (IN this case it is 65535 * 4, as each timer tick is 4uS) | |
| 108 | - #define MAX_TIMER_PERIOD_SLOW 1048560UL //The longest period of time (in uS) that the timer can permit (IN this case it is 65535 * 16, as each timer tick is 16uS) | |
| 109 | - #define uS_TO_TIMER_COMPARE(uS1) (uS1 >> 2) //Converts a given number of uS into the required number of timer ticks until that time has passed | |
| 110 | - //This is a hack until I make all the AVR timers run at the same speed | |
| 111 | - #define uS_TO_TIMER_COMPARE_SLOW(uS1) (uS1 >> 4) | |
| 112 | - | |
| 113 | -#elif defined(CORE_TEENSY) | |
| 114 | - //http://shawnhymel.com/661/learning-the-teensy-lc-interrupt-service-routines/ | |
| 115 | - #define FUEL1_COUNTER FTM0_CNT | |
| 116 | - #define FUEL2_COUNTER FTM0_CNT | |
| 117 | - #define FUEL3_COUNTER FTM0_CNT | |
| 118 | - #define FUEL4_COUNTER FTM0_CNT | |
| 119 | - #define FUEL5_COUNTER FTM3_CNT | |
| 120 | - #define FUEL6_COUNTER FTM3_CNT | |
| 121 | - #define FUEL7_COUNTER FTM3_CNT | |
| 122 | - #define FUEL8_COUNTER FTM3_CNT | |
| 123 | - | |
| 124 | - #define IGN1_COUNTER FTM0_CNT | |
| 125 | - #define IGN2_COUNTER FTM0_CNT | |
| 126 | - #define IGN3_COUNTER FTM0_CNT | |
| 127 | - #define IGN4_COUNTER FTM0_CNT | |
| 128 | - #define IGN5_COUNTER FTM3_CNT | |
| 129 | - #define IGN6_COUNTER FTM3_CNT | |
| 130 | - #define IGN7_COUNTER FTM3_CNT | |
| 131 | - #define IGN8_COUNTER FTM3_CNT | |
| 132 | - | |
| 133 | - #define FUEL1_COMPARE FTM0_C0V | |
| 134 | - #define FUEL2_COMPARE FTM0_C1V | |
| 135 | - #define FUEL3_COMPARE FTM0_C2V | |
| 136 | - #define FUEL4_COMPARE FTM0_C3V | |
| 137 | - #define FUEL5_COMPARE FTM3_C0V | |
| 138 | - #define FUEL6_COMPARE FTM3_C1V | |
| 139 | - #define FUEL7_COMPARE FTM3_C2V | |
| 140 | - #define FUEL8_COMPARE FTM3_C3V | |
| 141 | - | |
| 142 | - #define IGN1_COMPARE FTM0_C4V | |
| 143 | - #define IGN2_COMPARE FTM0_C5V | |
| 144 | - #define IGN3_COMPARE FTM0_C6V | |
| 145 | - #define IGN4_COMPARE FTM0_C7V | |
| 146 | - #define IGN5_COMPARE FTM3_C4V | |
| 147 | - #define IGN6_COMPARE FTM3_C5V | |
| 148 | - #define IGN7_COMPARE FTM3_C6V | |
| 149 | - #define IGN8_COMPARE FTM3_C7V | |
| 150 | - | |
| 151 | - #define FUEL1_TIMER_ENABLE() FTM0_C0SC |= FTM_CSC_CHIE //Write 1 to the CHIE (Channel Interrupt Enable) bit of channel 0 Status/Control | |
| 152 | - #define FUEL2_TIMER_ENABLE() FTM0_C1SC |= FTM_CSC_CHIE | |
| 153 | - #define FUEL3_TIMER_ENABLE() FTM0_C2SC |= FTM_CSC_CHIE | |
| 154 | - #define FUEL4_TIMER_ENABLE() FTM0_C3SC |= FTM_CSC_CHIE | |
| 155 | - #define FUEL5_TIMER_ENABLE() FTM3_C0SC |= FTM_CSC_CHIE | |
| 156 | - #define FUEL6_TIMER_ENABLE() FTM3_C1SC |= FTM_CSC_CHIE | |
| 157 | - #define FUEL7_TIMER_ENABLE() FTM3_C2SC |= FTM_CSC_CHIE | |
| 158 | - #define FUEL8_TIMER_ENABLE() FTM3_C3SC |= FTM_CSC_CHIE | |
| 159 | - | |
| 160 | - #define FUEL1_TIMER_DISABLE() FTM0_C0SC &= ~FTM_CSC_CHIE //Write 0 to the CHIE (Channel Interrupt Enable) bit of channel 0 Status/Control | |
| 161 | - #define FUEL2_TIMER_DISABLE() FTM0_C1SC &= ~FTM_CSC_CHIE | |
| 162 | - #define FUEL3_TIMER_DISABLE() FTM0_C2SC &= ~FTM_CSC_CHIE | |
| 163 | - #define FUEL4_TIMER_DISABLE() FTM0_C3SC &= ~FTM_CSC_CHIE | |
| 164 | - #define FUEL5_TIMER_DISABLE() FTM3_C0SC &= ~FTM_CSC_CHIE //Write 0 to the CHIE (Channel Interrupt Enable) bit of channel 0 Status/Control | |
| 165 | - #define FUEL6_TIMER_DISABLE() FTM3_C1SC &= ~FTM_CSC_CHIE | |
| 166 | - #define FUEL7_TIMER_DISABLE() FTM3_C2SC &= ~FTM_CSC_CHIE | |
| 167 | - #define FUEL8_TIMER_DISABLE() FTM3_C3SC &= ~FTM_CSC_CHIE | |
| 168 | - | |
| 169 | - #define IGN1_TIMER_ENABLE() FTM0_C4SC |= FTM_CSC_CHIE | |
| 170 | - #define IGN2_TIMER_ENABLE() FTM0_C5SC |= FTM_CSC_CHIE | |
| 171 | - #define IGN3_TIMER_ENABLE() FTM0_C6SC |= FTM_CSC_CHIE | |
| 172 | - #define IGN4_TIMER_ENABLE() FTM0_C7SC |= FTM_CSC_CHIE | |
| 173 | - #define IGN5_TIMER_ENABLE() FTM3_C4SC |= FTM_CSC_CHIE | |
| 174 | - #define IGN6_TIMER_ENABLE() FTM3_C5SC |= FTM_CSC_CHIE | |
| 175 | - #define IGN7_TIMER_ENABLE() FTM3_C6SC |= FTM_CSC_CHIE | |
| 176 | - #define IGN8_TIMER_ENABLE() FTM3_C7SC |= FTM_CSC_CHIE | |
| 177 | - | |
| 178 | - #define IGN1_TIMER_DISABLE() FTM0_C4SC &= ~FTM_CSC_CHIE | |
| 179 | - #define IGN2_TIMER_DISABLE() FTM0_C5SC &= ~FTM_CSC_CHIE | |
| 180 | - #define IGN3_TIMER_DISABLE() FTM0_C6SC &= ~FTM_CSC_CHIE | |
| 181 | - #define IGN4_TIMER_DISABLE() FTM0_C7SC &= ~FTM_CSC_CHIE | |
| 182 | - #define IGN5_TIMER_DISABLE() FTM3_C4SC &= ~FTM_CSC_CHIE | |
| 183 | - #define IGN6_TIMER_DISABLE() FTM3_C5SC &= ~FTM_CSC_CHIE | |
| 184 | - #define IGN7_TIMER_DISABLE() FTM3_C6SC &= ~FTM_CSC_CHIE | |
| 185 | - #define IGN8_TIMER_DISABLE() FTM3_C7SC &= ~FTM_CSC_CHIE | |
| 186 | - | |
| 187 | - #define MAX_TIMER_PERIOD 139808 // 2.13333333uS * 65535 | |
| 188 | - #define MAX_TIMER_PERIOD_SLOW 139808 | |
| 189 | - #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. | |
| 190 | - //Hack compatibility with AVR timers that run at different speeds | |
| 191 | - #define uS_TO_TIMER_COMPARE_SLOW(uS) ((uS * 15) >> 5) | |
| 192 | - | |
| 193 | -#elif defined(CORE_STM32) | |
| 194 | - #define MAX_TIMER_PERIOD 131070 //The longest period of time (in uS) that the timer can permit (IN this case it is 65535 * 2, as each timer tick is 2uS) | |
| 195 | - #define MAX_TIMER_PERIOD_SLOW 131070 //The longest period of time (in uS) that the timer can permit (IN this case it is 65535 * 2, as each timer tick is 2uS) | |
| 196 | - #define uS_TO_TIMER_COMPARE(uS) (uS >> 1) //Converts a given number of uS into the required number of timer ticks until that time has passed. | |
| 197 | - #define uS_TO_TIMER_COMPARE_SLOW(uS) (uS >> 1) //Converts a given number of uS into the required number of timer ticks until that time has passed. | |
| 198 | - #if defined(ARDUINO_ARCH_STM32) // STM32GENERIC core | |
| 199 | - #include "HardwareTimer.h" | |
| 200 | - #define FUEL1_COUNTER (TIM2)->CNT | |
| 201 | - #define FUEL2_COUNTER (TIM2)->CNT | |
| 202 | - #define FUEL3_COUNTER (TIM2)->CNT | |
| 203 | - #define FUEL4_COUNTER (TIM2)->CNT | |
| 204 | - | |
| 205 | - #define FUEL1_COMPARE (TIM2)->CCR1 | |
| 206 | - #define FUEL2_COMPARE (TIM2)->CCR2 | |
| 207 | - #define FUEL3_COMPARE (TIM2)->CCR3 | |
| 208 | - #define FUEL4_COMPARE (TIM2)->CCR4 | |
| 209 | - | |
| 210 | - #define IGN1_COUNTER (TIM3)->CNT | |
| 211 | - #define IGN2_COUNTER (TIM3)->CNT | |
| 212 | - #define IGN3_COUNTER (TIM3)->CNT | |
| 213 | - #define IGN4_COUNTER (TIM3)->CNT | |
| 214 | - | |
| 215 | - #define IGN1_COMPARE (TIM3)->CCR1 | |
| 216 | - #define IGN2_COMPARE (TIM3)->CCR2 | |
| 217 | - #define IGN3_COMPARE (TIM3)->CCR3 | |
| 218 | - #define IGN4_COMPARE (TIM3)->CCR4 | |
| 219 | - | |
| 220 | -#ifndef SMALL_FLASH_MODE | |
| 221 | - #define FUEL5_COUNTER (TIM5)->CNT | |
| 222 | - #define FUEL6_COUNTER (TIM5)->CNT | |
| 223 | - #define FUEL7_COUNTER (TIM5)->CNT | |
| 224 | - #define FUEL8_COUNTER (TIM5)->CNT | |
| 225 | - | |
| 226 | - #define FUEL5_COMPARE (TIM5)->CCR1 | |
| 227 | - #define FUEL6_COMPARE (TIM5)->CCR2 | |
| 228 | - #define FUEL7_COMPARE (TIM5)->CCR3 | |
| 229 | - #define FUEL8_COMPARE (TIM5)->CCR4 | |
| 230 | - | |
| 231 | - #define IGN5_COUNTER (TIM4)->CNT | |
| 232 | - #define IGN6_COUNTER (TIM4)->CNT | |
| 233 | - #define IGN7_COUNTER (TIM4)->CNT | |
| 234 | - #define IGN8_COUNTER (TIM4)->CNT | |
| 235 | - | |
| 236 | - #define IGN5_COMPARE (TIM4)->CCR1 | |
| 237 | - #define IGN6_COMPARE (TIM4)->CCR2 | |
| 238 | - #define IGN7_COMPARE (TIM4)->CCR3 | |
| 239 | - #define IGN8_COMPARE (TIM4)->CCR4 | |
| 240 | -#endif | |
| 241 | - //https://github.com/rogerclarkmelbourne/Arduino_STM32/blob/754bc2969921f1ef262bd69e7faca80b19db7524/STM32F1/system/libmaple/include/libmaple/timer.h#L444 | |
| 242 | - #define FUEL1_TIMER_ENABLE() (TIM2)->CCER |= TIM_CCER_CC1E | |
| 243 | - #define FUEL2_TIMER_ENABLE() (TIM2)->CCER |= TIM_CCER_CC2E | |
| 244 | - #define FUEL3_TIMER_ENABLE() (TIM2)->CCER |= TIM_CCER_CC3E | |
| 245 | - #define FUEL4_TIMER_ENABLE() (TIM2)->CCER |= TIM_CCER_CC4E | |
| 246 | - | |
| 247 | - #define FUEL1_TIMER_DISABLE() (TIM2)->CCER &= ~TIM_CCER_CC1E | |
| 248 | - #define FUEL2_TIMER_DISABLE() (TIM2)->CCER &= ~TIM_CCER_CC2E | |
| 249 | - #define FUEL3_TIMER_DISABLE() (TIM2)->CCER &= ~TIM_CCER_CC3E | |
| 250 | - #define FUEL4_TIMER_DISABLE() (TIM2)->CCER &= ~TIM_CCER_CC4E | |
| 251 | - | |
| 252 | - #define IGN1_TIMER_ENABLE() (TIM3)->CCER |= TIM_CCER_CC1E | |
| 253 | - #define IGN2_TIMER_ENABLE() (TIM3)->CCER |= TIM_CCER_CC2E | |
| 254 | - #define IGN3_TIMER_ENABLE() (TIM3)->CCER |= TIM_CCER_CC3E | |
| 255 | - #define IGN4_TIMER_ENABLE() (TIM3)->CCER |= TIM_CCER_CC4E | |
| 256 | - | |
| 257 | - #define IGN1_TIMER_DISABLE() (TIM3)->CCER &= ~TIM_CCER_CC1E | |
| 258 | - #define IGN2_TIMER_DISABLE() (TIM3)->CCER &= ~TIM_CCER_CC2E | |
| 259 | - #define IGN3_TIMER_DISABLE() (TIM3)->CCER &= ~TIM_CCER_CC3E | |
| 260 | - #define IGN4_TIMER_DISABLE() (TIM3)->CCER &= ~TIM_CCER_CC4E | |
| 261 | - | |
| 262 | -#ifndef SMALL_FLASH_MODE | |
| 263 | - #define FUEL5_TIMER_ENABLE() (TIM5)->CCER |= TIM_CCER_CC1E | |
| 264 | - #define FUEL6_TIMER_ENABLE() (TIM5)->CCER |= TIM_CCER_CC2E | |
| 265 | - #define FUEL7_TIMER_ENABLE() (TIM5)->CCER |= TIM_CCER_CC3E | |
| 266 | - #define FUEL8_TIMER_ENABLE() (TIM5)->CCER |= TIM_CCER_CC4E | |
| 267 | - | |
| 268 | - #define FUEL5_TIMER_DISABLE() (TIM5)->CCER &= ~TIM_CCER_CC1E | |
| 269 | - #define FUEL6_TIMER_DISABLE() (TIM5)->CCER &= ~TIM_CCER_CC2E | |
| 270 | - #define FUEL7_TIMER_DISABLE() (TIM5)->CCER &= ~TIM_CCER_CC3E | |
| 271 | - #define FUEL8_TIMER_DISABLE() (TIM5)->CCER &= ~TIM_CCER_CC4E | |
| 272 | - | |
| 273 | - #define IGN5_TIMER_ENABLE() (TIM4)->CCER |= TIM_CCER_CC1E | |
| 274 | - #define IGN6_TIMER_ENABLE() (TIM4)->CCER |= TIM_CCER_CC2E | |
| 275 | - #define IGN7_TIMER_ENABLE() (TIM4)->CCER |= TIM_CCER_CC3E | |
| 276 | - #define IGN8_TIMER_ENABLE() (TIM4)->CCER |= TIM_CCER_CC4E | |
| 277 | - | |
| 278 | - #define IGN5_TIMER_DISABLE() (TIM4)->CCER &= ~TIM_CCER_CC1E | |
| 279 | - #define IGN6_TIMER_DISABLE() (TIM4)->CCER &= ~TIM_CCER_CC2E | |
| 280 | - #define IGN7_TIMER_DISABLE() (TIM4)->CCER &= ~TIM_CCER_CC3E | |
| 281 | - #define IGN8_TIMER_DISABLE() (TIM4)->CCER &= ~TIM_CCER_CC4E | |
| 282 | -#endif | |
| 283 | - #else //libmaple core aka STM32DUINO | |
| 284 | - #define FUEL1_COUNTER (TIMER2->regs).gen->CNT | |
| 285 | - #define FUEL2_COUNTER (TIMER2->regs).gen->CNT | |
| 286 | - #define FUEL3_COUNTER (TIMER2->regs).gen->CNT | |
| 287 | - #define FUEL4_COUNTER (TIMER2->regs).gen->CNT | |
| 288 | - | |
| 289 | - #define FUEL1_COMPARE (TIMER2->regs).gen->CCR1 | |
| 290 | - #define FUEL2_COMPARE (TIMER2->regs).gen->CCR2 | |
| 291 | - #define FUEL3_COMPARE (TIMER2->regs).gen->CCR3 | |
| 292 | - #define FUEL4_COMPARE (TIMER2->regs).gen->CCR4 | |
| 293 | - | |
| 294 | - #define IGN1_COUNTER (TIMER3->regs).gen->CNT | |
| 295 | - #define IGN2_COUNTER (TIMER3->regs).gen->CNT | |
| 296 | - #define IGN3_COUNTER (TIMER3->regs).gen->CNT | |
| 297 | - #define IGN4_COUNTER (TIMER3->regs).gen->CNT | |
| 298 | - | |
| 299 | - #define IGN1_COMPARE (TIMER3->regs).gen->CCR1 | |
| 300 | - #define IGN2_COMPARE (TIMER3->regs).gen->CCR2 | |
| 301 | - #define IGN3_COMPARE (TIMER3->regs).gen->CCR3 | |
| 302 | - #define IGN4_COMPARE (TIMER3->regs).gen->CCR4 | |
| 303 | - | |
| 304 | -#ifndef SMALL_FLASH_MODE | |
| 305 | - #define FUEL5_COUNTER (TIMER5->regs).gen->CNT | |
| 306 | - #define FUEL6_COUNTER (TIMER5->regs).gen->CNT | |
| 307 | - #define FUEL7_COUNTER (TIMER5->regs).gen->CNT | |
| 308 | - #define FUEL8_COUNTER (TIMER5->regs).gen->CNT | |
| 309 | - | |
| 310 | - #define FUEL5_COMPARE (TIMER5->regs).gen->CCR1 | |
| 311 | - #define FUEL6_COMPARE (TIMER5->regs).gen->CCR2 | |
| 312 | - #define FUEL7_COMPARE (TIMER5->regs).gen->CCR3 | |
| 313 | - #define FUEL8_COMPARE (TIMER5->regs).gen->CCR4 | |
| 314 | - | |
| 315 | - #define IGN5_COUNTER (TIMER4->regs).gen->CNT | |
| 316 | - #define IGN6_COUNTER (TIMER4->regs).gen->CNT | |
| 317 | - #define IGN7_COUNTER (TIMER4->regs).gen->CNT | |
| 318 | - #define IGN8_COUNTER (TIMER4->regs).gen->CNT | |
| 319 | - | |
| 320 | - #define IGN5_COMPARE (TIMER4->regs).gen->CCR1 | |
| 321 | - #define IGN6_COMPARE (TIMER4->regs).gen->CCR2 | |
| 322 | - #define IGN7_COMPARE (TIMER4->regs).gen->CCR3 | |
| 323 | - #define IGN8_COMPARE (TIMER4->regs).gen->CCR4 | |
| 324 | -#endif | |
| 325 | - //https://github.com/rogerclarkmelbourne/Arduino_STM32/blob/754bc2969921f1ef262bd69e7faca80b19db7524/STM32F1/system/libmaple/include/libmaple/timer.h#L444 | |
| 326 | - #define FUEL1_TIMER_ENABLE() (TIMER2->regs).gen->CCER |= TIMER_CCER_CC1E | |
| 327 | - #define FUEL2_TIMER_ENABLE() (TIMER2->regs).gen->CCER |= TIMER_CCER_CC2E | |
| 328 | - #define FUEL3_TIMER_ENABLE() (TIMER2->regs).gen->CCER |= TIMER_CCER_CC3E | |
| 329 | - #define FUEL4_TIMER_ENABLE() (TIMER2->regs).gen->CCER |= TIMER_CCER_CC4E | |
| 330 | - | |
| 331 | - #define FUEL1_TIMER_DISABLE() (TIMER2->regs).gen->CCER &= ~TIMER_CCER_CC1E | |
| 332 | - #define FUEL2_TIMER_DISABLE() (TIMER2->regs).gen->CCER &= ~TIMER_CCER_CC2E | |
| 333 | - #define FUEL3_TIMER_DISABLE() (TIMER2->regs).gen->CCER &= ~TIMER_CCER_CC3E | |
| 334 | - #define FUEL4_TIMER_DISABLE() (TIMER2->regs).gen->CCER &= ~TIMER_CCER_CC4E | |
| 335 | - | |
| 336 | - #define IGN1_TIMER_DISABLE() (TIMER3->regs).gen->CCER &= ~TIMER_CCER_CC1E | |
| 337 | - #define IGN2_TIMER_DISABLE() (TIMER3->regs).gen->CCER &= ~TIMER_CCER_CC2E | |
| 338 | - #define IGN3_TIMER_DISABLE() (TIMER3->regs).gen->CCER &= ~TIMER_CCER_CC3E | |
| 339 | - #define IGN4_TIMER_DISABLE() (TIMER3->regs).gen->CCER &= ~TIMER_CCER_CC4E | |
| 340 | - | |
| 341 | - #define IGN1_TIMER_ENABLE() (TIMER3->regs).gen->CCER |= TIMER_CCER_CC1E | |
| 342 | - #define IGN2_TIMER_ENABLE() (TIMER3->regs).gen->CCER |= TIMER_CCER_CC2E | |
| 343 | - #define IGN3_TIMER_ENABLE() (TIMER3->regs).gen->CCER |= TIMER_CCER_CC3E | |
| 344 | - #define IGN4_TIMER_ENABLE() (TIMER3->regs).gen->CCER |= TIMER_CCER_CC4E | |
| 345 | - | |
| 346 | -#ifndef SMALL_FLASH_MODE | |
| 347 | - #define FUEL5_TIMER_ENABLE() (TIMER5->regs).gen->CCER |= TIMER_CCER_CC1E | |
| 348 | - #define FUEL6_TIMER_ENABLE() (TIMER5->regs).gen->CCER |= TIMER_CCER_CC2E | |
| 349 | - #define FUEL7_TIMER_ENABLE() (TIMER5->regs).gen->CCER |= TIMER_CCER_CC3E | |
| 350 | - #define FUEL8_TIMER_ENABLE() (TIMER5->regs).gen->CCER |= TIMER_CCER_CC4E | |
| 351 | - | |
| 352 | - #define IGN5_TIMER_ENABLE() (TIMER4->regs).gen->CCER |= TIMER_CCER_CC1E | |
| 353 | - #define IGN6_TIMER_ENABLE() (TIMER4->regs).gen->CCER |= TIMER_CCER_CC2E | |
| 354 | - #define IGN7_TIMER_ENABLE() (TIMER4->regs).gen->CCER |= TIMER_CCER_CC3E | |
| 355 | - #define IGN8_TIMER_ENABLE() (TIMER4->regs).gen->CCER |= TIMER_CCER_CC4E | |
| 356 | - | |
| 357 | - #define FUEL5_TIMER_DISABLE() (TIMER5->regs).gen->CCER &= ~TIMER_CCER_CC1E | |
| 358 | - #define FUEL6_TIMER_DISABLE() (TIMER5->regs).gen->CCER &= ~TIMER_CCER_CC2E | |
| 359 | - #define FUEL7_TIMER_DISABLE() (TIMER5->regs).gen->CCER &= ~TIMER_CCER_CC3E | |
| 360 | - #define FUEL8_TIMER_DISABLE() (TIMER5->regs).gen->CCER &= ~TIMER_CCER_CC4E | |
| 361 | - | |
| 362 | - #define IGN5_TIMER_DISABLE() (TIMER4->regs).gen->CCER &= ~TIMER_CCER_CC1E | |
| 363 | - #define IGN6_TIMER_DISABLE() (TIMER4->regs).gen->CCER &= ~TIMER_CCER_CC2E | |
| 364 | - #define IGN7_TIMER_DISABLE() (TIMER4->regs).gen->CCER &= ~TIMER_CCER_CC3E | |
| 365 | - #define IGN8_TIMER_DISABLE() (TIMER4->regs).gen->CCER &= ~TIMER_CCER_CC4E | |
| 366 | -#endif | |
| 367 | - #endif | |
| 368 | -#endif | |
| 369 | - | |
| 370 | 31 | void initialiseSchedulers(); |
| 371 | 32 | void setFuelSchedule1(unsigned long timeout, unsigned long duration); |
| 372 | 33 | void setFuelSchedule2(unsigned long timeout, unsigned long duration); |
| @@ -11,4 +11,67 @@ | ||
| 11 | 11 | uint16_t calculateInjector4StartAngle(unsigned int); |
| 12 | 12 | uint16_t calculateInjector4StartAngle(unsigned int); |
| 13 | 13 | |
| 14 | +struct config2 configPage2; | |
| 15 | +struct config4 configPage4; //Done | |
| 16 | +struct config6 configPage6; | |
| 17 | +struct config9 configPage9; | |
| 18 | +struct config10 configPage10; | |
| 19 | + | |
| 20 | +uint16_t req_fuel_uS, inj_opentime_uS; | |
| 21 | +uint16_t staged_req_fuel_mult_pri; | |
| 22 | +uint16_t staged_req_fuel_mult_sec; | |
| 23 | + | |
| 24 | +bool ignitionOn = false; //The current state of the ignition system | |
| 25 | +bool fuelOn = false; //The current state of the ignition system | |
| 26 | + | |
| 27 | +byte cltCalibrationTable[CALIBRATION_TABLE_SIZE]; | |
| 28 | +byte iatCalibrationTable[CALIBRATION_TABLE_SIZE]; | |
| 29 | +byte o2CalibrationTable[CALIBRATION_TABLE_SIZE]; | |
| 30 | + | |
| 31 | +unsigned long counter; | |
| 32 | +unsigned long currentLoopTime; //The time the current loop started (uS) | |
| 33 | +unsigned long previousLoopTime; //The time the previous loop started (uS) | |
| 34 | + | |
| 35 | +byte maxIgnOutputs = 1; //Used for rolling rev limiter | |
| 36 | +byte curRollingCut = 0; //Rolling rev limiter, current ignition channel being cut | |
| 37 | +byte rollingCutCounter = 0; //how many times (revolutions) the ignition has been cut in a row | |
| 38 | +uint32_t rollingCutLastRev = 0; //Tracks whether we're on the same or a different rev for the rolling cut | |
| 39 | + | |
| 40 | + | |
| 41 | +unsigned long secCounter; //The next time to incremen 'runSecs' counter. | |
| 42 | +int channel1IgnDegrees; //The number of crank degrees until cylinder 1 is at TDC (This is obviously 0 for virtually ALL engines, but there's some weird ones) | |
| 43 | +int channel2IgnDegrees; //The number of crank degrees until cylinder 2 (and 5/6/7/8) is at TDC | |
| 44 | +int channel3IgnDegrees; //The number of crank degrees until cylinder 3 (and 5/6/7/8) is at TDC | |
| 45 | +int channel4IgnDegrees; //The number of crank degrees until cylinder 4 (and 5/6/7/8) is at TDC | |
| 46 | +int channel5IgnDegrees; //The number of crank degrees until cylinder 5 is at TDC | |
| 47 | +int channel6IgnDegrees; //The number of crank degrees until cylinder 6 is at TDC | |
| 48 | +int channel7IgnDegrees; //The number of crank degrees until cylinder 7 is at TDC | |
| 49 | +int channel8IgnDegrees; //The number of crank degrees until cylinder 8 is at TDC | |
| 50 | +int channel1InjDegrees; //The number of crank degrees until cylinder 1 is at TDC (This is obviously 0 for virtually ALL engines, but there's some weird ones) | |
| 51 | +int channel2InjDegrees; //The number of crank degrees until cylinder 2 (and 5/6/7/8) is at TDC | |
| 52 | +int channel3InjDegrees; //The number of crank degrees until cylinder 3 (and 5/6/7/8) is at TDC | |
| 53 | +int channel4InjDegrees; //The number of crank degrees until cylinder 4 (and 5/6/7/8) is at TDC | |
| 54 | +int channel5InjDegrees; //The number of crank degrees until cylinder 5 is at TDC | |
| 55 | +int channel6InjDegrees; //The number of crank degrees until cylinder 6 is at TDC | |
| 56 | +int channel7InjDegrees; //The number of crank degrees until cylinder 7 is at TDC | |
| 57 | +int channel8InjDegrees; //The number of crank degrees until cylinder 8 is at TDC | |
| 58 | + | |
| 59 | +//These are the functions the get called to begin and end the ignition coil charging. They are required for the various spark output modes | |
| 60 | +void (*ign1StartFunction)(); | |
| 61 | +void (*ign1EndFunction)(); | |
| 62 | +void (*ign2StartFunction)(); | |
| 63 | +void (*ign2EndFunction)(); | |
| 64 | +void (*ign3StartFunction)(); | |
| 65 | +void (*ign3EndFunction)(); | |
| 66 | +void (*ign4StartFunction)(); | |
| 67 | +void (*ign4EndFunction)(); | |
| 68 | +void (*ign5StartFunction)(); | |
| 69 | +void (*ign5EndFunction)(); | |
| 70 | +void (*ign6StartFunction)(); | |
| 71 | +void (*ign6EndFunction)(); | |
| 72 | +void (*ign7StartFunction)(); | |
| 73 | +void (*ign7EndFunction)(); | |
| 74 | +void (*ign8StartFunction)(); | |
| 75 | +void (*ign8EndFunction)(); | |
| 76 | + | |
| 14 | 77 | #endif |
| @@ -31,7 +31,7 @@ | ||
| 31 | 31 | #define FastCRC_tables |
| 32 | 32 | #include "inttypes.h" |
| 33 | 33 | |
| 34 | -#if defined(__AVR__) || defined(STM32_MCU_SERIES) || defined(ARDUINO_ARCH_STM32) || defined(_VARIANT_ARDUINO_STM32_) | |
| 34 | +#if defined(__AVR__) || defined(STM32_MCU_SERIES) || defined(ARDUINO_ARCH_STM32) || defined(_VARIANT_ARDUINO_STM32_) || defined(__SAMD21G18A__) | |
| 35 | 35 | #include <avr/pgmspace.h> |
| 36 | 36 | #else |
| 37 | 37 | #include <pgmspace.h> |
| @@ -0,0 +1,76 @@ | ||
| 1 | +/* | |
| 2 | + EEPROM like API that uses Arduino Zero's flash memory. | |
| 3 | + Written by A. Christian | |
| 4 | + | |
| 5 | + Copyright (c) 2015-2016 Arduino LLC. All right reserved. | |
| 6 | + | |
| 7 | + This library is free software; you can redistribute it and/or | |
| 8 | + modify it under the terms of the GNU Lesser General Public | |
| 9 | + License as published by the Free Software Foundation; either | |
| 10 | + version 2.1 of the License, or (at your option) any later version. | |
| 11 | + | |
| 12 | + This library is distributed in the hope that it will be useful, | |
| 13 | + but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 14 | + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. | |
| 15 | + See the GNU Lesser General Public License for more details. | |
| 16 | + | |
| 17 | + You should have received a copy of the GNU Lesser General Public | |
| 18 | + License along with this library; if not, write to the Free Software | |
| 19 | + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | |
| 20 | +*/ | |
| 21 | +#if defined(__SAMD21G18A__) | |
| 22 | +#include "FlashAsEEPROM.h" | |
| 23 | + | |
| 24 | +FlashStorage(eeprom_storage, EEPROM_EMULATION); | |
| 25 | + | |
| 26 | +EEPROMClass::EEPROMClass(void) : _initialized(false), _dirty(false) { | |
| 27 | + // Empty | |
| 28 | +} | |
| 29 | + | |
| 30 | +uint8_t EEPROMClass::read(int address) | |
| 31 | +{ | |
| 32 | + if (!_initialized) init(); | |
| 33 | + return _eeprom.data[address]; | |
| 34 | +} | |
| 35 | + | |
| 36 | +void EEPROMClass::update(int address, uint8_t value) | |
| 37 | +{ | |
| 38 | + if (!_initialized) init(); | |
| 39 | + if (_eeprom.data[address] != value) { | |
| 40 | + _dirty = true; | |
| 41 | + _eeprom.data[address] = value; | |
| 42 | + } | |
| 43 | +} | |
| 44 | + | |
| 45 | +void EEPROMClass::write(int address, uint8_t value) | |
| 46 | +{ | |
| 47 | + update(address, value); | |
| 48 | +} | |
| 49 | + | |
| 50 | +void EEPROMClass::init() | |
| 51 | +{ | |
| 52 | + _eeprom = eeprom_storage.read(); | |
| 53 | + if (!_eeprom.valid) { | |
| 54 | + memset(_eeprom.data, 0xFF, EEPROM_EMULATION_SIZE); | |
| 55 | + } | |
| 56 | + _initialized = true; | |
| 57 | +} | |
| 58 | + | |
| 59 | +bool EEPROMClass::isValid() | |
| 60 | +{ | |
| 61 | + if (!_initialized) init(); | |
| 62 | + return _eeprom.valid; | |
| 63 | +} | |
| 64 | + | |
| 65 | +void EEPROMClass::commit() | |
| 66 | +{ | |
| 67 | + if (!_initialized) init(); | |
| 68 | + if (_dirty) { | |
| 69 | + _eeprom.valid = true; | |
| 70 | + eeprom_storage.write(_eeprom); | |
| 71 | + } | |
| 72 | +} | |
| 73 | + | |
| 74 | +EEPROMClass EEPROM; | |
| 75 | + | |
| 76 | +#endif | |
| \ No newline at end of file |
| @@ -0,0 +1,87 @@ | ||
| 1 | +/* | |
| 2 | + EEPROM like API that uses Arduino Zero's flash memory. | |
| 3 | + Written by A. Christian | |
| 4 | + | |
| 5 | + Copyright (c) 2015-2016 Arduino LLC. All right reserved. | |
| 6 | + | |
| 7 | + This library is free software; you can redistribute it and/or | |
| 8 | + modify it under the terms of the GNU Lesser General Public | |
| 9 | + License as published by the Free Software Foundation; either | |
| 10 | + version 2.1 of the License, or (at your option) any later version. | |
| 11 | + | |
| 12 | + This library is distributed in the hope that it will be useful, | |
| 13 | + but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 14 | + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. | |
| 15 | + See the GNU Lesser General Public License for more details. | |
| 16 | + | |
| 17 | + You should have received a copy of the GNU Lesser General Public | |
| 18 | + License along with this library; if not, write to the Free Software | |
| 19 | + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | |
| 20 | +*/ | |
| 21 | + | |
| 22 | +#ifndef FLASH_AS_EEPROM_h | |
| 23 | +#define FLASH_AS_EEPROM_h | |
| 24 | + | |
| 25 | +#include "FlashStorage.h" | |
| 26 | + | |
| 27 | +#ifndef EEPROM_EMULATION_SIZE | |
| 28 | +#define EEPROM_EMULATION_SIZE 1024 | |
| 29 | +#endif | |
| 30 | + | |
| 31 | +typedef struct { | |
| 32 | + byte data[EEPROM_EMULATION_SIZE]; | |
| 33 | + boolean valid; | |
| 34 | +} EEPROM_EMULATION; | |
| 35 | + | |
| 36 | + | |
| 37 | +class EEPROMClass { | |
| 38 | + | |
| 39 | + public: | |
| 40 | + EEPROMClass(void); | |
| 41 | + | |
| 42 | + /** | |
| 43 | + * Read an eeprom cell | |
| 44 | + * @param index | |
| 45 | + * @return value | |
| 46 | + */ | |
| 47 | + uint8_t read(int); | |
| 48 | + | |
| 49 | + /** | |
| 50 | + * Write value to an eeprom cell | |
| 51 | + * @param index | |
| 52 | + * @param value | |
| 53 | + */ | |
| 54 | + void write(int, uint8_t); | |
| 55 | + | |
| 56 | + /** | |
| 57 | + * Update a eeprom cell | |
| 58 | + * @param index | |
| 59 | + * @param value | |
| 60 | + */ | |
| 61 | + void update(int, uint8_t); | |
| 62 | + | |
| 63 | + /** | |
| 64 | + * Check whether the eeprom data is valid | |
| 65 | + * @return true, if eeprom data is valid (has been written at least once), false if not | |
| 66 | + */ | |
| 67 | + bool isValid(); | |
| 68 | + | |
| 69 | + /** | |
| 70 | + * Write previously made eeprom changes to the underlying flash storage | |
| 71 | + * Use this with care: Each and every commit will harm the flash and reduce it's lifetime (like with every flash memory) | |
| 72 | + */ | |
| 73 | + void commit(); | |
| 74 | + | |
| 75 | + uint16_t length() { return EEPROM_EMULATION_SIZE; } | |
| 76 | + | |
| 77 | + private: | |
| 78 | + void init(); | |
| 79 | + | |
| 80 | + bool _initialized; | |
| 81 | + EEPROM_EMULATION _eeprom; | |
| 82 | + bool _dirty; | |
| 83 | +}; | |
| 84 | + | |
| 85 | +extern EEPROMClass EEPROM; | |
| 86 | + | |
| 87 | +#endif |
| @@ -0,0 +1,104 @@ | ||
| 1 | +/* | |
| 2 | + Copyright (c) 2015 Arduino LLC. All right reserved. | |
| 3 | + Written by Cristian Maglie | |
| 4 | + | |
| 5 | + This library is free software; you can redistribute it and/or | |
| 6 | + modify it under the terms of the GNU Lesser General Public | |
| 7 | + License as published by the Free Software Foundation; either | |
| 8 | + version 2.1 of the License, or (at your option) any later version. | |
| 9 | + | |
| 10 | + This library is distributed in the hope that it will be useful, | |
| 11 | + but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 12 | + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. | |
| 13 | + See the GNU Lesser General Public License for more details. | |
| 14 | + | |
| 15 | + You should have received a copy of the GNU Lesser General Public | |
| 16 | + License along with this library; if not, write to the Free Software | |
| 17 | + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | |
| 18 | +*/ | |
| 19 | +#if defined(__SAMD21G18A__) | |
| 20 | +#include "FlashStorage.h" | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | +static const uint32_t pageSizes[] = { 8, 16, 32, 64, 128, 256, 512, 1024 }; | |
| 25 | + | |
| 26 | +FlashClass::FlashClass(const void *flash_addr, uint32_t size) : | |
| 27 | + PAGE_SIZE(pageSizes[NVMCTRL->PARAM.bit.PSZ]), | |
| 28 | + PAGES(NVMCTRL->PARAM.bit.NVMP), | |
| 29 | + MAX_FLASH(PAGE_SIZE * PAGES), | |
| 30 | + ROW_SIZE(PAGE_SIZE * 4), | |
| 31 | + flash_address((volatile void *)flash_addr), | |
| 32 | + flash_size(size) | |
| 33 | +{ | |
| 34 | +} | |
| 35 | + | |
| 36 | +static inline uint32_t read_unaligned_uint32(const void *data) | |
| 37 | +{ | |
| 38 | + union { | |
| 39 | + uint32_t u32; | |
| 40 | + uint8_t u8[4]; | |
| 41 | + } res; | |
| 42 | + const uint8_t *d = (const uint8_t *)data; | |
| 43 | + res.u8[0] = d[0]; | |
| 44 | + res.u8[1] = d[1]; | |
| 45 | + res.u8[2] = d[2]; | |
| 46 | + res.u8[3] = d[3]; | |
| 47 | + return res.u32; | |
| 48 | +} | |
| 49 | + | |
| 50 | +void FlashClass::write(const volatile void *flash_ptr, const void *data, uint32_t size) | |
| 51 | +{ | |
| 52 | + // Calculate data boundaries | |
| 53 | + size = (size + 3) / 4; | |
| 54 | + volatile uint32_t *dst_addr = (volatile uint32_t *)flash_ptr; | |
| 55 | + const uint8_t *src_addr = (uint8_t *)data; | |
| 56 | + | |
| 57 | + // Disable automatic page write | |
| 58 | + NVMCTRL->CTRLB.bit.MANW = 1; | |
| 59 | + | |
| 60 | + // Do writes in pages | |
| 61 | + while (size) { | |
| 62 | + // Execute "PBC" Page Buffer Clear | |
| 63 | + NVMCTRL->CTRLA.reg = NVMCTRL_CTRLA_CMDEX_KEY | NVMCTRL_CTRLA_CMD_PBC; | |
| 64 | + while (NVMCTRL->INTFLAG.bit.READY == 0) { } | |
| 65 | + | |
| 66 | + // Fill page buffer | |
| 67 | + uint32_t i; | |
| 68 | + for (i=0; i<(PAGE_SIZE/4) && size; i++) { | |
| 69 | + *dst_addr = read_unaligned_uint32(src_addr); | |
| 70 | + src_addr += 4; | |
| 71 | + dst_addr++; | |
| 72 | + size--; | |
| 73 | + } | |
| 74 | + | |
| 75 | + // Execute "WP" Write Page | |
| 76 | + NVMCTRL->CTRLA.reg = NVMCTRL_CTRLA_CMDEX_KEY | NVMCTRL_CTRLA_CMD_WP; | |
| 77 | + while (NVMCTRL->INTFLAG.bit.READY == 0) { } | |
| 78 | + } | |
| 79 | +} | |
| 80 | + | |
| 81 | +void FlashClass::erase(const volatile void *flash_ptr, uint32_t size) | |
| 82 | +{ | |
| 83 | + const uint8_t *ptr = (const uint8_t *)flash_ptr; | |
| 84 | + while (size > ROW_SIZE) { | |
| 85 | + erase(ptr); | |
| 86 | + ptr += ROW_SIZE; | |
| 87 | + size -= ROW_SIZE; | |
| 88 | + } | |
| 89 | + erase(ptr); | |
| 90 | +} | |
| 91 | + | |
| 92 | +void FlashClass::erase(const volatile void *flash_ptr) | |
| 93 | +{ | |
| 94 | + NVMCTRL->ADDR.reg = ((uint32_t)flash_ptr) / 2; | |
| 95 | + NVMCTRL->CTRLA.reg = NVMCTRL_CTRLA_CMDEX_KEY | NVMCTRL_CTRLA_CMD_ER; | |
| 96 | + while (!NVMCTRL->INTFLAG.bit.READY) { } | |
| 97 | +} | |
| 98 | + | |
| 99 | +void FlashClass::read(const volatile void *flash_ptr, void *data, uint32_t size) | |
| 100 | +{ | |
| 101 | + memcpy(data, (const void *)flash_ptr, size); | |
| 102 | +} | |
| 103 | + | |
| 104 | +#endif | |
| \ No newline at end of file |
| @@ -0,0 +1,77 @@ | ||
| 1 | +/* | |
| 2 | + Copyright (c) 2015 Arduino LLC. All right reserved. | |
| 3 | + Written by Cristian Maglie | |
| 4 | + | |
| 5 | + This library is free software; you can redistribute it and/or | |
| 6 | + modify it under the terms of the GNU Lesser General Public | |
| 7 | + License as published by the Free Software Foundation; either | |
| 8 | + version 2.1 of the License, or (at your option) any later version. | |
| 9 | + | |
| 10 | + This library is distributed in the hope that it will be useful, | |
| 11 | + but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 12 | + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. | |
| 13 | + See the GNU Lesser General Public License for more details. | |
| 14 | + | |
| 15 | + You should have received a copy of the GNU Lesser General Public | |
| 16 | + License along with this library; if not, write to the Free Software | |
| 17 | + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | |
| 18 | +*/ | |
| 19 | + | |
| 20 | +#pragma once | |
| 21 | + | |
| 22 | +#include <Arduino.h> | |
| 23 | + | |
| 24 | +// Concatenate after macro expansion | |
| 25 | +#define PPCAT_NX(A, B) A ## B | |
| 26 | +#define PPCAT(A, B) PPCAT_NX(A, B) | |
| 27 | + | |
| 28 | +#define Flash(name, size) \ | |
| 29 | + __attribute__((__aligned__(256))) \ | |
| 30 | + static const uint8_t PPCAT(_data,name)[(size+255)/256*256] = { }; \ | |
| 31 | + FlashClass name(PPCAT(_data,name), size); | |
| 32 | + | |
| 33 | +#define FlashStorage(name, T) \ | |
| 34 | + __attribute__((__aligned__(256))) \ | |
| 35 | + static const uint8_t PPCAT(_data,name)[(sizeof(T)+255)/256*256] = { }; \ | |
| 36 | + FlashStorageClass<T> name(PPCAT(_data,name)); | |
| 37 | + | |
| 38 | +class FlashClass { | |
| 39 | +public: | |
| 40 | + FlashClass(const void *flash_addr = NULL, uint32_t size = 0); | |
| 41 | + | |
| 42 | + void write(const void *data) { write(flash_address, data, flash_size); } | |
| 43 | + void erase() { erase(flash_address, flash_size); } | |
| 44 | + void read(void *data) { read(flash_address, data, flash_size); } | |
| 45 | + | |
| 46 | + void write(const volatile void *flash_ptr, const void *data, uint32_t size); | |
| 47 | + void erase(const volatile void *flash_ptr, uint32_t size); | |
| 48 | + void read(const volatile void *flash_ptr, void *data, uint32_t size); | |
| 49 | + | |
| 50 | +private: | |
| 51 | + void erase(const volatile void *flash_ptr); | |
| 52 | + | |
| 53 | + const uint32_t PAGE_SIZE, PAGES, MAX_FLASH, ROW_SIZE; | |
| 54 | + const volatile void *flash_address; | |
| 55 | + const uint32_t flash_size; | |
| 56 | +}; | |
| 57 | + | |
| 58 | +template<class T> | |
| 59 | +class FlashStorageClass { | |
| 60 | +public: | |
| 61 | + FlashStorageClass(const void *flash_addr) : flash(flash_addr, sizeof(T)) { }; | |
| 62 | + | |
| 63 | + // Write data into flash memory. | |
| 64 | + // Compiler is able to optimize parameter copy. | |
| 65 | + inline void write(T data) { flash.erase(); flash.write(&data); } | |
| 66 | + | |
| 67 | + // Read data from flash into variable. | |
| 68 | + inline void read(T *data) { flash.read(data); } | |
| 69 | + | |
| 70 | + // Overloaded version of read. | |
| 71 | + // Compiler is able to optimize copy-on-return. | |
| 72 | + inline T read() { T data; read(&data); return data; } | |
| 73 | + | |
| 74 | +private: | |
| 75 | + FlashClass flash; | |
| 76 | +}; | |
| 77 | + |
| @@ -1,6 +1,8 @@ | ||
| 1 | 1 | #ifndef STORAGE_H |
| 2 | 2 | #define STORAGE_H |
| 3 | 3 | |
| 4 | +#include "globals.h" | |
| 5 | + | |
| 4 | 6 | void writeAllConfig(); |
| 5 | 7 | void writeConfig(byte); |
| 6 | 8 | void loadConfig(); |
| @@ -7,6 +9,13 @@ | ||
| 7 | 9 | void loadCalibration(); |
| 8 | 10 | void writeCalibration(); |
| 9 | 11 | |
| 12 | +//These are utility functions that prevent other files from having to use EEPROM.h directly | |
| 13 | +byte readLastBaro(); | |
| 14 | +void storeLastBaro(byte); | |
| 15 | +void storeCalibrationValue(byte, byte); | |
| 16 | +byte readEEPROMVersion(); | |
| 17 | +void storeEEPROMVersion(byte); | |
| 18 | + | |
| 10 | 19 | #if defined(CORE_STM32) || defined(CORE_TEENSY) |
| 11 | 20 | #define EEPROM_MAX_WRITE_BLOCK 64 //The maximum number of write operations that will be performed in one go. If we try to write to the EEPROM too fast (Each write takes ~3ms) then the rest of the system can hang) |
| 12 | 21 | #else |
| @@ -130,8 +139,8 @@ | ||
| 130 | 139 | #define EEPROM_CONFIG8_MAP4 1653 |
| 131 | 140 | #define EEPROM_CONFIG8_XBINS4 1689 |
| 132 | 141 | #define EEPROM_CONFIG8_YBINS4 1695 |
| 133 | -#define EEPROM_CONFIG9_START 1710 | |
| 134 | -#define EEPROM_CONFIG9_END 1902 | |
| 142 | +#define EEPROM_CONFIG9_START 1710 | |
| 143 | +#define EEPROM_CONFIG9_END 1902 | |
| 135 | 144 | #define EEPROM_CONFIG10_START 1902 |
| 136 | 145 | #define EEPROM_CONFIG10_END 2094 |
| 137 | 146 | #define EEPROM_CONFIG12_XSIZE 2094 //[PJSC] |
| @@ -142,7 +151,8 @@ | ||
| 142 | 151 | #define EEPROM_CONFIG12_END 2384 //[PJSC] |
| 143 | 152 | |
| 144 | 153 | //Calibration data is stored at the end of the EEPROM (This is in case any further calibration tables are needed as they are large blocks) |
| 145 | -#define EEPROM_LAST_BARO 2558 | |
| 154 | +//[PJSC ver1.10]#define EEPROM_LAST_BARO 2558 | |
| 155 | +#define EEPROM_LAST_BARO 2557 //[PJSC ver1.10] | |
| 146 | 156 | #define EEPROM_CALIBRATION_O2 2559 |
| 147 | 157 | #define EEPROM_CALIBRATION_IAT 3071 |
| 148 | 158 | #define EEPROM_CALIBRATION_CLT 3583 |
| @@ -31,7 +31,8 @@ | ||
| 31 | 31 | byte cacheTime; //TRacks when the last cache value was set so it can expire after x seconds. A timeout is required to pickup when a tuning value is changed, otherwise the old cached value will continue to be returned as the X value isn't changing. |
| 32 | 32 | }; |
| 33 | 33 | |
| 34 | -void table2D_setSize(struct table2D targetTable, byte newSize); | |
| 34 | +//void table2D_setSize(struct table2D targetTable, byte newSize); | |
| 35 | +void table2D_setSize(struct table2D, byte); | |
| 35 | 36 | |
| 36 | 37 | struct table3D { |
| 37 | 38 |
| @@ -49,7 +50,8 @@ | ||
| 49 | 50 | byte lastYMax, lastYMin; |
| 50 | 51 | }; |
| 51 | 52 | |
| 52 | -void table3D_setSize(struct table3D *targetTable, byte newSize); | |
| 53 | +//void table3D_setSize(struct table3D *targetTable, byte); | |
| 54 | +void table3D_setSize(struct table3D *targetTable, byte); | |
| 53 | 55 | |
| 54 | 56 | /* |
| 55 | 57 | 3D Tables have an origin (0,0) in the top left hand corner. Vertical axis is expressed first. |
| @@ -29,14 +29,6 @@ | ||
| 29 | 29 | volatile uint16_t lastRPM_100ms; //Need to record this for rpmDOT calculation |
| 30 | 30 | volatile uint16_t last250msLoopCount = 1000; //Set to effectively random number on startup. Just need this to be different to what mainLoopCount equals initially (Probably 0) |
| 31 | 31 | |
| 32 | -#if defined(TIMER5_MICROS) | |
| 33 | - //#define micros() (((timer5_overflow_count << 16) + TCNT5) * 4) //Fast version of micros() that uses the 4uS tick of timer5. See timers.ino for the overflow ISR of timer5 | |
| 34 | - #define millis() (ms_counter) //Replaces the standard millis() function with this macro. It is both faster and more accurate. See timers.ino for its counter increment. | |
| 35 | - static inline unsigned long micros_safe(); //A version of micros() that is interrupt safe | |
| 36 | -#else | |
| 37 | - #define micros_safe() micros() //If the timer5 method is not used, the micros_safe() macro is simply an alias for the normal micros() | |
| 38 | -#endif | |
| 39 | - | |
| 40 | 32 | #if defined (CORE_TEENSY) |
| 41 | 33 | IntervalTimer lowResTimer; |
| 42 | 34 | void oneMSInterval(); |
| @@ -6,49 +6,8 @@ | ||
| 6 | 6 | |
| 7 | 7 | #include <Arduino.h> |
| 8 | 8 | |
| 9 | -uint16_t freeRam (); | |
| 10 | -void setPinMapping(byte boardID); | |
| 11 | -void initialiseTriggers(); | |
| 9 | +void setResetControlPinState(); | |
| 10 | +byte pinTranslate(byte); | |
| 12 | 11 | |
| 13 | -//This is dumb, but it'll do for now to get things compiling | |
| 14 | -#if defined(CORE_STM32) | |
| 15 | - //STM32F1/variants/.../board.cpp | |
| 16 | - #if defined (STM32F4) | |
| 17 | - #define A0 PA0 | |
| 18 | - #define A1 PA1 | |
| 19 | - #define A2 PA2 | |
| 20 | - #define A3 PA3 | |
| 21 | - #define A4 PA4 | |
| 22 | - #define A5 PA5 | |
| 23 | - #define A6 PA6 | |
| 24 | - #define A7 PA7 | |
| 25 | - #define A8 PB0 | |
| 26 | - #define A9 PB1 | |
| 27 | - #define A10 PC0 | |
| 28 | - #define A11 PC1 | |
| 29 | - #define A12 PC2 | |
| 30 | - #define A13 PC3 | |
| 31 | - #define A14 PC4 | |
| 32 | - #define A15 PC5 | |
| 33 | - #else | |
| 34 | - #define A0 PB0 | |
| 35 | - #define A1 PA7 | |
| 36 | - #define A2 PA6 | |
| 37 | - #define A3 PA5 | |
| 38 | - #define A4 PA4 | |
| 39 | - #define A5 PA3 | |
| 40 | - #define A6 PA2 | |
| 41 | - #define A7 PA1 | |
| 42 | - #define A8 PA0 | |
| 43 | - //STM32F1 have only 9 12bit adc | |
| 44 | - #define A9 PB0 | |
| 45 | - #define A10 PA7 | |
| 46 | - #define A11 PA6 | |
| 47 | - #define A12 PA5 | |
| 48 | - #define A13 PA4 | |
| 49 | - #define A14 PA3 | |
| 50 | - #define A15 PA2 | |
| 51 | - #endif | |
| 52 | -#endif | |
| 53 | 12 | |
| 54 | 13 | #endif // UTILS_H |