• Hello Guest, welcome to the initial stages of our new platform!
    You can find some additional information about where we are in the process of migrating the board and setting up our new software here

    Thank you for being a part of our community!

Fuel/Spark tuning for LH 2.4/EZK with TunerPro!

No. The "rom version" is the last three digits of the number on the side of the ECU.

If your ECU part number is 0 280 000 9xx, you can use any 9xx software. 928, 926, 937, 967, anything in the 900's will work. It's all interchangeable.

Anyone with a 900 series ECU can load the software included in the package in the OP. It just happens to be the 93x series of software.

XDFs expect the parameters in them to be in exactly the same place every time. It happens that the 93x series of ECUs had their data in the exact same place across multiple versions.

If you try to open a BIN file that has it's data in different locations (for example a 928 or 967 BIN) the data will appear all mangled. TunerPro doesn't actually understand that the data is incorrect, it displays it anyway.

EDIT: nevermind, thanks gross polluter
Thank you for posting though, that adds to the big picture helping me further understand it and I appreciate it.

I'll definitely be giving the 935 bin a whirl Monday night... :oogle:
 
If you try to open a BIN file that has it's data in different locations (for example a 928 or 967 BIN) the data will appear all mangled. TunerPro doesn't actually understand that the data is incorrect, it displays it anyway.

I haven't personally taken a look at this yet, but do the XDF's provided thus far calculate the raw data into a user value, or is the data displayed a raw 8 bit (or 16 bit) value in Tuner Pro?
 
Beepee, is the TLAO chip(and thus, bin) you have for a 93x ecu, or just 9xx ecu?

The TLAO chip is based on 93x software.

All 900 series software and ECUs are interchangeable. You can load a 927 bin on a 932, or vice versa. It works. There may be an odd version incompatibility, but the 93x software seems to work for everyone who's tried it, which includes everyone who has bought a chip from TLAO. That's why I picked the 93x software; it's already proven.

That out of the way, I don't want to talk about TLAO's chips anymore in this thread. Period. If you want a proven tune, send him a PM. If you have questions about how things are done in his chips, don't ask. It's his investment. If it's really bugging you that bad, buy em!

And if you DO get one of TLAO's chips and start openly spreading bits of it around, I would at the very least expect a :poo: followed by a :banned:

Now that that is out of the way, here's a picture of some kittens:
kitties.jpg
 
I haven't personally taken a look at this yet, but do the XDF's provided thus far calculate the raw data into a user value, or is the data displayed a raw 8 bit (or 16 bit) value in Tuner Pro?

Yes, and no. TunerPro doesn't have a provision for LH2.4 style tables, so I have tried to add calculated tables for the more important things. Download it and take a look.

Here's what I have to do in the XDF to make ONE axis work correctly. I do it in TextPad because it's wayyy to much work in TunerPro's UI otherwise.

