Technische Infos für die Anzeige externer Daten auf dem Opel TID (Triple Info Display) - z.B. für die Umsetzung mit einem Arduino

  • Hallo,

    ich fand das Thema schon länger interessant, die originale Radioanzeige des TIDs nach zu nutzen (dort wo eigentlich die Sender stehen). Leider existiert zwar das nötige Wissen, ist aber seit über 20 Jahren über zahlreiche Foren, private Homepages und Videoplattformen verstreut, häufig in unterschiedlichen Sprachen und mit Quellen, die im Lauf der Zeit offline gegangen sind.
    Wer heute anfängt, muss dieselben Grundlagen oft mühsam neu zusammensuchen, die andere längst herausgefunden haben.

    Dieser Beitrag soll genau das verhindern: Er dient als zentrale Sammelstelle für das vorhandene Wissen rund um das Thema, externe Informationen über das TID anzeigen. Im Kern steht das zugrunde liegende Übertragungsprotokoll (Abschnitt 2), das die technische Basis für jede eigene Ansteuerung bildet, unabhängig davon, mit welcher Hardware sie am Ende umgesetzt wird. Ergänzend dazu sammelt Abschnitt 3 Hinweise auf konkrete Community-Projekte, Bibliotheken und Diskussionen, in denen andere diese Grundlagen bereits erfolgreich in die Praxis umgesetzt haben. Ergänzungen, Korrekturen und Hinweise auf weitere, hier noch fehlende Quellen sind ausdrücklich erwünscht – der Beitrag lebt davon, mit der Zeit vollständiger zu werden.


    1.2 Hintergrund

    Das Triple Info Display (TID) ist eine werkseitig verbaute Anzeigeeinheit in mehreren Opel-Modellen der 1990er- und frühen 2000er-Jahre. Es zeigt üblicherweise Uhrzeit, Außentemperatur sowie Statusinformationen des Radios (Sender, Titel, Fehlercodes) an und wird ausschließlich vom originalen Opel-Radio angesteuert. Wird dieses gegen ein Nachrüstgerät getauscht oder ganz entfernt, bleibt das Display ohne Ansteuerung und damit funktionslos – Opel hat das dafür nötige Protokoll nie offiziell veröffentlicht.

    Aus diesem Grund wurde das Protokoll seit den frühen 2000er-Jahren mehrfach unabhängig voneinander von Hobbyisten durch Reverse Engineering rekonstruiert. Die im Folgenden wiedergegebene Dokumentation geht maßgeblich auf Dario (carluccio.de) zurück, der das Protokoll 2002 erstmals erfasste und öffentlich zugänglich machte. Seine erste eigene Implementierung eines Interfaces basierte auf einem Atmel AT90S2313, programmiert in BASCOM AVR: Die Schaltung wandelt Daten von einer seriellen TTL-Schnittstelle (1200 Bit/s) in das TID-Format um, sodass eine anschließende Anwendung Text ausgeben kann, ohne das Protokoll selbst implementieren zu müssen. Aufbauend darauf entstanden in der Folge weitere, teils in C geschriebene Implementierungen auf Arduino-Basis (siehe Abschnitt 3).

    Unabhängig davon dokumentierte auch der niederländische Bastler Eelke Visser das Protokoll: Ausgehend von einem Dual Info Display (DID) in seinem Astra f schloss er das Display über die parallele Schnittstelle (LPT1) seines PCs an und zeichnete die Kommunikation mit einem selbst geschriebenen Visual-Basic-Programm auf. Seine Analyse bestätigte unabhängig die von Dario beschriebene Bus-Struktur (SDA, SCL, MRQ) und lieferte zusätzlich einen konkreten Mitschnitt realer Radiokommunikation (siehe Beispiel in Abschnitt 2.10). Über seine Website verzweigten sich in der Folge weitere Bastlerprojekte, unter anderem Portierungen auf 8051- und PIC16F628-Mikrocontroller sowie eine Ansteuerung direkt über den PC-Parallelport, dazu mehrere unabhängige Platinenlayouts und eigenständige Verbrauchs- und Drehzahlmesser-Projekte für Astra und Corsa (siehe Abschnitt 3).

    Für die hier dokumentierten technischen Angaben gilt: Sie beruhen auf handschriftlichen Mitschnitten und Messungen und wurden nach bestem Wissen erfasst, eine Garantie für Fehlerfreiheit besteht nicht.


    2. Protokoll

    2.1 Grundlagen
    Der Opel Radio-Display-Bus ist ein serieller Bus, der ein Master-Gerät (das Radio) mit einem Slave-Gerät (Triple Info Display oder Multi Info Display) verbindet. Er basiert auf dem I²C-Protokoll, verfügt zusätzlich jedoch über eine dritte Leitung, die Master-Request-Leitung (MRQ). Alle drei Leitungen werden slave-seitig über Pull-up-Widerstände auf High gezogen; angeschlossene Geräte dürfen die Leitungen ausschließlich per Open-Collector-Ausgang aktiv nach Low ziehen, wie im I²C-Standard vorgesehen.


    2.2 Anschlussbelegung

    2.2.1 8-stelliges TID (Opel Astra F, Corsa B/Tigra)

    PinBeschreibungKlemmeFarbe Astra FFarbe Corsa B
    1DauerplusKL 30RtRt
    2Außentemperatur MinusBl
    3MasseKL 31BrBr
    4Außentemperatur PlusBlWs
    5ZündungKL 15Sw
    6AuffindbeleuchtungGrGnGrGn
    7Auffindbeleuchtung nachts (gedimmt)GrSwGrSw
    8Radioanzeige ein / Datum aus (AA)RtGnRtGn
    9SCLBrWsBrRt
    10MRQBrWsBrGr
    11SDABrWsBrSw
    12SDV (Speed Dependent Volume)BlRt

    2.2.2 10-stelliges TID (Opel Astra G, Corsa C)

    PinBeschreibungKlemmeFarbe Astra GFarbe Corsa C
    1ZündungKL 15SwSw
    2Radioanzeige ein / Datum aus (AA)WsRtRtGn
    3DauerplusKL 30RtRt
    4Auffindbeleuchtung nachts (gedimmt)GrGeGrSw
    5Außentemperatur PlusBlWsBlWs
    6MasseKL 31BrBr
    7Außentemperatur MinusBlBl
    8DiagnoseBrWsBrGn
    9SDV (Speed Dependent Volume)BlRtBlWs
    10SCLBrRtGn
    11SDABrSwWs
    12MRQBrGrBrGr

    2.3 Elektrische Daten

    • Spannung für High: > 4 V (max. 100 µA)
    • Spannung für Low: < 1 V (max. 100 µA)
    • Pull-Up-Widerstände befinden sich auf der Slave-Seite.

    2.4 Power-on-Test
    Bei jedem Einschalten sendet das Autoradio eine feste Signalfolge. Das Einschalten wird vom Slave am Signal „Antenna Amplificator" (AA) erkannt; innerhalb der Zeit T3 muss die eigentliche Datenübertragung beginnen.

    minmax
    T1100 ms500 ms
    T2500 µs1 ms
    T31 ms2 ms

    Anschaulich beschrieben läuft das so ab: Beim Einschalten ziehen zunächst alle drei Leitungen kurz gemeinsam auf Low (eine Art Leitungstest), gefolgt von einem länger anhaltenden Low-Pegel auf MRQ, der wie ein Reset-Signal wirkt und vom Display mit einem kurzen gemeinsamen Low aller drei Leitungen quittiert wird. Erst danach, nach einer Ruhephase mit allen Leitungen auf High, beginnt der reguläre Kommunikationsblock nach dem unten beschriebenen Muster.

    Anhand der Signale kann der Master zudem Leitungsfehler erkennen:

    • Bleibt eine Leitung dauerhaft Low, liegt ein Kurzschluss nach Masse vor.
    • Bleibt eine Leitung dauerhaft High, liegt ein Kurzschluss nach +Ub vor.
    • Tritt ein gesendeter Impuls auch auf einer anderen Leitung auf, besteht ein Kurzschluss zwischen beiden Leitungen.

    2.5 Datenübertragung

    1. Master setzt MRQ Low.
    2. Slave antwortet mit SDA Low (T1min = 100 µs, T1max = 15 ms).
    3. Master setzt MRQ High (T2min = 100 µs, T2max = 200 µs).
    4. Slave setzt SDA High (T3min = 100 µs, T3max = 200 µs).
    5. Master setzt SDA Low (T4min = 100 µs, T4max = 500 µs).
    6. Master setzt SCL Low (T6min = 100 µs, T6max = 200 µs).
    7. Master sendet die Adresse.
    8. Master setzt MRQ Low (T7min = 100 µs, T7max = 500 µs).
    9. Master sendet die Daten (T5min = 1 ms, T5max = 10 ms).
    10. Master setzt MRQ High (T7min = 100 µs, T7max = 500 µs).

    2.6 Format einer Nachricht
    Eine Nachricht setzt sich aus der Slave-Adresse des Displays, den Symbol-Bytes und den Daten-Bytes zusammen:

    1. Start der Übertragung
    2. Slave-Adresse
    3. Symbol-Bytes
    4. Daten-Bytes
    5. Ende der Übertragung
    Symbol-BytesDaten-BytesGesamtlängeSlave-Adresse
    8-stelliges TID2811 Byte0x4A (74 dez.)
    10-stelliges TID31014 Byte0x4D (77 dez.)

    Hinweis zur Adressdarstellung: In manchem im Netz kursierenden Quellcode taucht für das 8-stellige TID die Adresse 0x94 statt 0x4A auf (bzw. 0x9A statt 0x4D beim 10-stelligen TID). Das ist kein Widerspruch, sondern lediglich eine andere Schreibweise derselben I²C-Adresse: 0x4A ist die 7-Bit-Adresse, wie sie z. B. von der Arduino-Wire-Bibliothek erwartet wird. 0x94 ist dieselbe Adresse, bereits um ein Bit nach links verschoben und mit dem (auf 0 gesetzten) Schreib-Bit ergänzt – so, wie sie viele bitbangende Implementierungen direkt verwenden.

    2.7 Bit-Synchronisation

    1. Master legt Bit an SDA an.
    2. Master wartet Ts = 5 µs.
    3. Master setzt SCL High.
    4. Master setzt SCL Low (TSCLHmin = 50 µs, TSCLHmax = 1 ms).
    5. Master wartet Th = 5 µs.
    6. Master legt neues Bit an SDA an.
    7. Master wartet den Rest von TSCLL (TSCLLmin = 50 µs, TSCLLmax = 1 ms).
    8. Master setzt SCL High.
    9. Master wartet, bis der Slave SCL High setzt (Tmax = 1 ms).
    10. Ab diesem Zeitpunkt muss der Master SCL für mindestens TSCLLmin = 50 µs auf High halten.
    11. Weiter bei Schritt 4.

    2.8 Bestätigung und Ende der Übertragung

    2.8.1 Bestätigung am Ende des Bytes

    1. Master setzt SCL High (für das LSB, Least Significant Bit).
    2. Master setzt SCL Low; die Daten werden vom Slave übernommen.
    3. Master setzt SDA High; der Slave setzt SCL Low (Daten übernommen).
    4. Master setzt SCL High.
    5. Slave setzt SDA Low, falls die Parität ungerade ist.
    6. Slave setzt SCL High; der Master kann die Parität auswerten.
    7. Master setzt SCL Low; die Bestätigung wird angenommen.
    8. Slave setzt SDA High.
    9. Master sendet das MSB des nächsten Bytes oder beendet die Übertragung.

    2.8.2 Ende der Übertragung

    1. Master setzt SDA Low (T1 = 100 µs).
    2. Master setzt MRQ High (T2min = 100 µs, T2max = 1 ms).
    3. Master setzt SCL High (T3 = 100 µs).
    4. Master setzt SDA High (T4 = 100 µs).

    2.9 Fehlerbehandlung
    Bei einem Paritätsfehler setzt der Slave SDA auf High; der Master versucht daraufhin, das Byte erneut zu senden. Nach insgesamt drei Paritätsfehlern in Folge beendet der Master die Übertragung, das Display zeigt dann nur Leerzeichen an.

    Nach einer erfolgreichen Übertragung kann der Master frühestens nach 100 µs eine neue Übertragung beginnen.

    2.10 Format eines Bytes

    • Das MSB wird zuerst gesendet, das LSB zuletzt.
    • Zeichen-Byte-Format: 7 Datenbit, 1 Paritätsbit (ungerade Parität).
    • Symbol-Byte-Format: 1. Byte Radio-Status, 2. Byte Tape-Status, 3. Byte CD-Status.

    Beispiel: Ein realer Mitschnitt für das 8-stellige TID enthielt unter anderem die Byte-Folge 0x8C, 0xA4, 0x8A, 0x8A, 0xB5, 0x40, 0x8C, 0x9B. Entfernt man jeweils das Paritätsbit (das niederwertigste Bit), ergeben sich die Standard-7-Bit-ASCII-Werte für „F", „R", „E", „E", „Z", „ " (Leerzeichen), „F", „M" – im Klartext also der Radiosendername „FREEZE FM". Dieses Beispiel veranschaulicht gut, dass die eigentliche Zeichenkodierung schlicht ASCII ist, lediglich um ein Bit nach links verschoben und um ein Paritätsbit ergänzt.

    2.11 Format der Status-Bytes

    Bit1. Byte (Radio-Status)2. Byte (Tape-Status)3. Byte (CD-Status)
    7KommaSymbol „CD-In"0
    6Symbol „RDS"Symbol „Dolby C"Symbol „Track"
    5Symbol „TP"Symbol „Dolby B"Symbol „RDM"
    4Symbol „Stereo"Symbol „cr"Symbol „PGM"
    30Symbol „CPS"Symbol „DISC"
    2Symbol „AS"00
    1Klammer um „TP"00
    0ParitätParitätParität


    Quellen:



    Ihr hat etwas zu ergänzen und weitere Infos? Gerne raus damit! :)

    Gruß
    Lars