MemsFCR Diagnostics

Sensor Reference

Acronym Sensor
ATS
80x05_intake_air_temp
Air Temperature Sensor
Located under the air filter.
Measures the air temperature.
CTS
80x03_coolant_temp
Coolant Temperature Sensor
Located under the injection unit.
Measures the coolant (engine) temperature.
CAS (CPS)
80x19_crankshaft_position_sensor
Crank Angle Sensor (Crankshaft Position Sensor)
Located at the front / side of the engine.
Measures the position of the engine relative to TDC and is used to calculate the RPM.
MAP
80x07_map_kpa
Manifold Absolute Pressure Sensor
Located in the ECU, connects via vacuum pipes and fuel trap from the rear of the inlet manifold.
Measures the engine load
TPS
80x09_throttle_pot
Throttle Potentiometer Sensor
Located right of the air filter connected to throttle linkage.
Measures the throttle position
IAC(V)
80x12_iac_position
Idle Air Control (Valve)
Controls the throttle / stepper motor to adjust air : fuel ratio when idling and smooth transition when lifting off the throttle.

MemsFCR Log File Format and Applied Calculations to Raw Data

Metric Description Calculations Applied
#time event timestamp hh:mm:ss.sss
80×01-02_engine-rpm The rotational speed of the engine calculated by the MEMS ECU using the crankshaft sensor. Faults in the crankshaft sensor or associated wiring may be indicated if this display reads 0 during engine cranking.
80x03_coolant_temp This shows the coolant temperature as measured by the ECU. If the sensor is open circuit, a default value of about 60C will be displayed. During engine warm up, the value should rise smoothly from ambient to approximately 90C. Sensor faults may cause several symptoms including poor starting, fast idle speed, poor fuel consumption and cooling fans running continuously. value – 55
80x04_ambient_temp not used by the ECU, always returns 255 value – 55 = 200
80x05_intake_air_temp This shows the temperature measured by the ECU using the inlet air temperature sensor (if fitted). If the sensor is open circuit, then a fixed default value will be displayed. The inlet air temperature is used by the ECU to retard the ignition timing to avoid knock and trim the fuelling when hot. If the sensor is not operating correctly the engine performance may be impaired slightly. value – 55
80x06_fuel_temp not used by the ECU, always returns 255 value – 55 = 200
80x07_map_kpa Shows the pressure measure by the internal MEMS air pressure sensor. This value should show atmospheric pressure of 100 KPa when the engine is stopped and a lower value between 25 – 40 KPa during engine idle conditions. Very high values may indicate problems with the sensor inside the MEMS or more likely a blocked or disconnected vacuum pipe. Moderately raised values may indicate mechanical problems with the engine.
80x08_battery_voltage This shows the voltage of the vehicle supply measured internally by the ECU. Large errors in this measurement will lead to possible poor starting and errors in idle CO. value / 10
80x09_throttle_pot This value shows the signal received by the ECU from the Throttle Position Sensor (Throttle Pot). The value is displayed in bits and has a range from 0(closed) to 255(open). The full range of values will not be seen in practice. value * 0.02
80x0A_idle_switch shows the state of the throttle switch, fitted on early vehicles. On systems without an actual throttle switch the value shown indicates whether the MEMS ECU has calculated that the throttle is closed by using the throttle position sensor. If the switch shows ‘ON’ when the throttle is closed, then the vehicle will not idle correctly and the closed throttle position may need to be reset. This procedure is performed by fully depressing and releasing the accelerator pedal 5 times within 10 or less seconds of turning on the ignition and then waiting 20 seconds.
80x0B_uk1 unknown value
80x0C_park_neutral_switch This shows the state of the park neutral switch as measured by the MEMS ECU. This switch is used to improve the quality of engine idle speed control on automatic or CVT (Constantly Variable Transmission) gearbox vehicles. A fault with this switch will cause the idle speed to dip or rise suddenly when the gear selection is changed between neutral and drive. This display will not work on manual gearbox vehicles. true / false
80x0D-0E_fault_codes ECU fault codes:<br>Coolant temp sensor fault (Code 1)<br>Inlet air temp sensor fault (Code 2)<br>Fuel pump circuit fault (Code 10)<br>Throttle pot circuit fault (Code 16)
80x0F_idle_set_point adjusts the idle rpm by the value shown. Adjusting idle speed will modify this value
80x10_idle_hot This is the number of IACV steps from fully closed (0) which the ECU has learned as the correct position to maintain the target idle speed with a fully warmed up engine. If this value is outside the range 10 – 50 steps, then this is an indication of a possible fault condition or poor adjustment. This value can be forced for a short time using the function in the settings section. value – 35
80x11_uk2 unknown value
80x12_iac_position Inlet Air Control valve (IACV) position (relates to expected Stepper Motor position)
80×13-14_idle_error This is the current difference between the target idle speed set by the MEMS ECU and the actual engine speed. A value of more than 100 RPM indicates that the ECU is not in control of the idle speed. This indicates a possible fault condition. A quick addition of this value and the current engine RPM will also tell what the value is of the ECU’s target Idle Speed.
80x15_ignition_advance_offset Shows the value of the service ignition offset currently being used by the MEMS ECU. This is a special service adjustment for countries which use low octane fuel. The value is set and can be cleared by using the MemsFCR
80x16_ignition_advance This is a facility which is built into the MEMS ECU to overcome some situations during the service life of a vehicle where it might be wished to eradicate a problem such as a low octane fuel being constantly used or engine wear by slightly advancing the ignition timing. the idle speed of the engine. The function can be removed by resetting the adaptive values. (value / 2) – 24
80×17-18_coil_time This is the time for the ignition coil to charge up to its specified current, as measured by the MEMS ECU. With a battery voltage of about 14V, this value should be about 2-3mS. A high value for coil charge time may indicate a problem with the ignition coil primary circuit. value * 0.002
80x19_crankshaft_position_sensor position of the crankshaft from the position sensor (CPS)
80x1A_uk4 unknown value
80x1B_uk5 unknown value
7dx01_ignition_switch status of the ignition switch true / false
7dx02_throttle_angle shows the position of the throttle disc obtained from the MEMS ECU using the throttle potentiometer. This value should change from a low value to a high value as the throttle pedal is depressed. value * 6 / 10
7dx03_uk6 unknown value
7dx04_air_fuel_ratio the current air:fuel ratio value / 10
7dx05_dtc2 diagnostic trouble code – unknown codes
7dx06_lambda_voltage This shows the voltage across the oxygen sensor as read by the MEMS ECU. Once the engine is fully warm, during most idle and driving conditions, this voltage will switch rapidly between a value between 0.0v-0.2v to a value between 0.7v and 1.0v. The sensor detects the presence or absence of oxygen in the exhaust gas. When the exhaust gas has oxygen present the ECU will read a low voltage. value * 5
7dx07_lambda_sensor_frequency not used by the ECU, value reads 255
7dx08_lambda_sensor_dutycycle not used by the ECU, value reads 255
7dx09_lambda_sensor_status ECU O2 circuit status, 1 active
7dx0A_closed_loop This shows whether the fuelling is being controlled using feedback from the oxygen sensors. A displayed value of 1 indicates that closed loop fuelling is active, a displayed value of 0 indicates fuelling open loop. On a fully warm vehicle, Loop Status should indicate closed loop under most driving and idling conditions.
7dx0B_long_term_fuel_trim long term fuel trim (LTFT) displays ECU value to adjust fuelling. value of 128 = 0 value – 128
7dx0C_short_term_fuel_trim short term fuel trim (STFT) displays ECU value to adjust fuelling
7dx0D_carbon_canister_dutycycle not used by ECU, value reads 0
7dx0E_dtc3 diagnostic trouble code – unknown codes
7dx0F_idle_base_pos This is the number of steps from 0 which the ECU will use as guide for starting idle speed control during engine warm up. The value will start at quite a high value (>100 steps) on a very cold engine and fall to < 50 steps on a fully warm engine. A high value on a fully warm engine or a low value on a cold engine will cause poor idle speed control. Idle run line position is calculated by the ECU using the engine coolant temperature sensor.
7dx10_uk7 unknown value
7dx11_dtc4 diagnostic trouble code – unknown codes
7dx12_ignition_advance2 ignition advance value – 48
7dx13_idle_speed_offset This is the current difference between the target idle speed set by the MEMS ECU and the actual engine speed. A value of more than 100 RPM indicates that the ECU is not in control of the idle speed. This indicates a possible fault condition. A quick addition of this value and the current engine RPM will also tell what the value is of the ECU’s target Idle Speed.
7dx14_idle_error2 idle error
7dx14-15_uk10 unknown value
7dx16_dtc5 diagnostic trouble code – unknown codes
7dx17_uk11 unknown value
7dx18_uk12 unknown value
7dx19_uk13 unknown value
7dx1A_uk14 unknown value
7dx1B_uk15 unknown value
7dx1C_uk16 unknown value
7dx1D_uk17 unknown value
7dx1E_uk18 unknown value
7dx1F_jack_count On systems using a throttle body where the idle air is controlled by a stepper motor which directly acts on the throttle disk (normally metal inlet manifold), the count indicates the number of times the ECU has had to re-learn the relationship between the stepper position and the throttle position. If this count is high or increments each time the ignition is turned off, then there may be a problem with the stepper motor, throttle cable adjustment or the throttle pot. On systems using a plastic throttle body/manifold, the count is a warning that the MEMS ECU has never seen the throttle fully closed. The count is increased for each journey with no closed throttle, indicating a throttle adjustment problem.
0x7d_raw hexadecimal response from the ECU for command 0x7D
0x80_raw hexadecimal response from the ECU for command 0x80
engine_running engine is running true / false
warming engine is warming up to operating temperature true / false
at_operating_temp engine is at operating temperature true / false
engine_idle engine is idle true / false
idle_fault hot or cold idle speed or idle offset is outside expected parameters true / false
idle_speed_fault cold idle speed is outside expected parameters true / false
idle_error_fault idle offset is outside expected parameters true / false
idle_hot_fault hot idle speed is outside expected parameters true / false
cruising rpm is stable but not idle; engine is cruising (differentiates from idle) true / false
closed_loop ECU is operating in closed loop (using lambda to determine air:fuel ratio) true / false
closed_loop_expected expecting the ECU to be in closed loop true / false
closed_loop_fault closed loop fault true / false
throttle_active the throttle pedal is depressed true / false
map_fault MAP readings is outside expected parameters true / false
vacuum_fault MAP and Air:Fuel ratio are outside expected parameters indicating a possible vacuum pipe fault true / false
iac_fault IAC position invalid if the idle offset exceeds the max error, yet the IAC Position remains at 0 true / false
iac_range_fault IAC readings outside expected parameters true / false
iac_jack_fault high jack count indicating possible problem with the stepper motor, throttle cable adjustment or the throttle pot true / false
o2_system_fault detected a potential o2 system fault true / false
lambda_range_fault lambda sensor readings are outside expected parameters true / false
lambda_oscillation_fault lambda sensor not oscillating as expected true / false
thermostat_fault coolant temperature changes over time indicate thermostat fault (could also be a CPS fault) true / false
crankshaft_sensor_fault crankshaft position sensor (CPS) reading is outside expected parameters true / false
coil_fault coil is outside expected parameters true / false

