×

Sale ends todayGet 30% off any course (excluding packages)

Ends in --- --- ---

Practical Standalone Tuning: Step 3: Base Table Configuration

Watch This Course

$229 USD

-OR-
Or 8 easy payments of only $28.63 Instant access. Easy checkout. No fees. Learn more
Course Access for Life
60 day money back guarantee

Step 3: Base Table Configuration

30.59

00:00 - In our next step, we're going to go through and configure the base table so that we're going to have numbers in there that'll be sufficient to get us up and running.
00:08 Now this is a little bit of work on the RB26 given the individual throttle bodies plus boost pressure that we are dealing with here but you'll see that it's really not that tricky so let's get started.
00:20 At the moment we are on our main VE table.
00:23 We're going to make some changes here but it's also worth just going through and seeing how we can configure the options that are available.
00:30 So if we press escape you can see we've got a number of options that are currently greyed out.
00:36 There's a little bit to deal with here, we've got our main VE table 1 so this is where we're going to be doing the majority of our tuning.
00:41 We've also got a secondary load table, we're going to talk about that in a moment.
00:45 We do have the ability to have a global trim.
00:48 Let's just deal with that now, I always recommend making sure that we have this set to zero.
00:53 Nothing wrong with using it to just make an across the board change for a test but once we are deciding what we're going to do, whether the test was successful or not, we want to really apply that to our VE table, it should always be set to 0 once we're up and running.
01:10 We've also got our lambda target tables, we've got injection timing tables, fuel modifier tables etc.
01:17 Compensations as well is a big one and again we can see we've got a lot of options here that are greyed out.
01:22 We've got starting and transient and then individual cylinder trim so you can see that those are all greyed out.
01:27 So how do we select what is available here? Well if we come right down the bottom to our fuel table control and let's start with our main VE table.
01:36 So we can see we've got a number of options open here on the right hand side as to how many VE tables, which VE tables we are using.
01:44 And iin normal terms here we would have the configuration that we have set up here which is on with table 1.
01:51 Compensation tables though, let's have a look at this because this is something that we do need to understand here.
01:56 And the selections will affect our tuning.
01:59 For a start we've got our fuel engine temperature compensation table set on.
02:04 Now a lot of the compensation with a charge temperature model which we'll talk about in a second, is actually dealt with through the main fuel equation.
02:13 So this will affect whether or not we actually need an engine temp correction or at least the magnitude of the changes we will need in that table.
02:21 However you can select that to be on or off as you require.
02:25 Our next option down here is our charge temperature compensation table.
02:29 So we'll see how this works in a second.
02:33 And then we have the ability to have a fuel map compensation.
02:36 This is a compensation for manifold absolute pressure.
02:40 Typically this is a background model where double manifold pressure means double fuel and this gives us a good resolution to our fuel table because the required increase in our fuel injector pulse width for the most part is dealt with inside the background fuel model so we really would normally not need to change that.
02:57 One function that I do have here is our fuel secondary load table control.
03:02 I've turned this on and the reason we're doing this is because with the ITB setup with boost, we're going to be using throttle position on our main VE table, we're going to be using manifold pressure for the load axis on our target air/fuel ratio table and that will deal with most things and keep us tracking reasonably nicely but as we push the turbos harder and our boost levels climb we'll likely find that at high RPM and high boost pressure, we start tracking richer than our lambda target and we can compensate this using our second load table so we'll see how that works.
03:37 Also a range of other options here which I'm not going to dive into but essentially you can set up as many of these or as few as you want, depending on what you're trying to achieve.
03:47 I suggest at least starting with a very basic setup and adding these as you find them a requirement as opposed to starting with a range of compensation tables that you may or may not need and making your life a little bit more complex.
04:00 Let's press esc again and we'll come down to our trim tables here.
04:04 So again you can choose to enable or disable individual cylinder fuel trims.
04:09 I'm leaving these disabled, we don't have any way of monitoring individual cylinder fuel so there's really no advantage for me there.
04:17 Alright we'll press esc again, we've got a range of other options here but none of these are really relevant to what we need to be doing for our worked example so just enough to understand that this is how you can add or remove compensations and functionality as you require.
04:34 Let's head back up now to our main VE table and we'll have a look at the setup we've got here.
04:39 So for a start we can see we've got a conventional 3D table.
04:43 The value on the load axis here is listed as efficiency calculation in percent so in its own right this isn't overly useful and we really want to have an understanding of what that means and in the EMtron we can choose a number of parameters that will become efficiency calculation.
04:59 Let's see how we can do this, we'll go back to config, we'll go to channels and then to calculated run times and main, little bit complex but once you know where it is, it's relatively easy.
05:09 So here we can choose the parameter that will be used for our efficiency calculation which is for our fuel table.
05:15 We've got all of those options listed over here.
05:18 The most normal there would typically be manifold absolute pressure.
05:22 In this case though we are using TPS.
05:25 Another option that is actually in the default map that I started with here was TPS divided by barometric air pressure.
05:34 The aim here of course, trying to get some sort of compensation for barometric air pressure.
05:40 For simplicity, I'm just using TPS.
05:42 The next option down here is our load calculation so this is exactly the same as the load axis, this time for our ignition table and again this is pretty conventional here, we're using manifold absolute pressure..
05:54 Right now we know what those numbers mean, let's head back over to our tuning.
05:58 So while it says efficiency calculation, really what we know is that actually means it's throttle position.
06:05 And if I move my throttle we can see the trace does in fact move through those cells exactly as we'd expect so everything working pretty well how we want.
06:15 Now we can see that the values, the break points in these tables, we've got a lot of them, a lot more than we really need.
06:22 So let's start by spending a little bit of time cleaning this up and making our life a little bit easier.
06:26 Now we can do this by pressing the A key or alternatively and if you lose sight or track of the hot keys, right clicking on the tables will give us a full range of options.
06:38 Axis setup right at the top with the A key.
06:41 Let's start by working on our X axis here.
06:45 So we can actually start by clearing all, I'll show you that but alternatively you can modify what's in here.
06:52 You can directly enter a value or in this case, let's say we don't want a value at 5750 RPM, using the delete key we'll simply delete those values.
07:02 Another option we have available is to use the axis setup tools over here on the right hand side to generate our break points so let's start by clearing all of the break points out and we can set out starting value and our increment along with the number of sites that we want to generate.
07:17 In this case let's just select 18 sites, we'll click generate and that's going to give us a really simple axis break point there with values every 500 RPM.
07:27 Now that's going to be enough to get us up and running however we may want to also add a little bit of additional resolution around our idle point.
07:37 We can simply do this by using the insert key and we'll enter a value there of 1250 RPM.
07:43 We may also want to enter another one a little bit lower down, let's say we want one at 750 RPM.
07:51 That's probably going to be enough to get us up and running, it's very easy to come back and manipulate these break points at a later point in time so we don't have to have this absolutely perfect now.
08:00 If we find that we need a little bit of additional resolution at a specific point, really easy to come back and address that.
08:06 And the ECU will also allow interpolation between sites so we don't need to start from scratch.
08:11 OK that covers our RPM axis, let's go across to our throttle position or our efficiency axis.
08:17 It's really important with throttle position to understand that the airflow through the throttle body is very non linear.
08:24 And what I mean by this is we're going to see a large increase in airflow from closed throttle over the first few percent of throttle opening.
08:31 Conversely once we get up to about 70 or 80% throttle, we really don't see a dramatic change in our throttle, our airflow for the last 20 or 30% throttle opening.
08:41 So we need to factor this in when we are choosing break points and really what we want to do is have tightly packed break points down near closed throttle.
08:49 We can get a little bit more sparse with our break points as we get up towards wide open throttle and we sort of have a bit of this going on here.
08:57 We can see that the default map that I've got here, we've got 0, 1, 2.5, 5, 10, 12.5, 15% throttle, probably nothing too specifically wrong with that.
09:07 I might leave those numbers but we certainly don't need one at let's say 95% so using the delete key I can simply remove that.
09:16 We probably don't even need one at 90% throttle so what we'll do is we'll just leave our break points like we've got them there.
09:24 And probably still leave in one around 35%, what we want again is the ability to have a little bit finer control in the areas that we will be using for cruise in particular.
09:35 So again this is probably a pretty good place to start.
09:38 We've got good resolution down near closed throttle.
09:42 Slightly less resolution or more coarse resolution up near wide open throttle.
09:47 So we're not making too much work for ourselves.
09:49 Let's click OK and we can see that the ECU will pop up asking if we want to interpolate the table values based on any changes we've made so as I was saying we can add in another break point at a later point and the ECU will interpolate, I'll click yes, it's not really that relevant for us here because the next process we're going to go through here is we're going to highlight the entire table, we can do that by clicking the top left corner or alternatively we can click in the top left of the table, hold down the shift key and use our arrow keys, our cursor keys to move around.
10:22 We're going to start just by setting this entire table to an across the board value of 50%.
10:27 So it's going to be enough to get us up and running, we're going to be there or thereabouts and we'll be able to adjust this table as required.
10:34 OK so that's our first table, our volumetric efficiency table, this is where we're going to be doing the majority of our work.
10:41 Let's have a look at the other tables that coincide with this to get our fuelling correct.
10:45 And the next key one, come down to our lambda target tables.
10:48 And we'll use our lambda target 1 table.
10:52 So what we want again in this table is just some sensible values that align with what we actually may want the engine to be running.
11:01 Again, we don't need to be absolutely rock solid in this table at this point, we can come back and manipulate the numbers later once we start playing around on the dyno and seeing how the engine actually responds but the key is that our workflow is to set our lambda target table then to address the volumetric efficiency table so that we're actually achieving those lambda targets and then once our VE table is tuned, if we want to make tuning changes to our air/fuel ratio that it done back in this lambda target table.
11:29 Before we make some changes here, let's just talk about the load axis here.
11:34 So you can see I've set this to manifold absolute pressure.
11:37 The other option in the default map that I started with from EMtron, this was actually in mass airflow in grams per cylinder.
11:47 Two different ways of achieving the same result.
11:50 Really when we're talking about our air/fuel ratio targets, we are going to be varying these based on engine load so grams per cylinder, it's a perfectly acceptable way of doing this however it can be a little bit less intuitive when we're looking at a grams per cylinder value to kind of understand well is that value in boost, how much load do we really have on the engine so I've reverted there to something that's a little bit more simplistic, manifold absolute pressure.
12:15 We can also see here, if we look at our break points, we don't need these too finely spaced together, we're spanning between 40 and 250 kPa.
12:23 I've got a little bit of resolution around the 100 kPa area as well.
12:27 Alright so let's look at the numbers we've got in this table.
12:30 And for a start, we know that we're going to probably be idling around about 1000 RPM.
12:35 Given that we are running a mild cam here, it's likely that we might want to target a little bit richer than lambda one at idle to get really nice smooth idle control.
12:46 I don't want to go too rich here because this is a street car, we do need to consider fuel economy.
12:53 So let's start by setting that to 0.98 lambda, we can come back and address that at a later point.
12:58 We've got a good chunk of this table here set to lambda one so this is the cruise area that we're going to be spending a lot of time in 1500 out to 3500 RPM.
13:07 We can extend this out a little bit if you like but you can see that at higher RPM I've purposefully chosen to target a little bit richer here just for a little bit of combustion charge temperature control.
13:20 Now typically with a turbocharged engine, by the time we get up to 100 kPa atmospheric pressure, we would be targeting a little bit richer.
13:31 Generally richer than lambda one.
13:33 So what I am going to do, I will drop this a little bit here but an interesting aspect with the RB26 is that we do tend to see that at cruise we will be sitting very close often to 100 kPa.
13:48 Given that we are still at relatively low throttle openings, we are at 100 kPa potentially but we don't have a lot of airflow or load on the engine so for good economy I generally run the RB26 a little bit leaner in that area.
14:01 As we move up from there though, everything gets a little bit more conventional.
14:06 We start to target a richer air/fuel ratio as we can see here.
14:10 In this particular engine, I'm expecting to be running around about 250 kPa when we are at maximum boost.
14:19 So the targets that I've chosen there, we can see that we are starting at lower RPM where we're probably not even likely to see boost, around about 0.81 so it becomes a bit of a moot point.
14:29 Really I'm expecting to be all in by probably about 4500 to 5000 RPM so we are at 0.78 lambda in that area.
14:38 An air/fuel ratio that's a really good starting point for this type of engine and one that I've proven to be pretty reliable.
14:44 In between there we're simply going to make some changes to get us where we need to be so 150 kPa here, let's set our targets there to 0.87 and then we can probably leave the targets that we've got there at 175 kPa and above so our air/fuel ratio target table, might not be exactly where we end up running it but we're at least in the ballpark and we've got some good safe starting points.
15:14 OK we've got one more table that we need to look at under our fuel here and that is our secondary load table so as I've already discussed here, this secondary load table is allowing us to make changes once we get to high boost and we start seeing the turbos become a choke point.
15:31 So how we want to set this up is with manifold absolute pressure on our vertical axis and RPM on our horizontal axis.
15:39 So this is a modifier to our fuel so we want to start with this table set to zero and it's likely that probably up in this region here is where we're likely to start seeing the need for some negative values in there.
15:52 Just looking at the default break points we've got here, we know that we're not going to be anywhere near 300 + kPa so let's press the A key and we'll see if we can improve matters a little bit there.
16:03 So what we'll do is we'll start by clearing all of the values here and we'll set our starting point for 100kPa and our increments of 20, there are only 11 break points available for this table so we'll generate that, brings us up to a maximum value of 320.
16:17 Now we know that it's probably going to be in the 230 to 260 kPa vicinity that we need to make changes so what we can do is get our resolution a little bit tighter there so let's start by changing our 11th break point to 250 kPa, that will automatically place it in the correct position, so now we've got 240, 250, 260, we can even get a little bit finer than that if we want and go maybe 255 kPa.
16:45 And maybe we will add 270 kPa, again these don't need to be perfect, we can come back and modify these at a later point.
16:52 Again if the ECU asks us if we want to interpolate, obviously we've got nothing to interpolate so we can click no there.
16:59 So that's dealt with our fuel table, we've got some base values in there, we should be good to get up and running, we've got an understanding of the 3 tables and their interaction.
17:08 Let's have a quick look though before we move on at our compensations.
17:12 And we'll come down to our engine temperature compensation, I've already talked about this, we can't really adjust this as yet, we need to see what the engine wants but it is really important to make sure before we begin our tuning that we have this table set to zero in the area that we're actually expecting the engine temperature to be during normal operation.
17:33 If there's trim numbers in here or adjustments in here, it's going to end up affecting our tuning and we can end up wasting a lot of time chasing our tail, wondering why the fuelling is changing.
17:43 We've also got our charge temperature estimate table so let's bring that up and have a look at it.
17:49 Nothing particularly unusual, charge temperature estimate is quite common these days.
17:53 Just briefly what it does is it allows the ECU to create a estimated charge temperature which is the air temperature used in the main fuel calculation.
18:02 This is the estimate of the air temperature as it enters the cylinder because that is what's really important to the fuel model.
18:10 If we've got that correct we can account for the air density based on that temperature.
18:14 The problem is conventionally we base this on air temperature which at high RPM and high airflow may be absolutely fine but at low speed, low RPM at least, the air speed is low so it allows a lot of time for it to absorb heat from the likes of the inlet manifold inlet runners and the intake valves so the actual charge temperature can in fact be quite a lot higher than what we're measuring with the air temperature sensor.
18:40 So what we have is a table here which has values between 0 and 100.
18:44 If we've got a value of zero, this means that the ECU is biasing the charge temperature completely towards the air temperature so the charge temperature will simply be air temperature.
18:54 On the other hand a value of 100%, it'll be biased directly towards the engine coolant temperature and we'll use that, obviously numbers in between will be a split depending on the difference in those temperatures.
19:04 So the idea is that normally at low load and low RPM, we're going to bias more towards the engine coolant temperature, generally values of somewhere around about 70% would be a pretty good starting point.
19:16 As we move out to higher load and higher RPM though the air speed is much higher so generally we'll bias much higher towards the air temp sensor.
19:25 So again this is a default table, it's a good enough place to get us started.
19:29 Let's press esc, we'll come down to our offset table.
19:32 Now this is more relevant too if we are running on alcohol based fuels which have a higher latent heap of evaporation and absorb a lot more charge temperature as they go through a phase change from liquid to vapour.
19:44 So we can set this up based on our inlet temperature and the stoich air/fuel ratio so in this case we are running on pump gas, there's no need for that table to be utilised for our purposes so we've got that set to zero.
19:58 Then we have our charge temperature compensation table.
20:02 So while the charge temperature should theoretically do a pretty good job of controlling our air/fuel ratio as engine coolant temperature and air temperature vary, it's not always going to be the case so we can use this table to manipulate this, if we find there's an area where maybe there's an over compensation it's a good idea at least to start with to leave this table zeroed and only make changes if required.
20:27 We also need to consider our load axis here which is manifold pressure divided by barometric air pressure.
20:36 Personal preference here as to what you want to set that up.
20:40 If you want to change it, let's say we want to set this to a more conventional manifold absolute pressure, we can just simply select that from the menu there and we will make that selection change, we can click OK and we don't need to make any changes there, we can see now our load axis has changed.
20:58 Again, personal preference, just understanding what that axis is is important.
21:02 Alright so we've dealt with our fuel compensation we've dealt with our fuel tables and our lambda target table.
21:09 Next we can move over to our ignition.
21:11 And really we repeat the same process here, so I'm going to go a little bit quicker here.
21:15 We'll bring up our main ignition table.
21:17 Let's just have a look back, we've got exactly the same options for compensations here, always a good idea to just go through and have a look at those compensations and see what is actually happening, making sure that it is suitable to what we want.
21:34 So for example here we can see that the default compensation table for our ignition timing does pull quite a lot of timing at high load and high engine temperature.
21:46 Nothing strictly wrong with that but we can see that that is starting to come in from about 95°C so again just like our warm up enrichment or fuel temperature, engine temperature compensation for fuel, want to make sure that at least in the normal operating areas we don't have any compensations coming in.
22:04 We can also see that the base compensation table here is adding a lot of timing in at lower engine temperatures and lower load so personally not something I usually do so I'm actually going to start here just by zeroing that table out.
22:20 Again, this just needs to be set to your own personal preferences.
22:24 Definitely pulling some timing at high engine temperature and load, is not a bad way to add some subtle engine protection there.
22:31 Also got our charge temperature compensation table and again we can see that at higher engine charge, calculated charge temperatures, we are pulling timing.
22:41 Again, not a bad idea here for engine protection. the engine will become more knock prone as the charge temperature increases.
22:49 Just a good idea to make sure where you actually are running in this table because if you are starting creep up into the 60 to 70° charge temperature vicinity at high load, then the ECU as we can see will be pulling timing.
23:03 So we're going to leave that set but it's just good idea to have an understanding of what that table is doing and make sure that you revisit it, make sure that it's not actually influencing your tuning.
23:13 Particularly you can have problems with this effecting run to run variation in power as well if you get a little bit of charge temperature build up and you start moving into that table and it starts pulling timing needlessly.
23:24 Likewise with our fuel table, we have the ability to add our tables as we see fit using our ignition table control.
23:34 I'm not going to go over that again so for now we'll just come back to our main ignition table.
23:39 Right so our main ignition table, nice and straightforward here, we are using manifold pressure as our load axis this time.
23:46 Again little bit optimistic given that we're never going to be running over 300 kPa so we're going to make a few changes to that.
23:54 Likewise I'd be very surprised if we're going to end up hitting 10,000 RPM.
23:58 So personally just to keep the table numbers manageable and the break points, I like to just manipulate this.
24:05 So I'm only just exceeding the areas I truly expect to be running in.
24:09 So I'll just go ahead and make some changes to this now.
24:23 Alright we've got a slightly smaller table there that covers the areas the engine's going to run in.
24:29 We now want to go through and just address the numbers that are in this table.
24:32 So what I'm going to do here is just start by setting the entire table to an across the board 15°.
24:39 Now the RB26 doesn't really end up being overly knock sensitive so this actually isn't a terrible place to start, even on boost but for the sake of protecting our engine, what I will do is just drop the timing down a little bit further once we get up above about 160 kPa and then further again once we get up above 260 kPa so this is going to give us a really basic start up table that should be sufficient to get us up and running and of course we can then optimise the table from there.
25:14 If we press esc again, we can see that just like our fuel, we also have a global trim for our ignition and my advice is exactly the same, by all means use it but it's always a good idea to have this set back to zero.
25:27 It's just going to mean that particularly if you come back to the vehicle in 6-12 months time and you're wondering why the table numbers don't quite make sense, you may have overlooked the fact you've got a global trim in there and this can end up wasting time or potentially even end up damaging the engine because you may have more timing in the engine than you think, based on the table values.
25:47 Alright so we've got most of the work done here, I do want to take the time during this step as well to set up some engine protection functions.
25:57 So we already looked at the basics of how the rev limiters will work in terms of fuel cut, ignition cut etc.
26:04 So now what we're going to do is come across to our engine functions and we're going to come down to our engine protection control.
26:11 Now the start one here, we'll look at our engine temperature limit setup.
26:16 So we can set an engine temperature limit if we want to help protect the engine if it exceeds certain bounds.
26:24 In this case if the engine temperature goes above 115°C then we are going to bring in our protection which is in this case an engine speed limit of 2000 RPM.
26:35 Really up to personal preference as to whether or not you even want to have this functionality.
26:40 If you're tuning for a customer though it's always a good idea because it can protect an engine, a lot of people aren't that good at watching their gauges so the engine could end up overheating and this can save the engine.
26:52 The more conventional ones that we'll look at though, if we go down to our engine speed limiter setup.
26:57 So we've got some functionality here around how the limiter will be set up.
27:02 I'm not going to get too involved with this here but what we do want to do of course is have our target table set up.
27:10 So we can see that between 20° engine coolant temperature and 110°, we've got that set to 8200 RPM.
27:21 Once we go above 115 or once we get to 115°, we can see that we've got that dropping down to 5000 RPM.
27:30 And what will happen is the ECU will interpolate the engine rev limit between 110 and 115.
27:37 We do need to be a little bit mindful with the oil pump on the factory Nissan RB26.
27:46 These are well known to shatter if you do go above 8000 RPM so that does need to be kept in mind when you are choosing your rev limiter.
27:53 In this case we're not actually going to be making power up there anyway so what I'll do is I'll just safeguard that a little bit more, bring that down to 7800 RPM.
28:02 Alright so we also have our RPM limit 1 turn on delay table.
28:08 This is really important to understand, we can set up, if we wish, a delay for the RPM limit to come active.
28:14 I don't personally see why I'd want to do this but if you do have numbers in here and you don't realise this, it can actually allow an over rev which obviously could be dangerous so just a good idea to check that table and make sure it's set to 0.
28:27 And we'll also come down and have a look at our boost limit.
28:31 So what we can do here is select our source for our map limit 1 pressure input, in this case we are using manifold pressure.
28:41 We do have the ability to have boost pressure sensors pre throttle body as well.
28:45 That can be the source, if you're doing that you need to be mindful of the fact that you will see a pressure spike typically even with a blow off valve fitted when you do close the throttle with a pre throttle boost pressure sensor so just keep that in mind.
28:58 We also have the ability to set our limit off history, so how much does the boost need to drop below our boost cut before the cut will be removed.
29:09 In this case 30 kPa.
29:12 And then our limit percentage cut so how much cut will be applied during map limiting, in this case we are applying 100% cut.
29:18 Alright so that's our basics there, again we've got a turn on delay table.
29:22 Now this is interesting here because we may want to utilise this with our map limit.
29:27 It's very easy to end up with a minor over boost as the engine first comes up on boost and we may not be strictly that worried about it so what we can do here is set up a delay based on how far above our boost target we are, our boost, our map limiter I should say, we are so for example if we are only just marginally above our boost target, we can see we've got quite a large delay there.
29:51 However once we get in this case, 40 kPa away from our target, we are bringing that boost cut in instantly.
29:57 So again personal preference but it is a nice way to have a boost cut there for safety without it being overbearing, if you've got slight variations in your boost.
30:05 Most important here, our map limit table and we can set this sensibly based on our engine temperature.
30:12 Probably want to start with this set a little bit lower.
30:15 It's very common when we first get up and running to find that we have got control issues with our boost.
30:20 It's one of the most common things I see, particularly with engines or cars that have been built by others.
30:26 We'll get them on the dyno, find that the boost controller doesn't work.
30:28 So the first ramp run we try and do we get a massive over boost so always a good idea to start with our map limit just a little bit conservative, we can always come back and revisit this at a later time and in our case we know that the boost control system is working.
30:43 So I'm going to leave that set there at 280 kPa.
30:46 OK so at this point we've got all of the heavy lifting done there with our base table configuration, everything is set up, we're ready to move on with the next step of our process.

We usually reply within 12hrs (often sooner)

Need Help?

Need help choosing a course?

Experiencing website difficulties?

Or need to contact us for any other reason?