Opel Display
Intro
I drive an Opel Astra 1.4i. It has a display on the dashboard that should show the RDS
information that comes from the radio. However my radio does not support RDS. But an empty
display is annoying. So I thought "Let's make it an tachometer".
On this page is described how this Opel display works. I suggest that
you also take a look at the site of Dario
Carluccio.
It is in German, but has some beautiful diagrams about the protocol! On the Tachometer
page is described how I made a tachometer of it, like this:

There exist a whole range of Opel displays. What I have, is called
a Dual Info Display. And that is the only display I have worked on. In
the Feedback pages you will find work of Gábor Grátzl on the Triple
Info Display, which also includes temperature. He made a fuel
consumption meter. In the feedback page you will also find work of
Luc Bulot on a 10 character dot matrix display
I think this one is called Multi Info Display. Luc want to make a
tripcomputer. Fabio Bergamasco shared a lot of info on this same 10
character display.
There are two protocols for communicating with a Opel display. The
first protocol was analyzed by me and is described at this page. This
protocol works with displays that have 8 characters. The protocol
itself uses 11 bytes. The second protocol is used by displays that
have 10 characters and uses 14 bytes. This second protocol is
described here: 10 character display.
Searching the Internet I got to know that there are only three lines used SDA, SCL (Yes
from the Philips I2C
protocol) and MRQ (Which made things more difficult). Doing some measurements I found that
all three lines are pulled up to 5V by a resistor located in the display. This corresponds
to the I2C specification.
All devices connected to a I2C bus are only allowed to pull the communications lines low
by a transistor (open collector output port). If no device pulls the communication line
low it will be pulled high by the resistors.
A friend of mine has got his hands on a Opel compatible car radio. (Thanks
Erik-Jan for
getting it. Thanks Arjen for providing it) I used the LPT1 port of my computer to measure
the protocol. We did this at the Wietske residence (Thanks Wietske for the biscuits and
coffee):

Close up of the Radio:

The first text on the display and some electronics. Unfortunately I used a flashlight
to make this picture and the text on the display is very hard to read....

I had written a small program in Visual Basic that performs the measurement. The
result:

Click picture to enlarge.
Looks like a mess. But it can easily be explained. First click the
picture to enlarge. In this picture each pixel in the X-direction is a
sample of the three communication lines used. The black line is SCL, the blue is
MRQ and the red is SDA. There are 65535 samples taken in 2.00 seconds.
The sample rate is 32.8 kHz. The time each sample presents is about:
30 microseconds.
The radio was turned off. The measurement was set to start on a
change. Than the radio was turned on. The result:
- The power up sequence of the car radio shows that all three go low followed by a low
pulse (line test?) of each line. Pulling MRQ is acknowledged by the display by pulling SDA
low. Next there is a long period that MRQ is low This is a sort of reset pulse coming from
the radio. The display responds by pulling all three lines low.
- After an idle period (all high), you see a communication block. It is started by MRQ
going low for a short period. Than an I2C start is send (SDA goes low while SCL is high).
Next the address byte is send according the i2c protocol. Next MRQ goes low. And than the
10 data bytes follow. Next MRQ goes high and a I2C stop is send (SDA goes high while SCL is
high).
- And a second communication block is send, but the data makes no sense, as it suddenly
appears to be terminated.
Analyzing the protocol shows:
- Idle state all lines are high.
- Pull MRQ low for a short period and let it go high again.
- Send a "I2C Start"
- Send the address byte (0x94).
- Pull MRQ low.
- Send 10 data bytes
- Let MRQ go high
- Send "I2C Stop"
- We are back in the idle state.
The bytes contain in total 9 bits. First there are 7 bits of data followed by a parity
bit (odd-parity) followed by an acknowledge bit (Part of I2C specification). The first
byte is the address byte of the display. The next two bytes control the "lights"
like "CD", "RDS" and the decimal points. The following 8
data bytes contain the characters to be shown on the display using 7 bits ASCII. Decoding the first
block results in:
- 0x94 = 10010100A (This is the I2C address of the display)
- 0x10 = 00010000A (Turn one light on, I did not bother to check which bit belongs to
which light.)
- 0x01 = 00000001A (Turn the other lights off)
- 0x8C = 10001100A = "F"
- 0xA4 = 10100100A = "R"
- 0x8A = 10001010A = "E"
- 0x8A = 10001010A = "E"
- 0xB5 = 10110101A = "Z"
- 0x40 = 01000000A = " "
- 0x8C = 10001100A = "F"
- 0x9B = 10011011A = "M"
The Display has a 12 pin connector which is described as
follows:
| Pin # |
Name |
Description |
| 1 |
Permanent 12V |
Always on 12V, keeps the clock running. |
| 2 |
Not connected (Temperature) |
Temperature for TID |
| 3 |
Ground 0V |
Ground connected to the chassis |
| 4 |
Not connected (Temperature) |
Temperature for TID |
| 5 |
Accessories |
12V when the key is on accessories. The display goes on. |
| 6 |
Headlights |
12V when headlights are on. |
| 7 |
Dashboard illumination |
Signal for the strength of the dashboard lights |
| 8 |
Car-radio on |
The Radio is on. The date will disappear and make space for
the RDS signal |
| 9 |
SCL |
Serial Clock |
| 10 |
MRQ |
Master Request or something... |
| 11 |
SDA |
Serial data from the radio |
| 12 |
Not connected (Speed) |
Speed signal for displays with temperature readout. (TID) |
Now all the details of the communication protocol were known, it was time to unhook the
car radio and connect the display to my LPT port to write my own text on the display:








|