MemsFCR <-> ECU Initialisation Sequence

sequenceDiagram
autonumber
Note over MemsFCR, ECU: Initialisation
MemsFCR ->>+ ECU: Connect
ECU ->>- MemsFCR: Connected
MemsFCR ->>+ ECU: 0xCA
Note right of ECU: Initialise Command A 
ECU ->>- MemsFCR: 0xCA
MemsFCR ->>+ ECU: 0x75
Note right of ECU: Initialise Command B
ECU ->>- MemsFCR: 0x75 
MemsFCR ->>+ ECU: 0xF4
Note right of ECU: Heartbeat
ECU ->>- MemsFCR: 0xF4 
MemsFCR ->>+ ECU: 0xD0
Note right of ECU: ECU ID
ECU ->>- MemsFCR: 0x0D 0x99 0x99 0x99 0x99 
Note over MemsFCR, ECU: Request Dataframe Loop
loop Every second
activate MemsFCR
MemsFCR ->>+ ECU: 0x7D
Note right of ECU: Dataframe 0x7D
ECU ->>- MemsFCR: 0x7D XX XX XX.. XX
MemsFCR ->>+ ECU: 0x80
Note right of ECU: Dataframe 0x80
ECU ->>- MemsFCR: 0x80 XX XX XX.. XX
deactivate MemsFCR
end