HTML:
    <XDFAXIS id="z">
      <EMBEDDEDDATA mmedtypeflags="0x04" mmedaddress="0x3B4D" mmedelementsizebits="8" mmedrowcount="1" mmedcolcount="16" />
      <units>rpm</units>
      <decimalpl>2</decimalpl>
      <min>0.000000</min>
      <max>7500.000000</max>
      <outputtype>2</outputtype>
      <MATH equation="X">
        <VAR id="X" />
      </MATH>
      <MATH row="1" col="1" equation="MROUND(60*EXP(0.0215834714*(A+B+C+D+E+F+G+H+I+J+K+L+M+N+O+X));25)">
        <VAR id="A" type="address" address="0x3B5C" />
        <VAR id="B" type="address" address="0x3B5B" />
        <VAR id="C" type="address" address="0x3B5A" />
        <VAR id="D" type="address" address="0x3B59" />
        <VAR id="E" type="address" address="0x3B58" />
        <VAR id="F" type="address" address="0x3B57" />
        <VAR id="G" type="address" address="0x3B56" />
        <VAR id="H" type="address" address="0x3B55" />
        <VAR id="I" type="address" address="0x3B54" />
        <VAR id="J" type="address" address="0x3B53" />
        <VAR id="K" type="address" address="0x3B52" />
        <VAR id="L" type="address" address="0x3B51" />
        <VAR id="M" type="address" address="0x3B50" />
        <VAR id="N" type="address" address="0x3B4F" />
        <VAR id="O" type="address" address="0x3B4E" />
        <VAR id="X" />
      </MATH>
      <MATH row="1" col="2" equation="MROUND(60*EXP(0.0215834714*(A+B+C+D+E+F+G+H+I+J+K+L+M+N+X));25)">
        <VAR id="A" type="address" address="0x3B5C" />
        <VAR id="B" type="address" address="0x3B5B" />
        <VAR id="C" type="address" address="0x3B5A" />
        <VAR id="D" type="address" address="0x3B59" />
        <VAR id="E" type="address" address="0x3B58" />
        <VAR id="F" type="address" address="0x3B57" />
        <VAR id="G" type="address" address="0x3B56" />
        <VAR id="H" type="address" address="0x3B55" />
        <VAR id="I" type="address" address="0x3B54" />
        <VAR id="J" type="address" address="0x3B53" />
        <VAR id="K" type="address" address="0x3B52" />
        <VAR id="L" type="address" address="0x3B51" />
        <VAR id="M" type="address" address="0x3B50" />
        <VAR id="N" type="address" address="0x3B4F" />
        <VAR id="X" />
      </MATH>
      <MATH row="1" col="3" equation="MROUND(60*EXP(0.0215834714*(A+B+C+D+E+F+G+H+I+J+K+L+M+X));25)">
        <VAR id="A" type="address" address="0x3B5C" />
        <VAR id="B" type="address" address="0x3B5B" />
        <VAR id="C" type="address" address="0x3B5A" />
        <VAR id="D" type="address" address="0x3B59" />
        <VAR id="E" type="address" address="0x3B58" />
        <VAR id="F" type="address" address="0x3B57" />
        <VAR id="G" type="address" address="0x3B56" />
        <VAR id="H" type="address" address="0x3B55" />
        <VAR id="I" type="address" address="0x3B54" />
        <VAR id="J" type="address" address="0x3B53" />
        <VAR id="K" type="address" address="0x3B52" />
        <VAR id="L" type="address" address="0x3B51" />
        <VAR id="M" type="address" address="0x3B50" />
        <VAR id="X" />
      </MATH>
      <MATH row="1" col="4" equation="MROUND(60*EXP(0.0215834714*(A+B+C+D+E+F+G+H+I+J+K+L+X));25)">
        <VAR id="A" type="address" address="0x3B5C" />
        <VAR id="B" type="address" address="0x3B5B" />
        <VAR id="C" type="address" address="0x3B5A" />
        <VAR id="D" type="address" address="0x3B59" />
        <VAR id="E" type="address" address="0x3B58" />
        <VAR id="F" type="address" address="0x3B57" />
        <VAR id="G" type="address" address="0x3B56" />
        <VAR id="H" type="address" address="0x3B55" />
        <VAR id="I" type="address" address="0x3B54" />
        <VAR id="J" type="address" address="0x3B53" />
        <VAR id="K" type="address" address="0x3B52" />
        <VAR id="L" type="address" address="0x3B51" />
        <VAR id="X" />
      </MATH>
      <MATH row="1" col="5" equation="MROUND(60*EXP(0.0215834714*(A+B+C+D+E+F+G+H+I+J+K+X));25)">
        <VAR id="A" type="address" address="0x3B5C" />
        <VAR id="B" type="address" address="0x3B5B" />
        <VAR id="C" type="address" address="0x3B5A" />
        <VAR id="D" type="address" address="0x3B59" />
        <VAR id="E" type="address" address="0x3B58" />
        <VAR id="F" type="address" address="0x3B57" />
        <VAR id="G" type="address" address="0x3B56" />
        <VAR id="H" type="address" address="0x3B55" />
        <VAR id="I" type="address" address="0x3B54" />
        <VAR id="J" type="address" address="0x3B53" />
        <VAR id="K" type="address" address="0x3B52" />
        <VAR id="X" />
      </MATH>
      <MATH row="1" col="6" equation="MROUND(60*EXP(0.0215834714*(A+B+C+D+E+F+G+H+I+J+X));25)">
        <VAR id="A" type="address" address="0x3B5C" />
        <VAR id="B" type="address" address="0x3B5B" />
        <VAR id="C" type="address" address="0x3B5A" />
        <VAR id="D" type="address" address="0x3B59" />
        <VAR id="E" type="address" address="0x3B58" />
        <VAR id="F" type="address" address="0x3B57" />
        <VAR id="G" type="address" address="0x3B56" />
        <VAR id="H" type="address" address="0x3B55" />
        <VAR id="I" type="address" address="0x3B54" />
        <VAR id="J" type="address" address="0x3B53" />
        <VAR id="X" />
      </MATH>
      <MATH row="1" col="7" equation="MROUND(60*EXP(0.0215834714*(A+B+C+D+E+F+G+H+I+X));25)">
        <VAR id="A" type="address" address="0x3B5C" />
        <VAR id="B" type="address" address="0x3B5B" />
        <VAR id="C" type="address" address="0x3B5A" />
        <VAR id="D" type="address" address="0x3B59" />
        <VAR id="E" type="address" address="0x3B58" />
        <VAR id="F" type="address" address="0x3B57" />
        <VAR id="G" type="address" address="0x3B56" />
        <VAR id="H" type="address" address="0x3B55" />
        <VAR id="I" type="address" address="0x3B54" />
        <VAR id="X" />
      </MATH>
      <MATH row="1" col="8" equation="MROUND(60*EXP(0.0215834714*(A+B+C+D+E+F+G+H+X));25)">
        <VAR id="A" type="address" address="0x3B5C" />
        <VAR id="B" type="address" address="0x3B5B" />
        <VAR id="C" type="address" address="0x3B5A" />
        <VAR id="D" type="address" address="0x3B59" />
        <VAR id="E" type="address" address="0x3B58" />
        <VAR id="F" type="address" address="0x3B57" />
        <VAR id="G" type="address" address="0x3B56" />
        <VAR id="H" type="address" address="0x3B55" />
        <VAR id="X" />
      </MATH>
      <MATH row="1" col="9" equation="MROUND(60*EXP(0.0215834714*(A+B+C+D+E+F+G+X));25)">
        <VAR id="A" type="address" address="0x3B5C" />
        <VAR id="B" type="address" address="0x3B5B" />
        <VAR id="C" type="address" address="0x3B5A" />
        <VAR id="D" type="address" address="0x3B59" />
        <VAR id="E" type="address" address="0x3B58" />
        <VAR id="F" type="address" address="0x3B57" />
        <VAR id="G" type="address" address="0x3B56" />
        <VAR id="X" />
      </MATH>
      <MATH row="1" col="10" equation="MROUND(60*EXP(0.0215834714*(A+B+C+D+E+F+X));25)">
        <VAR id="A" type="address" address="0x3B5C" />
        <VAR id="B" type="address" address="0x3B5B" />
        <VAR id="C" type="address" address="0x3B5A" />
        <VAR id="D" type="address" address="0x3B59" />
        <VAR id="E" type="address" address="0x3B58" />
        <VAR id="F" type="address" address="0x3B57" />
        <VAR id="X" />
      </MATH>
      <MATH row="1" col="11" equation="MROUND(60*EXP(0.0215834714*(A+B+C+D+E+X));25)">
        <VAR id="A" type="address" address="0x3B5C" />
        <VAR id="B" type="address" address="0x3B5B" />
        <VAR id="C" type="address" address="0x3B5A" />
        <VAR id="D" type="address" address="0x3B59" />
        <VAR id="E" type="address" address="0x3B58" />
        <VAR id="X" />
      </MATH>
      <MATH row="1" col="12" equation="MROUND(60*EXP(0.0215834714*(A+B+C+D+X));25)">
        <VAR id="A" type="address" address="0x3B5C" />
        <VAR id="B" type="address" address="0x3B5B" />
        <VAR id="C" type="address" address="0x3B5A" />
        <VAR id="D" type="address" address="0x3B59" />
        <VAR id="X" />
      </MATH>
      <MATH row="1" col="13" equation="MROUND(60*EXP(0.0215834714*(A+B+C+X));25)">
        <VAR id="A" type="address" address="0x3B5C" />
        <VAR id="B" type="address" address="0x3B5B" />
        <VAR id="C" type="address" address="0x3B5A" />
        <VAR id="X" />
      </MATH>
      <MATH row="1" col="14" equation="MROUND(60*EXP(0.0215834714*(A+B+X));25)">
        <VAR id="A" type="address" address="0x3B5C" />
        <VAR id="B" type="address" address="0x3B5B" />
        <VAR id="X" />
      </MATH>
      <MATH row="1" col="15" equation="MROUND(60*EXP(0.0215834714*(A+X));25)">
        <VAR id="A" type="address" address="0x3B5C" />
        <VAR id="X" />
      </MATH>
      <MATH row="1" col="16" equation="MROUND(60*EXP(0.0215834714*X);25)">
        <VAR id="X" />
      </MATH>
    </XDFAXIS>

