[Galant] HC Tacho Kilometerstand anpassen (& von Meilen auf KM umstellen)

März 2024 - Hier gewinnt ihr einen Dakar-Gewinner - alles weitere im Gewinnspiel - Thread.

  • Inhalt:

    • Rechtliches
    • Hinweise
    • Tacho Umbau
    • Kilometer-Korrektur
    • EEPROM lesen
    • EEPROM verstehen
    • EEPROM schreiben
    • Tacho Modifikation
    • Meilen-Konvertierung
    • Fazit



    Rechtliches


    In Deutschland ist die Manipulation des Kilometerstandes im Kombiinstrument NICHT illegal.


    Diese Tat wird erst illegal, wenn diese vorsätzlich zur Täuschung und zum Betrug anderer Personen angewendet wird.


    Anwendung dieses Tutorials erfolgt ausschließlich auf eigene Gefahr!


    Ich distanziere mich ausdrücklich von der illegalen Nutzung des Wissens in diesem Tutorial!


    Ich bin Urheber aller Photos und Screenshots in diesem Tutorial.



    Hinweise


    Dieses Tutorial richtet sich an die unter euch, die sich nicht vor Trial-and-Error scheuen und mit einem Lötkolben umgehen können.
    Es gibt 2 wesentlich einfachere, aber teurere Alternativen um zum gleichen Ziel zu kommen:

    • Serial Programmer kaufen
    • Serial Programmer selber bauen

    Nachteil am kaufen ist, dass es die teuerste Alternative ist. Hochwertige Serial Programmer können bis zu 140€ kosten, günstigere Modelle gibt es natürlich auch, Made in China.
    Nachteil am selbstbauen ist, man muss die einzelnen Komponenten für den Serial Programmer kaufen, den Serial Programmer auf einem Breadboard zusammenstecken, oder löten und man benötigt einen alten PC mit Serial Port und Windows XP.
    Vorteil von beiden Methoden ist die Einfachheit und die Geschwindigkeit. Ist der Serial Programmer vorhanden (egal ob gekauft, oder gebaut), kann ein serieller EEPROM per OpenSource Software eingelesen und beschrieben werden.
    Beides sind sinnvolle Alternativen, jedoch lag mein Arduino bereits seit mehreren Monaten ohne Verwendung auf meinem Schreibtisch und ich wollte eine kleine Herausforderung haben. Näheres im Kapitel "EEPROM lesen".
    Solltet ihr euch gegen einen Serial Programmer entscheiden und lieber diesem Tutorial folgen, benötigt ihr:

    • Phillips Schraubendreher
    • Lötkolben und Lötzinn
    • Entlötlitze
    • Arduino
    • Breadboard mit ca. 12 Kabeln



    Tacho Umbau


    Die Geschichte des HC Tachos ist eine Geschichte voller Missverständnisse.
    Jeder der noch keinen hat, aber vor hat sich einen zu besorgen und in seinen Galant einzubauen, empfehle ich den alten Thread von Schrauber zu lesen und auch jegliche andere Threads die schon über den HC Tacho erstellt wurden.


    [Elektrik] HC-Tacho Umbau
    [Elektrik] Tachotausch auf HC bei GDI


    Bitte beachtet die Unterschiede zwischen den Motorisierungen! (4G63, 4G64, 6A13)


    Da der mir angebotene HC Tacho (MR559404) Britischer Herkunft war und einen kleinen Riss in der vorderen Blende aufwies, konnte ich diesen für (verhältnismäßig) kleines Geld erstehen. Laut verkäufer stammte dieser aus der EA0 2.0l Variante, laut zwielichtigen russischen Websites stammt er aus der Britischen 2.5l (V6) Variante. Ich wollte es auf einen Versuch ankommen lassen, denn mein eigentlicher Urlaubsplan ist geplatzt und ich brauchte nun eine Alternative mit der ich meinen Kopf während des Urlaubs auf Trab halten konnte.


    Wie in so vielen Threads schon beschrieben, standen anfänglich natürlich die standardmäßigen Umbauten an:

    • A5 unterbrechen
    • Brücke von A11 nach A5 (vor Unterbrechung)
    • Brücke von A4 nach A5 (hinter Unterbrechung)



    Alles funktionierte einwandfrei, Hintergrundbeleuchtung und Drehzahlmesser. Jedoch, wie bereits vermutet bei einer Britischen Tachoeinheit, zählte der Kilometerzähler in Meilen und war somit wohl eher ein Meilenzähler. :Yp


    Nun ging es an die Korrektur des Kilometerstandes / Meilenstandes.


    Kilometer-Korrektur


    Ich habe leider kein Photo vom alten Kilometerstand gemacht, da die Idee des Dokumentierens erst später kam und ich zu dem Zeitpunkt nichtmehr daran gedacht habe, ein Beweisphoto des Kilometerstandes zu machen.
    Der HC Tacho hatte 75.522 Meilen auf der Uhr, während der Kilometerstand meines Galants bereits bei 217.445 km lag. Genau wie viele andere in den älteren HC Tacho Threads, wollte ich auch den originalen Kilometerstand im neuen HC Tacho haben, somit war eine simple Dokumentation im Serviceheft keine Lösung für mich.


    Als erstes muss die gesamte Tachoeinheit demontiert werden.




    Auf der Rückseite findet man die Platinen der Drehzahlmessereinheit und der Tachoeinheit.




    Die Platine der Tachoeinheit lässt sich auf der rechten Seite finden und als Verantwortlichen für die digitale Speicherung aller notwendigen Daten der Tachoeinheit erspähte ich in der unteren, linken Ecke bereits einen heißen Anwärter.




    Bingo, ein ST/Microwire 93C46 EEPROM. Beschriftung ist auf dem Photo leider nicht zu erkennen.




    Detail-Aufnahme der Rückseite, diese 7 Pins müssen entlötet werden, am besten mit Entlötlitze. Zum Schutz des EEPROMs habe ich einen kleinen Aluminium-Kühlkörper auf ihm befestigt, dieser leitet die Hitze schneller ab.




    Hier die Platinenrückseite nach der Entlötung.




    Der EEPROM mit Kühlkörper.




    Und ohne Kühlkörper.




    Edit: Rechtschreibkorrektur

  • EEPROM lesen


    So nun sind wir an dem Schritt angekommen an dem entschieden werden muss, wie man mit dem EEPROM weiter umgeht. Wie bereits oben erwähnt gibt es die möglichkeit sich einen Serial EEPROM Programmer zu kaufen. Diese kommen meißt mit eigener Software und EEPROM-Datenbank, das ist eine Sache von 2-3 Clicks und man hat den Inhalt des EEPROMs auf dem Schirm. Wer kein Geld für so ein Gerät ausgeben will, für den gibt es noch die Möglichkeit ein eigenes Serial Interface zu bauen. Dazu benötigt es jedoch einen PC mit Serial Port und Windows XP.
    Nach dieser Schaltung könnt ihr verfahren, Vcc sind +5V.




    Anschließend könnt ihr mit einem Programm wie PonyProg auf den EEPROM zugreifen, dazu gibt es bereits viele Tutorials online.


    Wie oben bereits geschrieben, habe ich mich jedoch dazu entschieden den komplizierteren, rustikaleren Weg zu gehen, der einen wesentlich größeren Lerneffekt mit sich bringt.
    Der erste Schritt um zu verstehen was der Tacho eigentlich mit dem EEPROM macht ist zu verstehen wie der EEPROM funktioniert. Das Data-Sheet ist somit die erste Anlaufstelle: 93C46 Data-Sheet
    Wir erfahren, dass es sich bei dem 93C46 um einen 1 kb Serial EEPROM handelt und wir erfahren, dass er eine 8-bit Breite, oder 16-bit Breite besitzen kann.
    Was es genau damit auf sich hat, können wir im 4. Kapitel (Seite 10) nachlesen:
    Das EEPROM hat 2 verschiedene Organisations-Modi:

    • 128 Addressen zu je 7 bit mit 8 bit Platz für Daten
    • 64 Addressen zu je 6 bit mit 16 bit Platz für Daten


    Man kann also für die Hälfte der "Speicherplätze" die mögliche zu speichernde Datenmenge verdoppeln. Um den x8 Modus zu wählen, muss Pin 6 (ORG) mit Pin 5 (Vss, Masse) verbunden werden, für den x16 Modus der Pin 6 (ORG) mit Pin 8 (Vcc).
    Auf der Platine können wir sehen, dass Mitsubishi sich für den x16 Modus entschieden hat.




    Damit kennen wir schonmal einen wichtigen Punkt den wir bei der Verdrahtung unseres EEPROMs mit unserem Arduino zu beachten haben.
    Als erstes wird der EEPROM auf dem Breadboard platziert, anschließend wird verdrahtet:

    • Pin 1 des EEPROM (S, Chip Select) mit Pin 10 des Arduino
    • 1k Ohm Widerstand von Pin 1 des EEPROM auf Masse
    • Pin 2 des EEPROM (C, Clock-Signal) mit Pin 13 des Arduino
    • Pin 3 des EEPROM (D, Data Input) mit Pin 11 des Arduino
    • Pin 4 des EEPROM (Q, Data Output) mit Pin 12 des Arduino
    • Pin 5 des EEPROM (Vss, Masse) auf Masse (-Schiene des Breadboards)
    • Pin 6 des EEPROM (ORG, x8/x16 Organisation) auf Spannung! (+Schiene des Breadboards)
    • Pin 8 des EEPROM (Vcc, Spannung) auf Spannung (+Schiene des Breadboards)
    • GND Pin des Arduino auf die -Schiene des Breadboards
    • 5V Pin des Arduino auf die +Schiene des Breadboards


    Pin 7 bleibt wie im Data-Sheet beschrieben unbelegt.
    Der Widerstand an Pin 1 des EEPROM zieht den Chip Select LOW um zu gewährleisten, dass dieser Input nicht "schwebt", wenn der Arduino keine digitale 1 ausgibt.


    Das Resultat sollte so aussehen:




    Arduino angeschlossen. (Leider falsch fokussiert)




    Nahaufnahme der Pin-Belegung.




    Nun, da die Verdahtung komplettiert ist, müssen wir uns um die Kommunikation kümmern, dazu gibt Kapitel 5 (Seite 11) Aufschluss. Jede Kommunikation mit dem EEPROM beginnt mit einer Rising Edge an S (Chip Select) während das Clock-Signal LOW bleibt. Jeder Übertragung geht ein Start-Bit (1) vorraus, welche an D (Data Input) anliegen muss bevor das Clock-Signal die Rising Edge antritt. Anschließend kann der OP-Code des jeweiligen Befehls übermittelt werden, im Falle des Read-Befehls die 10, gefolgt von der 6-bit langen Addresse an welcher man die Daten auslesen möchte.
    Da der 93C46 über Microwire kommuniziert und Microwire ein Sub-Set des SPI (Serial Peripheral Interface) ist, habe ich als erstes die SPI-Bibliothek und -Funktionen die der Arduino von Haus aus mitbringt ausprobiert und siehe da, es klappt. (CPOL = 0, CPHA = 0)
    Somit kann man sich eine enorme Menge an Bit-Banging sparen.
    Ich habe folgendes Programm für den Arduino geschrieben. Den Quellcode habe ich auf Englisch kommentiert, da ich mir die Möglichkeit offen gehalten habe diesen auch auf Englisch-sprachigen Foren zu posten und es ist schon aufwändig genug den Quellcode einmal zu kommentieren. Also warum nicht in der Sprache die Deutsche auch verstehen. (Außerdem bin ich Engländer und es fällt leichter technische Dinge auf Englisch zu erklären :P )



    Diesen Quellcode kann man direkt per Copy&Paste in die Sketch-Oberfläche des Arduino einfügen und auf den Arduino hochladen.
    Ausgeführt wird der Code, wenn man über "Tools" den Serial Monitor auswählt. (Oder Strg+Shift+M drückt)
    Das Ergebnis schaut dann so aus:




    Das Ergebnis sollte man per Copy&Paste in den Windows Editor einfügen und z.B. als "dump.txt" auf der Festplatte speichern. Das sind die Original-Daten die der EEPROM enthält. Sollte im späteren Verlauf etwas schief gehen, hat man zumindest dieses Backup und kann diese wieder aufspielen, somit geht nichts verloren.


    Nun der lustige Part.


    EEPROM verstehen


    Um diese Daten interpretieren zu können habe ich sie in einen HEX-Editor übertragen, der mir in echtzeit die Bytes als HEX, Dezimal, als Inverse der beiden und das ganze auch als Reverse-Byte anzeigen kann. Das wichtigste dabei sind die invertierten HEX Werte, da auf EEPROMs sehr häufig invertiert gespeichert wird.




    Nun schaut man nach sich-wiederholenden HEX-Folgen und kontrolliert in den invertierten HEX Werten ob man Zahlen des Kilometerstandes (75522) wiedererkennt. Und bingo:




    Diese Folge existiert 3 mal:




    Nun muss man sich gedanken machen was für eine Art Reihenfolge dahinter steckt. Nach ein wenig Spielerei und Testen konnte ich folgendes schlussfolgern:




    Die Reihenfolge in der gespeichert wird ist:
    Tausender, Hunderter, Zehner, Hundertausender, Zehntausender
    Zu den Einern konnte ich leider keine Verbindung finden und Änderungen der 3 Nibbles (Halb-Bytes) zwischen den Zehnern und Hundertausendern brachten wirre Ergebnisse. Zumindest lässt sich die Genauigkeit dieses Eingriffs nun auf 0-9 km bestimmen.
    Um die Methodik zu erklären:
    Der HEX Wert den wir isolieren konnten lautet AA DA FF F8. Jedes Nibble wird nun mit der Inversen-Tabelle unten invertiert. Die Inverse lautet somit 55250007.
    Diese wird nun nach oben stehendem System gesplittet und neu zusammen gefügt:
    5 * 1000
    5 * 100
    2 * 10
    0 * 100000
    7 * 10000
    =7552X


    Somit ist der zu ändernde Wert im EEPROM bestimmt und wir können mit der Überschreibung beginnen. Jedoch müssen wir die oben erklärte Methodik nun rückwärts anwenden um auf den HEX Wert zu kommen der in das EEPROM geschrieben werden muss.
    Ich habe mich dazu entschlossen keine Meilen ins EEPROM zu schreiben, sondern die KM, dazu später mehr.
    Wir erinnern uns, dass mein Galant 217.471 km auf der Uhr hat. Somit muss die 217471 nun gesplittet, neu sortiert und invertiert werden. Aus der 217471 wird 747XXX21, wobei jedes X ruhig eine 0 sein kann und invertiert wird daraus 8B 8F FF DE.




    Das "Verstehen" des EEPROMs ist damit abgeschlossen.

  • EEPROM schreiben


    Als erstes konsultieren wir Kapitel 5.2.1 (Seite 13) des Data-Sheet, dort steht, dass zum Schreiben des EEPROMs erst der Write Enable ausgeführt werden muss um den Schreibschutz aufzuheben. Danach kann der Write-Befehl ausgeführt werden und durch Write Disable der Schreibschutz wieder aktiviert werden.
    Laut Kapitel 5 (Seite 11) heißt das, dass als erstes der OP-Code 00 mit anschließender Addresse 11XXXX (Die letzten 4 bits der Addresse ignoriert das EEPROM, für die korrekte bit-Folge müssen sie aber mitgesendet werden) für den Write Enable übertragen werden muss. Danach der OP-Code 01 mit anschließenden 6 bits der Addresse an der der Wert überschrieben werden soll plus 16 bits an Daten die geschrieben werden sollen und zum Schluss der OP-Code 00 mit anschließender Addresse 00XXXX für den Write Disable.


    Ich habe folgenden Quellcode erstellt um Werte im EEPROM überschreiben zu können. Da es fast nicht möglich ist diesen Prozess zu automatisieren, habe ich mich dazu entschlossen die Addressen an denen überschrieben werden soll und die Werte mit denen die alten überschrieben werden sollen zu hardcoden. Das bedeutet es gibt keine Eingabemaske, oder ähnliches, sondern die Werte müssen im Quelltext selbst geändert werden.
    Man ändert in Zeile 80 also die Addresse an der man überschreiben möchte (im Binär-Format) und in Zeile 87 die Werte mit denen man die alten überschreiben möchte (im HEX-Format), uploaded den Quellcode auf den Arduino und führt ihn über den Aufruf des Serial Monitors aus. Das Programm zeigt nach dem Überschreiben die nun neuen Werte im EEPROM an, so kann man sich davon überzeugen, dass beim Überschreiben nichts falsch gelaufen ist. Ist alles korrekt, wiederholt man die Schritte mit der nächsten Addresse und den nächsten Werten.


    Möchte man also an Addresse "04" (6-bit Binär: 000100) den Wert "AF B8" schreiben, ändert man Zeile 80 zu:

    Code
    SPI.transfer(0b01000100);


    und Zeile 87 zu:

    Code
    SPI.transfer16(0xAFB8);


    Hier der Quellcode für Copy&Paste:



    Hat man alles richtig gemacht, sieht das Ergebnis so aus: (AA DA FF F8 mit 8B 8F FF DE überschrieben)




    So, das schlimmste ist überstanden. Nun kommen wir langsam zum Abschluss, alles muss wieder zusammengesetzt werden. Aber es bleibt Zeit für eine kleine Modifikation die das Leben erleichtert.


    Tacho Modifikation


    Um unser zukünftiges "Ich" zu verwöhnen löten wir den EEPROM nicht direkt auf die Platine, sondern löten stattdessen einen 4x2 Pin IC-Sockel auf die Platine. Es ist die gleiche Menge Lötarbeit wie den EEPROM direkt auf die Platine zu löten, jedoch hat es den Vorteil, dass man den EEPROM immer und zu jeder Zeit mit sanftem Hebeln eines Schlitzschraubenziehers wieder entnehmen und auf das Breadboard setzen kann. In meinem Fall war es Gold wert.




    Und beim Löten kann man sich immer Mühe geben um ein schönes Ergebnis zu erzielen. Der Kunststoff der IC-Sockel ist empflindlich, länger als eine Sekunde muss der Lötvorgang pro Pin nicht dauern, gerne noch weniger Kontaktzeit als eine Sekunde.




    Nun darf sich der EEPROM ins Bettchen legen.




    Das Ergebnis spricht glaube ich für sich. :gut




    Nun zum Spezial-Kapitel:


    Meilen-Konvertierung


    Wir erinnern uns, dass ich mich dazu entschlossen habe, den Kilometerstand in KM, anstelle von Meilen zu überschreiben. Hintergrund war die Überlegung, ob es nicht möglich ist dem Tacho beizubringen was ein Kilometer ist. Der Tacho muss schließlich eine Art Clock-Signal bekommen anhand dessen er weiß welche Strecke gefahren wurde, oder wie viele Umdrehungen des Rades eine zurückgelegte Längeneinheit ergibt.
    Die Lösung befand sich direkt auf der Tachofolie.




    Nun geht es darum die 1025 im HEX-Dump zu finden. Diesmal aber nicht in der reverse !HEX...




    Wert ist 3 mal vertreten.




    Nun folgt ein einfacher Dreisatz und die Konvertierung von Dezimal zu HEX.




    Und die Werte im EEPROM überschreiben.




    Und nach dem Einbau stellt man fest, dass der Kilometerzähler nun tatsächlich ein Kilometerzähler ist! :#
    Aber genau so stellt man auch fest, dass der Stellmotor der Tachonadel anscheinend kein rohes Clock Signal erhält, sondern ein von diesem Wert beeinflusstes Signal des EEPROMs... Im Klartext heißt das, der Tacho zeigt bei Tempo 50 nun 50 mph auf der großen Skala und 80 kmh auf der kleinen...


    :%


    Heißt für mich entweder, 1) den tatsächlichen Kilometerstand in Meilen umrechnen, neu beschreiben, die 1025 wieder eintragen und damit leben, dass der Kilometerzähler ein Meilenzähler ist, oder 2) ein Breakout-Board mit einem zweiten EEPROM anfertigen auf dem die 1025 eingetragen ist und auf das der Stellmotor zugreift, während der echte gefahrene Kilometerstand im ersten EEPROM bestehen bleibt. Bedeutet natürlich ein erhebliches Reverse-Engineering der Tacho-Platine, aber es kommt bestimmt mal wieder irgendwann ein Urlaub in dem ich Zeit habe.
    Werde Möglichkeit 1 morgen umsetzen, damit ich in der Zwischenzeit eine Korrekte mph-/ kmh-Anzeige habe und meine gefahrenen Meilen aufgezeichnet werden. Sollte ich mich dazu entschließen Möglichkeit 2 umzusetzen, werde ich hier ein weiteres Kapitel anfügen.


    Fazit


    Was ist mein Fazit? Arbeit hat sich gelohnt.
    Urlaub ist nicht langweilig und ich hab was gelernt, das sind zwei meiner Lieblingsdinge im Leben.
    Ich hoffe ich konnte einige hier animieren, motivieren, mobilisieren, stabilisieren.
    Ich sage danke an alle die bis hier her gelesen haben. In dieses Tutorial ist mindestens dreimal so viel Zeit geflossen wie in die ganze Tacho-Aktion an sich. Die Photos, die Screenshots, den Quelltext kommentieren, die Photos und Screenshots hochladen und diesen Text hier zu verfassen und zu formatieren waren ein ganzes Stück Arbeit, aber solange es mindestens einem geholfen hat und einen anderen gut unterhalten hat, war es die Arbeit wert.


    Liebe Grüße,


    Metatr0n


    :GN