ECU Faults

graph LR
FaultCodesDTC0("80x0d-0e_fault_codes (0x0d byte)") --> |& b00000001|CTSFault(["CTS_fault = true"])
FaultCodesDTC0 --> |& b00000010|ATSFault(["ATS_fault = true"])
FaultCodesDTC1("80x0d-0e_fault_codes (0x0e byte)") --> |& b00000010|FuelPumpFault(["fuel_pump_circuit_fault = true"])
FaultCodesDTC1 --> |& b01000000|TPSFault(["TPS_circuit_fault = true"])

Operational Status

Is Engine Running?

If we have revs, the engine must be running 🙂
The engine start time is recorded to determine when the operating temperature is expected to be reached and when the O2 system should activate.

flowchart LR
Engine("80x01-02_engine-rpm (RPM) > 0") --> EngineRunning(["engine_running = true"])
EngineRunning --> EngineStartTime(["record engine_start_time"])

Is Engine at Operating Temperature?

Used in the diagnostics to determine if the engine has reached the operating temperature.

flowchart LR
Temp{{"80x03_coolant_temp (CTS) > 80°C"}} -- "false" ---> EngineWarming(["engine_warming = true"])
Temp -- "true" ---> EngineWarm(["engine_at_operating_temp = true"])

Is Engine at Idle?