In short, it sucks. But, please take a look, I enjoy feedback! I'm out for the night, early meeting tomorrow :-( Later!
 
Btw, most 9xx ECU's will run any 9xx software but not all. There are exceptions minor exceptions. I don't remember now which doesn't work, but I've tried just out curiosity different bins and there were at least one bin that caused the cel to blink and some relay to click with no start, and one that fire up cel and set code 1-2-3 (bad temp signal) permanently.
I guess there are different ADC or I/O inputs on some versions which will cause funny things

About 93x - it is good to stick with one version, when it is completely known it could be mapped to both turbo and N/A, and both 8v and 16v
 
Guess I'll have to take a look at it and see what's going on. I have a few tricks up my sleeve from playing with HD6303 and HC11 based ECU's I'd love to try and apply to LH ecu's.

Perhaps get a thread going soon from a hardware specific standpoint?
 
There is nothing really special about hardware except two "unknown" chips, which are already known to me to some degree - the hybrid one and one marked 30047. I have the hybrid schematic recovered and I can explain what it does in a few words:
1. It's provides reference voltages to the CPU ADC's
2. It is hardware watchdog - The CPU have to continously toggle a pin, otherwise it get's reset in a few ms.
3. It converts 0-1V signal from O2 sensor to 2 bits representing (but using only 3 bit combinations of them) lean/stoich/rich condition. It does it running the signal via few comparators.
4. It have also Tx/Rx to K-Line converter inside. When I talk K-Line I mean the following:
UART Tx/Rx signals allows simultaneous communication between both sides. K-Line, as I call it, uses only one line for communication, which is hold at some voltage level (6-7-8V) and only one at a time can transmit data, by pulling this line to ground. The transmitter, also sees the echo of the data it has just sent on the wire. This "K-line" interface is the DLC connector pin, and it used for diagnostic via led and button thingie in the engine bay, and on later cars for OBD (The OBD on LH is very limited, useless and a bit out-of-standard, it was made just before this thing was standartized). The nice thing is that due to hardware specifics of LH cpu it allows quite fast baud rate - 187.5 Kbps, which effectively becomes a bit slower because each side have to eat their own echo each time it transmits data, and only one side can talk at a time.
5. The most other pins are just level shifters, translating digital signals from the CPU 5V world, to the outside 12V world, and vice versa.
 
