Hello all,
I’ve had a go at implementing No-Lift-Shift on my MED9.1 and would really appreciate your advice and comments on my approach.
MED9.1
Audi S3 8P
2.0 TFSI 265bhp
MY 2008
UK spec
There is a lot of information about this in the ME7 NLS threads and discussions. As I understand it, in the ME7 posts NLS is achieved by cutting the ignition. Basically ignition cut-off is implemented by setting the dwell time
(tsrldyn) to zero. This results in no spark and thus no combustion. Fuelling does however continue and when combustion resumes, unburnt fuel in the exhaust system is ignited – pop!
ME7 NLS links Anti-lag launch and no-lift-shift secrets inside How to: Stock ECU Launch control on ME7 Launch Control & No Lift Shift new Functions 06A906032HN, Implementation of launch-control and NLS06A906032KP with NLS and antilag all needed attachedAdding anti-lag, launch control and no-lift shiftI was really interested in just No-Lift-Shift (rather than Anti Lag as well) and so I’ve gone with a bit of a different idea. Instead of ignition cut-off I’ve used fuel cut-off. I’m trying to avoid any explosions in the exhaust system as I live in a quiet neighbourhood lol
I’ve tried various things but currently the most successful approach has been to simply piggyback on Function KOEVAB. This function is used to stop injection for a number of reasons (engine stall, reverse rotation, clear flood, remote start, immobiliser etc). Any of these cause the injection pattern 255 to be used which effectively shuts off injection. Injection (and combustion) resume as soon as the cut-off condition is removed.
Some extracts from the FR below (NB, these weren’t from the MED9.1 FR but rather an Alfa Romeo ME7.3 FR which happens to be in English. Good enough to get a general understanding)
FB KOEVAB 1.20 Detailed description of function
The function Co-ordination of injection valve cutoff (KOEVAB) links the individual interventions which result in a complete
injection valve cutoff.
The system constant value activates the respective intervention. To ensure this, the system constant values must be specified
in the section PROKON.
The individual interventions are linked together by a logical OR operation; this means: if one of the interventions is active
(B ...), the value B koevab is set true. This causes the function AEVABZK to cutoff all injection valves commanded by the
respective Motronic control device.
FB AEVABZK 1.20 Detailed description of function
The function transmits the injection valve cutoff pattern, evz aus, via the RAM cell evz austot to the function ACIFI on
non-EGAS systems. The fuel cutoff itself is performed in function ACIFI.
During ecu after-running, the cutoff pattern 255 is sent. (Subfunction S KL 15 OFF)
On EGAS systems (Subfunction THROTL ACT), the injection valve cutoff pattern evz aus is usually as well sent via evz austot
to the function ACIFI.
However, if monitoring functions request an injection valve cutoff via the input B evabu, then evz austot = 255 is
transmitted to the function ACIFI which is equal to a request for a complete injection cutoff.
The subfunction KOEVAB allows to implement injection valve cutoff types specific to a project, e.g. injection valve cutoff in the
event of errors by the automatic gearbox, recognized engine backward movement, engine stalling etc.
To release the diagnosis "misfire detection", the bit B evasel is generated as follows: B dmdstop (locks the misfire detection
via function AEVAB during torque interventions) is linked by means of an OR operation to the other types of injection valve
cutoff of function AEVABZK. If B evasel = true --> misfire detection is released.
I’ve put together a very simple proof of concept. If the accelerator pedal
(wped_w) is pressed more than two-thirds AND the clutch pedal
(B_kuppl) is pressed (since you are changing gear whilst keeping the throttle flat), cut off fuel. As soon as the clutch is released (or the accelerator pedal is less than two-thirds) then resume injection. In other words, just keep the throttle floored and change gear. When you dip the clutch to change, the engine revs won’t run away. I’m sure there are smarter implementations, but given the limits of my skill, this is just a basic proof of concept to see if it even works
So far, so good.
Pseudo codefunction no_lift_shift()
{
// No-Lift-Shift
if (B_kuppl && wped_w > 60%)
{
// These temporary bits are set by the other OEM injection cut-off conditions
// in FN KOEVAB. Then KOEVAB combines all the temporary bits and sets
// B_koevab = 1. Function AEVABZK checks B_koevab which results in amxevab > 0
// and in turn sets evz_austot = 255
B_temp = 1;
}
}
In my proof of concept code I jump from KOEVAB to a spare location where my new code checks
wped_w and
B_kuppl. If they don’t meet the required conditions, jump back to KOEVAB and carry on checking the other original conditions. If they are set, jump to the end of KOEVAB where cut-off conditions are activated.
Original ASM codeROM:004ED894 lbz r12, byte_7FED65
ROM:004ED898 cmpwi r12, 0
ROM:004ED89C bne loc_4ED900
ROM:004ED8A0 lbz r12, byte_7FC274
ROM:004ED8A4 clrlwi. r12, r12, 31
ROM:004ED8A8 bne loc_4ED900
ROM:004ED8AC lbz r12, byte_7FC69E
ROM:004ED8B0 rlwinm. r12, r12, 0,29,29
ROM:004ED8B4 bne loc_4ED900
ROM:004ED8B8 lbz r12, byte_7FECA8
ROM:004ED8BC cmpwi r12, 0
ROM:004ED8C0 bne loc_4ED900
ROM:004ED8C4 lbz r12, byte_7FEBBF
ROM:004ED8C8 cmpwi r12, 0
ROM:004ED8CC bne loc_4ED900
ROM:004ED8D0 lbz r12, byte_7FE86F
ROM:004ED8D4 cmpwi r12, 0
ROM:004ED8D8 bne loc_4ED900
ROM:004ED8DC lbz r12, byte_7FEC4A
ROM:004ED8E0 cmpwi r12, 0
ROM:004ED8E4 bne loc_4ED900
ROM:004ED8E8 lbz r12, byte_7FC1D4
ROM:004ED8EC clrlwi. r12, r12, 31
ROM:004ED8F0 beq loc_4ED900
ROM:004ED8F4 lbz r12, byte_7FC4AD
ROM:004ED8F8 clrlwi. r12, r12, 31
ROM:004ED8FC beq loc_4ED90C
ROM:004ED900 lbz r12, byte_7FC5D8
ROM:004ED904 ori r3, r12, 1
ROM:004ED908 b loc_4ED914
New ASM codeROM:004ED894 b sub_47C950 #jump out of KOEVAB to a spare location
ROM:004ED898 cmpwi r12, 0
ROM:004ED89C bne loc_4ED900
ROM:004ED8A0 lbz r12, byte_7FC274
ROM:004ED8A4 clrlwi. r12, r12, 31
ROM:004ED8A8 bne loc_4ED900
ROM:004ED8AC lbz r12, byte_7FC69E
ROM:004ED8B0 rlwinm. r12, r12, 0,29,29
ROM:004ED8B4 bne loc_4ED900
ROM:004ED8B8 lbz r12, byte_7FECA8
ROM:004ED8BC cmpwi r12, 0
ROM:004ED8C0 bne loc_4ED900
ROM:004ED8C4 lbz r12, byte_7FEBBF
ROM:004ED8C8 cmpwi r12, 0
ROM:004ED8CC bne loc_4ED900
ROM:004ED8D0 lbz r12, byte_7FE86F
ROM:004ED8D4 cmpwi r12, 0
ROM:004ED8D8 bne loc_4ED900
ROM:004ED8DC lbz r12, byte_7FEC4A
ROM:004ED8E0 cmpwi r12, 0
ROM:004ED8E4 bne loc_4ED900
ROM:004ED8E8 lbz r12, byte_7FC1D4
ROM:004ED8EC clrlwi. r12, r12, 31
ROM:004ED8F0 beq loc_4ED900
ROM:004ED8F4 lbz r12, byte_7FC4AD
ROM:004ED8F8 clrlwi. r12, r12, 31
ROM:004ED8FC beq loc_4ED90C
ROM:004ED900 lbz r12, byte_7FC5D8
ROM:004ED904 ori r3, r12, 1
ROM:004ED908 b loc_4ED914
ROM:0047C950 lhz r12, word_7FD690 #wped_w
ROM:0047C954 cmplwi r12, 0xAAAA
ROM:0047C958 ble loc_47C96C
ROM:0047C95C lbz r12, byte_7FEDBD #B_kuppl
ROM:0047C960 cmpwi r12, 1
ROM:0047C964 bne loc_47C96C
ROM:0047C968 b loc_4ED900 #conditions are met, jump back to end of KOEVAB where cut-off is activated
ROM:0047C96C lbz r12, byte_7FED65
ROM:0047C970 b loc_4ED898 #conditions not met, jump back to start of KOEVAB and continue