RPM can’t be used as a reliable indicator of idle so the throttle is used to determine whether the engine is at idle.

flowchart LR
Running(engine_running) --> Metric
Metric("7dx02_throttle_angle * 6 / 10 <= 14&deg") --> Result([engine_idle = true])

Is Throttle Active?

If the RPM is above any cold start value OR the throttle is depressed (14° is pretty conservative) then the throttle is active.

flowchart LR
Engine("80x01-02_engine-rpm (RPM)> 1300") --> ThrottleActive(["throttle_active = true"])
Throttle("7dx02_throttle_angle * 6 / 10 > 14°") --> ThrottleActive

Is Closed Loop Mode Active?

The ECU controls the air : fuel mix based on the readings from the primary sensors, lambda, MAP and temperature.
If the ECU determines these systems are working correctly it will enter closed loop mode. The car is unlikely to pass the emissions tests if it cannot enter closed loop mode.

flowchart LR
Temp("7dx0A_closed_loop > 0") --> ClosedLoop(["closed_loop = true"])

Operational Faults

Is Battery Voltage too low?

The battery voltage is important for the sensors to provide correct values. A low battery can be the cause of a number of phantom faults.ß

flowchart LR
Metric("80x08_battery_voltage < 13V") --> Result(["battery_low = true"])

Is Coil faulty?