Bummer about #3. In other ECU's I've played with all of the ADC's are 0-5v so I could feed the ecu with a wideband signal and modify the ASM to target 2.5v instead of cycle around .5v. In an ecu like LH 2.4 that applies fuel trims to open loop, this would have been a neat feature to try and implement.

I think I have an LH2.4 ecu laying around at the other house. Next time I'm down there I'll grab it and start taking a look at the hardware.
 
Bummer about #3. In other ECU's I've played with all of the ADC's are 0-5v so I could feed the ecu with a wideband signal and modify the ASM to target 2.5v instead of cycle around .5v. In an ecu like LH 2.4 that applies fuel trims to open loop, this would have been a neat feature to try and implement.

I think I have an LH2.4 ecu laying around at the other house. Next time I'm down there I'll grab it and start taking a look at the hardware.

LH have an "spare" ADC channel, used for AMM pot, even if the car runs AMM without pot.
If we somehow becomes familiar enough to mess with the LH calculations, we can put wideband to that channel. I was also very frustrated about lambda signal conversion because I was already found ADC's for AMM, temp, voltage but couldn't find lambda. Then I found this 2 bit weird thing. And the bad is that some ADC's are wasted for coding plugs, when they could have do it "digitally", and used ADCs for something more clever

Btw. The AMM linearization map is not an 2D map. It is 1x256 map. When translated properly it should look like this:
maf_translate.png


I believe it is possible to use any voltage out AMM on LH 2.4, even if it is hot-film AMM.
In this case the AMM burn out function just will do nothing (Or blink a lamp :-P).
 
You guys both make me excited about the future of LH. I don't know enough about electronics to and ASM to tinker like that. But I'm ready to try!
 
Correct me if i'm wrong, but I could just get the Ostrich, wideband and go, right? A chip burner isn't really necessary until and unless i want to actually make a chip out of my results. In the mean time, i could just run right off the Ostrich. Am I missing something?

I'd like to play, i've always been a fan of keeping LH. Seems like a good way to start learning EMS in general.

