Exploring the E39 OBC






About the

About This Site

Deus Ex Machina, Bavarian style

I've seen messages on the BMW mailing lists that describe how to read out data stored in the on-board computer (OBC) of various models. None of these techniques worked on my car, a 1999 BMW 540iA Sport equipped with the optional navigation system.After some careful exploration, I figured out how to read out this data right from the dashboard.

The OBC makes some of its data available to the driver on the nav-system screen or on the check control indicator at the center of the lower edge of the instrument panel. This is the indicator that displays things like "FASTEN SEAT BELTS" while the car is operating. The OBC knows more than it's telling, though. It also keeps track of interesting things like the serial number of your car, the time rate of fuel consumption (liters per hour as opposed to liters per 100 km or miles per gallon, which you normally get from the OBC), the car's exact speed and engine RPM (haven't you wanted a digital speedo or tach?), the engine core temperature, and the battery voltage.

The OBC even keeps track of some less-intesting things: the instantaneous measurement of fuel tank level (which varies rapidly as the fuel sloshes around), diagnostic codes, and the status of most of the buttons in the cockpit. I don't know what the diag codes mean, and there are other numbers stored in the OBC that I can't explain. Perhaps someone reading this can help inform me, and through me, the rest of the E39 community.

I'm sharing this information with some trepidation. It's possible that if you attempt to duplicate what I've done, you could utterly destroy your car. Seriously. For all I know, hitting the wrong button at the wrong time could override some critical safety function. Disable a thermostat somewhere and the next thing you may learn about your expensive engine is how bad it smells when it melts.

There are both questions and answers here. Help with the questions (including any displays I don't attempt to explain) and corrections to any of my proposed answers would be greatly appreciated.

How to get to the OBC codes:

There are two buttons on the 540's instrument panel. The button to the lower left of the speedometer is the reset button for the trip odometer, which I'll call the Reset or R button. The button to the lower right of the tachometer is the check control key, which I'll call the Check or C button. If you don't have both of these buttons—and the check control indicator—on your instrument panel, this isn't likely to work for you.

The first step is to start the car. (It may also work if the key is turned to position 1 or 2 without staring the engine; I didn't try.) Now hold in the Check button. The check control indicator will read "CHECK CONTROL OK". Keep holding the button. After a few seconds the indicator will go blank, and after a few seconds more the indicator will display "TEST-NR. 01". Now release the Check button.

At this point you can press the Check button briefly to cycle through each available test, or hold it in for a few seconds to exit the test mode.

In each test, you can press the Reset button to cycle through any displays that might be available in the current test (however, some tests use the Reset button to CHANGE the current value, which could be very bad—read the rest of this page before using the Reset button!). Here's what comes up for test 01. The first line is the initial display, and each subsequent line is displayed for each press of the Reset button. These displays are usually centered in the check indicator, but I won't attempt to imitate that here. I've added comments to explain the displays I think I understand.

(VIN serial number, censored)
K: 7744
BMWTNR: 8387061
CI:12 DI:06 BI:09
DAT: 43/98
(week and year of manufacture)
HW:04 SW:1100/1100
ZYL:08 M:4 S:4095
(cylinders, and what else?)
CAN:02 AEND:14

There's a lot of information here. You'll notice here that the OBC's native language is German—"cylinder" is represented by ZYL because that's the abbreviation for the German word "Zylinder". You'll see other examples below of German words and metric units appearing in these OBC displays, regardless of what language the OBC usually uses to communicate with you.

At first, tests 01 and 02 are the only test you'll be able to access. The rest of the tests are normally locked. Test 02 is simple:

(Instrument test)

This test works only when the key is in position 1, NOT when the car is running. Press Reset and all of the gauges and lamps in the instrument cluster come to life. All the lamps except for the warning indicators (such as overheating and low oil) come on. I presume the "idiot lights" are connected directly to their respective sensors so they still work even if the OBC dies.

The speedometer and tachometer move on their own from one extreme to the other, so if you want to get a picture of your speedometer reading 155 without leaving the garage, this is the way to do it. (This is not how I made my autobahn video, though. :-)

If you press the Check button to advance to test 03, then hit the Reset button, the indicator will display "LOCK: ON". This refers to a lock function that will keep you out of most of the remaining tests.

To unlock these tests, add up the last five digits in your VIN number, producing a number from 0 to 45. With "LOCK: ON" displayed, hit the Reset button again. The display will change to "LOCK: 00". If the VIN sum was 0, press Check. Otherwise, press Reset until your VIN sum is displayed, then press Check. Press Check again until you get back to test 03. You'll know you got it right when you press Reset at this test and get the following displays (or something like them):

SI-L: 0610
SI-TAGE: 0000

I assume these have something to do with the Service Indicator function. Maybe there's a way to reset it from here? I've read that the service indicator timer uses fuel consumption rather than miles or time.

I'm told the SI-L reading indicates the number of liters consumed since the last service. On my car, it's too high to refer to liters consumed—by a factor of two or so—unless there's some starting offset. I'll keep track of it for a while and see if I can figure it out.

On this basis, SI-TAGE should be days since the service indicator was last reset.

Here's the rest of what I saw. Note that I've replaced some of the numbers with X's where they can vary according to the operation of the car. Test 04, for example, has two displays related to fuel consumption.

VBR: xx.x L/100KM
VBR: x.x L/HR
(fuel consumption in liters/hr)

This test shows the current rate of fuel consumption—think of it as a digital version of the mileage gauge. Someone was recently wondering how quickly his car consumes fuel while idling—mine reports 1.3–1.6 liters per hour, or about 50 hours of idling on a full tank.

RW-VBR: xx.x L/100KM
(average mileage)
RW: xxx KM

I get about 14.3 miles per gallon overall, but your mileage, of course, will vary. :-)

TNK: 7.5/31.0/38.5L
(current fuel levels: left, right, total)
(average total fuel level)

This test relates to the fuel tank. I left the numbers in to assist with the explanation, but you'll get different numbers. The first two numbers seem to be independent fuel-level measurements; the third is the sum of the first two. My car has some kind of "reserve" gas tank with a rated capacity of "approximately 10 liters", so maybe the first number is the reserve tank. The first two readings bounce around a lot when the car is moving, suggesting that the fuel-level sensors respond fast enough to show the fuel sloshing around in the tank.

The first value also starts out higher than it ought to be and declines over the first ten minutes of operation to a stable value. The second number starts out low and increases, while the third number remains relatively stable but still moves around. For example, on my first trip after making these measurements, the TNK values started out at 19.6/19.7/39.3 and declined to 6.9/31.2/38.1 within a few minutes. I assume the dashboard fuel gauge ignores the first value as long as there's fuel left in the main tank, since it seems fairly consistent from one trip to the next. I've had trouble with my OBC being overoptimistic about its driving range estimates right after the car is started when the tank is near empty, though, and I think this shows why.

The German word Anzahl means "quantity". The TNKANZ value seems to indicate the average fuel level over some period. And what does PHASE1 mean?

KTMP: xxx°C
(engine core temperature)
N: xxxxx U/MIN
(engine RPM)
ATMP: +xx.0°C
(ambient temperature)

It was 65°F when I took these readings (about 18°C) and the core temperature stabilized at about 108°C, which seems about right. My car idles at about 500 RPM, a value which is difficult to read precisely from the tachometer.

V: xxx KM/H
(current velocity)

VB: xx.x V
(battery voltage)

Tests 08 and 09 have just one display each, and both are somewhat useful. My battery voltage, idling in the garage, was around 13.5 V.

(country of sale?)


Einheit means "unit". Units 1 through 3, then, and each seems to have a hexadecimal (base-16) number associated with it. Intriguing, eh? It gets better later on.

VANK: xxx.x KM/H
ANK: --:--

On my car, VANK was 077.6 KM/H. Could ANK be from the German word Ankunftszeit for "time of arrival"? That would explain why it was blank, since I didn't have a destination programmed when I read out these values. In this case, VANK could be average speed for the purpose of calculating time of arrival, left over from the last trip.


This one is the audio equivalent of Test 02. Instead of testing the lights, it tests the sounds. You'll hear, in order, the tones for the Memo, Outdoor Temperature Alert, Limit/Code, and Check Control chimes.

DIAG: 1 C7 81 000
DIAG: 2 00 00 000
DIAG: 3 00 00 000
DIAG: 4 00 00 000
DIAG: 5 00 00 000

These would presumably change if your car has accumulated diagnostic codes for some failure. I don't know what C7 81 means; I've seen my car do the occasional strange thing, but nothing bad has happened. At least as far as I know.

Now, here we get into the most intriguing test:

PORT A00: xxxxxxxx
PORT A01: 00000111
PORT A02: xx0x0001
PORT A03: 00000011
PORT A04: 000x0101
PORT A05: 001B1111
PORT A06: 00110101
PORT B00: xxxxxxxx
PORT B01: 00100010
PORT B02: xx0x0110
PORT B03: x0111001
PORT B04: 000x1111
PORT B05: 11100111
PORT B06: 00000000

Here we have some cool stuff. These appear to be register values from some type of microprocessor, displayed in binary. The 0's and 1's showed here were stable when I read out these values; the x's were toggling between 0 and 1. I didn't take any time to try to figure out what these bits mean, with one exception:

Notice the "B" in register A05—I discovered that this bit is connected to the button on the turn-signal stalk that controls the on-board computer (OBC) displays that normally appear in the check control indicator. Normally this bit is 0; press the OBC stalk button and it goes to 1.


This means "oil temp," but I'm pretty sure the oil was a lot warmer. In fact, I'm pretty sure there isn't anything on my car that can be this cold. So it's a mystery.


I have no idea what this means.

(No response to Reset on this test.)

(press Reset to turn the lock back on)

KVBR: 1000

This "test" is actually a way to adjust the OBC's fuel consumption factor. There's a sensor in the fuel injector system that indicates fuel consumption back to the OBC. This "KVBR" value is used to calibrate that sensor using the following process:

  1. Reset one of the OBC mileage indicators and the trip odometer, and fill your tank.
  2. Record the actual fuel consumption for your car over a long period (one to two months at least).
  3. Divide this reading into the trip odometer value to calculate your actual mileage.
  4. Divide this result by the OBC indicated mileage over the same period and multiply by 1000.

You now have your fuel consumption factor. To enter the factor into the OBC, get into Test 20 and press Reset. This will start the KVBR value counting down. It will count down to 750, then start over at 1250. A crude user interface to be sure, but it works.

You probably don't need to change the KVBR value; the default value of 1000 should be accurate. And if your calculated fuel consumption factor is outside the 750–1250 range, there's probably something wrong.


Be careful here too—I didn't try the Reset button on this one, because I assume it resets the whole OBC. This could be a very bad thing.

So, there you go—I hope the fact that I went poking around in my car will satisfy YOUR curiosity. Please don't follow my example unless you know what you're doing and are willing to accept the potentially catastrophic consequences.



Site Map

Back to top


Ideafiles | Opinion | Photography | My BMW | Toscana | About the Author

If you have comments or suggestions, please email me at png@ideaphile.com.

All content copyright 1996-2000 by Peter N. Glaskowsky. All rights reserved.