The time for the ignition coil to charge up to its specified current, as measured by the MEMS ECU. With a battery voltage of about 14V, this value should be about 2-3mS.
A high value for coil charge time may indicate a problem with the ignition coil primary circuit. A failing CAS sensor can also cause the coil time to increase.

flowchart LR
Running("engine_running") --> BatteryCheck
BatteryCheck("battery_low = false") --> Metric
Metric("80x17-18_coil_time * 0.0002 > 4ms") --> Result(["coil_fault = true"])

Is MAP too high?

The MAP sensor should be under 45kPA (ideally 35kPA) when the engine is at idle. A high value indicates a vacuum fault.

flowchart LR
Running("engine_idle") --> Metric
Metric("80x07_map_kpa > 45") --> Result(["map_fault = true"])

Engine Idle fault?

This Idle Base Position is the number of steps from 0 which the ECU will use as guide for starting idle speed control during engine warm up.
The value will start at quite a high value (>100 steps) on a very cold engine and fall to < 50 steps on a fully warm engine.
A high value on a fully warm engine or a low value on a cold engine will cause poor idle speed control.
Idle position is calculated by the ECU using the engine coolant temperature sensor.

flowchart LR
Running("engine_idle = true") --> EngineAtTemp{{"engine_at_operating_temp"}}
EngineAtTemp -- "true" ---> MetricHot
EngineAtTemp -- "false" ---> MetricCold
MetricHot("7dx0F_idle_base_pos > 55") --> Result(["idle_fault = true"])
MetricCold("7dx0F_idle_base_pos < 45") --> Result(["idle_fault = true"])

Engine Hot Idle fault?

The Hot Idle is the number of IACV steps from fully closed (0) which the ECU has learned as the correct position to maintain the target idle speed with a fully warmed up engine.
If this value is outside the range 10 – 50 steps, then this is an indication of a possible fault condition or poor adjustment.

flowchart LR
Running("engine_idle") --> PreCheck
PreCheck("engine_at_operating_temp = true") --> EngineAtTemp
EngineAtTemp ---> MetricLow
EngineAtTemp ---> MetricHigh
MetricLow("80x10_idle_hot < 10") ---> Result(["idle_hot_fault = true"])
MetricHigh("80x10_idle_hot > 55") ---> Result(["idle_hot_fault = true"])

Idle Air Control (IAC) Fault?

The stepper motor adjusts the idle air control valve (IACV) and is used to control engine idle speed and air flow from cold start up
A high number of steps indicates that the ECU is attempting to close the stepper or reduce the airflow a low number would indicate the inability to increase airflow

The position of the IACV stepper motor as calculated by the ECU. The ECU has no method of actually measuring this position but instead works it out by remembering how may steps it has moved the stepper since the last time the ignition was switched off. If a stepper motor fault exists, this number will be incorrect. This value will normally be changing during idle condition as the ECU makes minor changes to the idle speed. A value of 0 during idle conditions indicates a fault condition or poor adjustment, as does a very high value.

flowchart LR 
Running("engine_idle") --> PreCheck
PreCheck("7dx13_idle_speed_offset > 50") --> Metric
Metric("80x12_iac_position > 0") --> Result(["iac_fault = true"])

Vacuum Pipe Fault?

The bane of all Mini Spi owners, the vacuum pipe system to read the manifold absolute pressure is fragile and prone to split or disconnected pipes.
The MAP values are essential for the ECU to determine the load on the engine and have a significant impact on performance and even basic idling.
When the engine is at idle, the MAP is expected to be less than 45kPa, in fact it should be around 35kPA. Higher than this will be due to a vacuum fault.

flowchart LR
Running("engine_idle") --> Metric
Metric("80x07_map_kpa > 45") --> Result(["vacuum_fault = true"])

Is Jack Count too high?

