-
I'm not sure I've gotten the start tables perfect but I did at least determine without a doubt what had me chasing my tail on this one.
The "Prime Pulse Width vs. Coolant Temp" table, along with most of the others in this category are stored as 8 bit cells which are then scaled by the mask by multiplying with a floating point constant to come up with pulsewidth. For this particular table that value is 1.5625. This leaves a fairly limited range of low pulwidth values for tuning to large injectors (minimum of 1.56, and multiples thereof - 3.13, 4.69, etc). What I was doing wrong was blindly scaling the table in TunerPro, saving the table and then saving the bin and flashing. My dumb *$$ finally caught on when I was working on hot starts last night and had added 10% to the rows between 68 and 128 ect, and eehack couldn't find any differences to write. The changed cells were getting pumped back through the conversion formula and resolution was being lost. <planting forehead firmly in palm> I suppose this begs the question - is there a way to view / edit the raw hex data in TunerPro?
So assuming I won't be able to get warm starts (around 60c) perfect, I'm weeding through the disassembly to see if I can change the floating point scalar constant used in the conversion formula. Cutting it in half should give me ample resolution to fine-tune this one table.
-
You can view raw data in TunerPro, just right click on the table and select "Show raw hex".
-
Duh, can't believe I missed that. Need a bigger screen or bifocals.
I'm trying to find where the lookup value from this table is scaled by 1.5625, but don't speak much motorola. I think this is the call loading the table but it looks like it's multiplying (something) by 018f, which unless I'm using the wrong endianness doesn't equate to 1.5625. Edit: or is L018F identifying a memory location?
Code:
3758 B6 01 93 ldaA l_0193_CoolTmp_fltrd_$f0_max_$e0
375B CE 26 82 ldX #$2682
375E BD 78 12 call l_7812_lkup2d_nooff_16spc
3761 F6 01 8F ldaB L018F
3764 3D mul
3765 05 lslD
3766 24 02 bcc @32
3768 86 FF ldaA #$FF
376A CE 26 80 @32 ldX #$2680
376D BD 77 81 call l_7781_A*X->D_8x16_Mult_sub
3770 1A 83 7D F0 cmpD #$7DF0
3774 23 03 bls @33
3776 CC 7D F0 ldD #$7DF0
3779 FD 01 A1 @33 stD L01A1
377C B6 01 90 ldaA l_0190_NTPSLDT_a
377F B1 26 D9 cmpA L26D9
3782 23 05 bls @34
3784 CC 00 00 ldD #$0000
3787 20 18 jr @36
-
That is barometric correction.
18f is result from baro table lookup correction.
-
Any chance you could steer a machine code impaired hot rodder in the right direction? It's been around 10 years since I last changed a jmp to a nop, and a lot of brain cells have died since then.
I'm afraid "perfection" may require adjusting the scalar on this one unless there's something else I'm missing because I've tried all three possibilities in the 56c row.
0x02 (3.13ms) too lean
0x03 (4.69ms) starts with a bit of a stumble, think slightly lean
0x04 (6.25ms) floods when the valves have cooled
0x05 (factory calibration for 24lb injectors) floods always
Edit: After scaling the "Crank AFR vs Low Res Pulse vs Coolant Temp" table properly to the nearest hex value, it may be close enough to pass as "perfect". Will report back in the next day or so.
-
I think the parameter you are looking for is "12680 BASE BPW FOR STARTUP ,used to calc prime pulse width used with 2682" available in EEXtra.xdf
The looked up values from prime pulse tables are mutiplied first by BARO multiplier, then by this base PW to get final priming PW. I think the XDF definition for prime pulse tables should be modified to take that base pw into calculations. I'll try to update the EEX.xdf and get back to you.
-
Thanks! I spotted that in the disassembly and thought it might be what I was looking for, then had to get started grilling dinner so tuning went out the window.
Don't go out of your way unless you really want to - I can probably figure this one out from here. I've been working on this table raw so I can calc the pulsewidth by hand when I change it initially. I'm pretty sure the only row I'll need to tweak will be 58c and I'll do that in hex.
-
Actually, there is a mistake in the EEXtra.xdf. The 0x2680 is used as an immediate value, not an address. So there are actually 4 places that have this value hardcoded ( E side lines: 0x376A, 0x379B, 0x4E18, 0x54F7). In order to change the base PW you need to adjust all of those constants. I'll send you the updated xdf when I get back to my PC at home.
-
I think it's a pointer - look at the multiplier function at 7781. The disassembly calls this l_7781_A*X->D_8x16_Mult_sub
Code:
;;* CALL WITH:
;;* A Reg = 8 BIT Multiplier
;;* X Reg = Address og(f) 16 bit Muliplicand
All those calls appear to be referencing the 1st, 2nd or adder prime pulse width tables, so my intention is to scale the BPW multiplier at 2680 by 60% and restore the factory calibration data to the prime pulse width table(s). If I don't have enough resolution to fine-tune with that I can always scale it further and then increase the tables accordingly. The largest values there are 0x56.
What I'm still trying to wrap my head around is how 1.5625 factors in - is it based on cpu clock frequency maybe?
-
OK, you're right, it's a pointer.
So the program goes like this:
Code:
3789 B6 01 93 @34 ldaA l_0193_CoolTmp_fltrd_$f0_max_$e0 ; Load Coolant Temp to A
378C CE 26 91 ldX #$2691 ; Load pointer to 1st prime pulse table to X
378F BD 78 12 call l_7812_lkup2d_nooff_16spc ; Look up 1st prime pulse value from the table
3792 F6 01 8F ldaB L018F ; Load calculated Baro correction (128 - no correction)
3795 3D mul ; multiply
3796 05 lslD ; shift D left and use A (divide by 128)
3797 24 02 bcc @35 ; branch if no overflow
3799 86 FF ldaA #$FF ; if overflowed, load max prime pulse value (256)
379B CE 26 80 @35 ldX #$2680 ; load pointer to Base Prime PW
379E BD 77 81 call l_7781_A*X->D_8x16_Mult_sub ; Multiply 1st prime pulse and Base Prime PW
37A1 1A 83 7D F0 @36 cmpD #$7DF0 ; compare to 0x7DF0 (32240)
37A5 23 03 bls @37 ; branch if lower
37A7 CC 7D F0 ldD #$7DF0 ; if higher, limit the calculated 1st prime pulse to 0x7DF0 (32240)
37AA FD 01 A5 @37 stD L01A5 ; store the calculated 1st Prime Pulse
The same routine is used for 2nd and additional pulses.
The thing is that the Base Prime PW from 0x2680 is 0x6666 in most bins, and is limited in code to 0x7DF0. So when pulse multiplier from the table is >1, it will be already limited?? Something is off here.
I haven't been able to find how to convert the raw values to milliseconds yet.
It's also strange that the Baro correction is applied BEFORE multiplying the base PW, it makes little sense to scale as small values as those ( 2, 3, 4 etc...).
-
Search me...
I generally don't like putzing around with things I don't (believe) I fully EDIT: (change fully to vaguely) understand but I'm going to make an exception here as I can't imagine it can hurt anything. Notice the qualifier "believe"? If it would have been left up to me to conquer the disassembly and mapping of $EE we'd all be stuck using carburetors.
I have two bins ready to test when I get home. In one I scaled the BPW by 60% and have loaded the factory prime pulse table values. In the other I scaled it to give as much resolution as I believe is possible given the range of pulsewidths I've determined I should need. I'll be astonished if the second one starts at all, and not surprised if the first doesn't either.
EDIT2: One thing that really has me intrigued is what clocking the processors run at. The 1.5625 scalar has me confounded and I'd love to know how it was determined.
-
Well I ripped the big band-aid off first - flashed the most radical change first with BPW of 8600 / 0x2198. Cold start was great. Warm restart on par with I had yesterday after scaling the table raw by hand. I'll report back in a few days when / if I have a chance to tweak further.
-
I have some insight how to get good feedback of injector pulswidth.
When you reached operating temperature remove injectors fuse and log with eehack during cranking. You will get very good reading of injector pulswidth and see if changes you made have any effect.
-
Thanks for the suggestion - I may give it a try if all else fails resolving the 60C restart issue. Other than the scenario where the engine has been hot and left to cool 3+ hours, it's starting perfectly. I think it's close to being too lean to start at all now.
If I can't find "perfection" through trial and error I might resort to wiring the ECT sensor line to a potentiometer along with your suggestion to help find the "magic" pulsewidth.
-
I don't think I'm going to tick this one off as a victory, but it's certainly better now than I was able to get to before changing the Base Prime Pulsewidth at 0x2680 and rescaling the whole Prime Pulsewidth table.
It's very odd, I can't reproduce the sluggish start unless:
1) I get the car to temp by running (hard or for a long drive) 160F thermostat mind you
2) I let it cool without touching it for around 2 hours 40 minutes (at ~85F ambient)
For whatever reason, this gets things into the opposite of a "goldilocks zone" between 135F and 144F where it wants to "meow" to life. It's starting reliabily here now with one crank so I'm going to move on to bigger and better things, but oddly if you start it at this temp and then shut it off within 1-2 seconds it will restart eagerly (presumably because the valves have been warmed). At ECT above 144 or below 135 it seems to roar to life as it did with stock injectors. Even warmer and cooler ECTs (above 146F or below 133F) are much more forgiving of AFR at startup. You have to take a ton of fuel out to get any reaction in these ranges.
So I guess what I've learned is that for a standard displacement 5.7, stick with the smallest injectors possible. Also, don't waste your time or money with chinese knock-offs.
Moving on to finishing the performance computer for tuning WOT power now. Thanks to everyone who contributed! I'm sure there will be more setbacks along the way such as the /other/ exhaust tip cracking, "quacking" and setting off the knock sensors. Thankfully I had enough argon to weld this one up too, regardless I'm going to be sending a strongly worded email to Stainless Works. :-\