you can only do one ecu at a time unless you want two ostrichi (and at $175 each, that ain't cheap)

The TLAO chip is based on 93x software.

All 900 series software and ECUs are interchangeable. You can load a 927 bin on a 932, or vice versa. It works. There may be an odd version incompatibility, but the 93x software seems to work for everyone who's tried it, which includes everyone who has bought a chip from TLAO. That's why I picked the 93x software; it's already proven.

That out of the way, I don't want to talk about TLAO's chips anymore in this thread. Period. If you want a proven tune, send him a PM. If you have questions about how things are done in his chips, don't ask. It's his investment. If it's really bugging you that bad, buy em!

And if you DO get one of TLAO's chips and start openly spreading bits of it around, I would at the very least expect a :poo: followed by a :banned:

some of that info is already out in the wild, just an fyi.

Btw, most 9xx ECU's will run any 9xx software but not all. There are exceptions minor exceptions. I don't remember now which doesn't work, but I've tried just out curiosity different bins and there were at least one bin that caused the cel to blink and some relay to click with no start, and one that fire up cel and set code 1-2-3 (bad temp signal) permanently.
I guess there are different ADC or I/O inputs on some versions which will cause funny things

About 93x - it is good to stick with one version, when it is completely known it could be mapped to both turbo and N/A, and both 8v and 16v

Might we be better off then focusing on a 'newer' version? If a ton of time is already invested in 93x, that's fine, it's just a thought though. I need to go see what CEL I set on the 940 last night.
 
some of that info is already out in the wild, just an fyi.

Yeah, I know. I have discussed it with concerned parties via PM; hopefully it will be less of an issue soon.

Might we be better off then focusing on a 'newer' version? If a ton of time is already invested in 93x, that's fine, it's just a thought though. I need to go see what CEL I set on the 940 last night.

I honestly don't know. Like I said, I used 93x because of its proven track record in chips. Maybe ipdown can shed some light on it?

The code is probably a 1-1-2, ecu fault, which would be a checksum error. I tried to clear it on mine after fixing the checksum with one of ipdown's tools, but it won't go away without a hard reset of the ECU.

As much messing about as I do, I'm seriously considering adding a toggle switch to the standby power lead to the ECU. Having that damn light on all the time is annoying. Maybe setup a diagnostic lead/button/led in the cabin as well.
 
As much messing about as I do, I'm seriously considering adding a toggle switch to the standby power lead to the ECU. Having that damn light on all the time is annoying. Maybe setup a diagnostic lead/button/led in the cabin as well.
:rofl:
 
Does this work for the '960's as well? My car is a '95 960, and have a friend who's a prominent tuner in the BMW community and is familiar with TunerPro the Bosch boxes that could help me if this would get me started. OTOH - I'm swapping in a V8 this spring, so I don't much care if I blow it up....
 
Does this work for the '960's as well?

960's were only delivered with the LH950/EZK208 (B204FT) or the LH962/EZK207/EZK219 (B230FT) boxes, earlier versions had a 578 or 597 LH.

984 or 977 have the immobilizer, you have to swap at least to the 967 bin to get them removed.
 
The 984 bin is what I'm going to use, but you need a 967 ECU to run it. It has that immobilizer function so it won't run in the 984 ECU without the special key or something. Let's see who can crack that immobilizer. Also remember that Fred guy? He said the 984 software was the best and the chips he sells for 16v turbo use the 984 bin, that's why you have to use the 967 ecu if you buy those chips from him.

The reason people sell the 937 turbo bins is they will run in any 9xx turbo ECU. My plan is to use the 984 bin in my 967 ECU for my 16v 2.5L turbo setup one of these days it be all together.


If I want to use the 967 bin, I can run that in my 967 ECU. Sure you can run the 967 software in the 984 ECU, but susposedly the 984 software is better so you should be running the 984 software in the 967 ECU. This has to do with the LH2.4.4 flavoring I believe.
 
Last edited:
If I want to use the 967 bin, I can run that in my 967 ECU. Sure you can run the 967 software in the 984 ECU, but susposedly the 984 software is better so you should be running the 984 software in the 967 ECU. This has to do with the LH2.4.4 flavoring I believe.

That's new to me, but good to know. The point is, we can't get this 967 ECU here in Europe, never seen one, never found one on the junk yards. The only reason for me to believe that this ominous 967 box is really existing is the fact that i have a 967 bin which i use to tune my own files :)

So we use the latest 967 bin without immobilizer in any 9xx boxes. Does anybody has a 967 box for sale :-D ?
 
Back
Top