On systems using a throttle body where the idle air is controlled by a stepper motor which directly acts on the throttle disk (normally metal inlet manifold), the count indicates the number of times the ECU has had to re-learn the relationship between the stepper position and the throttle position. If this count is high or increments each time the ignition is turned off, then there may be a problem with the stepper motor, throttle cable adjustment or the throttle pot. On systems using a plastic throttle body/manifold, the count is a warning that the MEMS ECU has never seen the throttle fully closed. The count is increased for each journey with no closed throttle, indicating a throttle adjustment problem.
This "fault" is more of an indication that the jack count is higher than expected and is worth monitoring this value.

flowchart LR
Running("engine_idle") --> Metric
Metric("7dx1F_jack_count > 50") --> Result(["iac_jack_fault = true"])

Is Crankshaft Sensor (CPS/CAS) faulty?

The crankshaft sensor is used to determine the position of the engine so the ECU can manage the timing of the injection of fuel and ignition.
A failing CAS will show as 0 entries or high spikes in the graph trace. When the ECU fails to get a CAS reading, it will suspend firing the ignitions (this will show as a high coil time)

flowchart LR
Metric("80x19_crankshaft_position_sensor is 0") --> Result(["crankshaft_sensor_fault = true"])

Are Lambda readings out of range?

When the engine is running the lambda sensor voltage is expected to oscillate low to high rapidly.
If the readings are above 900mV or below 10mV this indicates a failing lambda sensor.

flowchart LR
Running("engine_running") --> MetricLow
Running ---> MetricHigh
MetricLow("7dx06_lambda_voltage < 10") ---> Result(["lambda_range_fault = true"])
MetricHigh("7dx06_lambda_voltage > 900") ---> Result(["lambda_range_fault = true"])

Is Lambda Sensor faulty?

When the engine is started the lambda sensor goes through a warm-up cycle.
The lambda has a build in heater and the ECU activates this via a relay.
The lambda should start oscillating from low to high volts after around 90s.
A failure in this activity will cause the ECU to change the lambda status to 0 and run in open loop mode. This is a fault condition.

flowchart LR
Running("engine_running") --> PreCheck
PreCheck("time since engine_start_time > 90s") --> IsOscillating
subgraph Is Lambda Sensor oscillating?
    IsOscillating("standard deviation of 7dx06_lambda_voltage < 100") --> Result(["lambda_oscillation_fault = true"])
end
Result --> Metric
Metric{{"lambda_oscillation_fault is false"}} --> LambdaResult(["lambda_fault = true"])

Is O2 System faulty?

flowchart LR
Metric("7dx09_lambda_sensor_status = 0") --> Result(["o2_system_fault = true"])

Is Lambda Sensor oscillating?

The lambda sensor should oscillate low to high voltage at a high frequency.
A sample is used for calculating the standard deviation, which is used to determine whether the lambda is working as expected.

flowchart LR
Running("engine_running") --> Metric
Metric("standard deviation of 7dx06_lambda_voltage < 100") --> Result(["lambda_oscillation_fault = true"])

Is Thermostat faulty?

The coolant temperature is expected to rise at a rate of around 11s per degree.
If the coolant temperature hasn’t reached operating temperature (80°C) by that time, this indicates the thermostat could be faulty.

flowchart LR
Running("engine_running") --> Step1
subgraph Determine if the coolant temperature has reached operating temp as expected
Step1("degrees_to_warm = 80°C - 80x03_coolant_temp") --> Step2
Step2("expected_time_to_warm = 11s * degrees_to_warm") --> Step3
Step3("current_time > expected_time_to_warm") --> Step4
end
Step4("80x03_coolant_temp < 80°C") --> Result(["thermostat_fault = true"])

Is Idle Speed faulty?

Idle speed deviation indicates how far away the IAC is from the idle target
Idle base position indicates the target for IAC position
A mean value of more than 100 indicates that the ECU is not in control of the idle speed and indicates a possible fault condition.

flowchart LR
Running("engine_running") --> Metric
Metric("mean of 7dx0F_idle_base_pos > 100") --> Result(["idle_speed_fault = true"])