![]() |
KI hat schon auch seine Vorteile, aber man muss sich halt im Klaren darüber sein, dass die auch nur wiederkäut, was die Mehrheit im Netz glaubt richtig zu sein. Auch mit KI hat selber denken und kritisch hinterfragen nach wie vor seine Vorzüge. |
Super das es geklappt hat. Ich hätte mich auch freundlicher ausdrücken können. Leider legen im Moment zu viele Leute vertrauen in die ki-antworten, die insbesondere bei solchen spezifischen Dingen völlig versagen. Viel Spaß mit dem korrekt laufenden Tacho und dem 5 Zylinder. |
Zitat:
Nu werd ich am ende noch sehen ob man die kmh noch etwas mit der k Zahl korrigieren kann . Fahr zwar schon 2 Jahre auf den 17er aber hab da nie wirklich drauf geachtet obs passt |
Zitat:
|
Hab grad gesehen das meine Uhr jetzt aber auf 12h is keine 24h wie bekomm ich das auf 24h zurück |
Zitat:
Vermutlich hast du dort im Moment "40" stehen, obwohl dein ursprünglich ausgelesener EEPROM Dump dort die "48" hatte. Die Logik dahinter ist wie folgt: Binäre Codierung: 01000000 - EU 00100000 - Break Test "ja" 00010000 - unbekannt 00001000 - 24h 00000100 - unbekannt 00000010 - °F 00000001 - unbekannt (hat was mit dem Verbrauch der MFA zu tun) Für deinen brauchst du 24h, Break Test "nein", °C. Also: 01001000 Umgerechnet von Binär auf Hexadezimal = "48" |
Zitat:
Weißt Du, wie die Wegstreckenzahl für Deine Reifendimensionen berechnet wird? |
Zitat:
Erste mal lesen 0048 Dann hatte ich ich die 1048 ein getragen Auf 0048 geändert weil ih ja wissen wollte was mir die ki da fürn misst erzählte Dann wieder gelesen stand da 0000 unddie 0x17 dann wieder auf serie zurück Aber nur die 0x00 geändert und nicht auf 0x01 geachtet daher vermutlich die falsche Uhr Danke werd das mal berichtigen Hab auch mfa wenn ds wichtig ist |
Zitat:
Also hab ich aktuell 3862 als wegstreckenzahl . Wen ich deinen Text jetzt folgen konnte ? Ich müsste tatsächlich mal gucken welche Reifen größe ich habe. Weiß ich aus dem Kopf gerade nicht . Glaube aber 195/40R17 zu haben. (Grad nach gesehen sind tatsächlich 195/40R17) Grüße |
Zitat:
Wenn es Dich interessiert, wie die Zahl zustande kommt: der Geschwindigkeitsgeber liefert pro Radumdrehung 7 Impulse, der Abrollumfang Deiner Räder beträgt 1,8466m. 1000/1,8466x7= 3791 Impulse pro km. Die aktuell programmierte Wegstreckenzahl kannst Du im versteckten Menü abrufen, das wurde weiter oben schon beschrieben, wie das geht. |
Zitat:
|
Super interessant was hier alles schon rausgefunden wurde! Ich habe einen Caddy 9KV und der hat auch den Golf3 Tacho. Ich habe hier einen von VDO und das Eeprom ist in der DIP8 Bauform. Ich moechte das Eeprom NICHT ausloeten. Ich kenne meine Staerken und Schwaechen und das Ausloeten geht im Zweifellsfall nicht gut aus. Ich suche jetzt verzweifelt eine Klammer, finde aber immer nur Klammern fuer die SOP8 Form. Es gibt bei Ebay was aus China aber von da was zu bestellen ist fuer mich in Spanien nicht sinnvoll, da fallen ueber 30 Euro Gebuehren fuer ein paar Cent Abgaben an. Programmer mit besagter SOP8 Klammer ist vorhanden...... Kennt jemand da was? |
Eine DIP8-Klammer zu finden ist tatsächlich nicht so einfach. Alternativ kannst Du beim VDO-Tacho aber relativ problemlos Litzen an die EEPROM-Kontakte anlöten, da der Chip frei zugänglich auf der Rückseite sitzt. Da ich relativ viel an Platinen herumlöte, habe ich mir eine beheizte Entlötpumpe für 15EUR zugelegt, das funktioniert super und empfehle ich jedem weiter, der ab und zu was auslöten muss. Wenn ich an einem Golf3-VDO-Tacho was machen muss, löte ich den EEPROM immer aus und setze einen Sockel ein. |
Hallo zusammen, ich wollte dieses Topic hier ein bisschen zum Leben erwecken. Ich habe früher schon einige Mercedes-KIs von VDO reverse-engineered. Ich habe auch noch ein altes Vento, das in meiner Heimat auf mich wartet. Vor Kurzem habe ich entschieden, dass die Karre unbedingt ein KI-Upgrade braucht :D, und habe ein VDO-KI vom Golf 4 Cabrio gekauft. Dann wollte ich herausfinden, wie dort alles gespeichert ist, wie man die K-Zahl anpasst usw. Erstmal vielen Dank an alle Beteiligten, die hier schon vieles herausgefunden haben. Ich habe hier aber ein paar Sachen gesehen, die mich ein bisschen gestört haben. Zum Beispiel hat GTFahrer herausgefunden, wie man das Plateau entfernt, aber die Reihenfolge der Bytes sah merkwürdig aus. Ich will versuchen zu erklären, warum das so ist, und dann noch ein paar Sachen mitzuteilen, die, glaube ich, noch nicht bekannt waren, z. B. wie man das geheime Menü um weitere Werte erweitern kann. Zuerst: Die Entscheidung, alle Bytes im Dump zu swappen, war nicht so gut. Nicht böse gemeint — sorry, Deutsch ist nicht meine Muttersprache. Am Anfang denkt man, dass es besser wird, wenn man alle Bytes swappt, weil man Werte wie K-Zahl, Kilometerstand usw. dann besser sieht. Das gilt aber nur für 2-Byte-Werte. Dabei macht man die 1-Byte-Werte, insbesondere Arrays, kaputt. Der Grund dafür ist, dass die CPU eine Little-Endian-Architektur hat. Deswegen werde ich hier die originalen Dumps ohne Swapping zeigen, und man sieht, dass viele Sachen sofort klarer werden. Hier ist ein Screenshot von der App ImHex. Damit kann man die Werte in der Binärdatei sehr einfach mit einem Pattern hervorheben. https://i.postimg.cc/sx0rPW73/Screen...t-00-42-51.png Wir achten jetzt auf die Arrays 0x2C–0x30, 0x31–0x35 und 0x36–0x3A. Code: 50 76 97 B9 F0Wenn man sich das zweite Array noch genauer anschaut, sieht man dort folgende Dezimalwerte: 130, 107, 90, 75, 50. Das sind doch die Temperaturwerte! Ich weiß nicht, wofür sie hier benötigt werden, weil keine Temperatur auf dem LCD angezeigt wird, aber egal — sehr wahrscheinlich werden sie für uns noch unbekannte Zwecke benutzt. Array 3 zeigt genau das, was GTFahrer und andere schon vermutet haben: Schrittmotorwerte für die jeweilige Temperatur aus Array 2. Man kann jetzt aber sehr gut diese Plateau-„Funktion“ erkennen: 95 95 95. Der Maximalwert 0xE3 passt auch logisch gut: Für 130 Grad braucht der Zeiger mehr Ausschlag als für 50 Grad. Was noch bleibt, ist Array 1. Das sind die ADC-Werte für den Temperatursensor. Die MCU kann den Widerstand nicht direkt messen, aber sie kann mithilfe des ADC die Spannung messen. Ich habe dann die Platine getraced und folgendes Schema herausgefunden: https://i.postimg.cc/S2QxXbBw/Screen...t-22-17-27.png Der Sensorwiderstand bildet dann zusammen mit den zwei anderen Widerständen auf der Platine die vom ADC gemessene Spannung. Ich habe kein Datenblatt für den Mikrocontroller gefunden, aber ich ging davon aus, dass dort ein 8-Bit-ADC eingebaut ist, weil der Controller schon ziemlich alt ist. Der maximale Wert des ADC wäre also 255 bzw. 0xFF. 0 würde 0 V bedeuten und 0xFF 5 V … dachte ich mir am Anfang :D Laut verfügbarer Info hat der Sensor bei 130 Grad ca. 50 Ohm und bei 90 Grad ca. 120 Ohm. Das kann von Sensor zu Sensor variieren, weil sie nicht exakt gleich sind. Also haben wir drei Widerstände: 50, 174 und 523 Ohm sowie 5 V. Das ergibt 1,04 V. Der ADC-Wert müsste dann 1,04 / 5 * 255 = 53 sein, was in Hex 0x35 ist — nicht 0x50. Wenn man aber statt 5 V 3,3 V nimmt, dann ergibt 1,04 / 3,3 * 255 = 80, also 0x50. Dann passt alles. Ich habe es zuerst über einen anderen Weg herausgefunden, den ich hier überspringe. Wenn man später also 3,1 V in Kommentaren sieht — nicht wundern. Ich habe dann auch die Spannungen an allen MCU-Pins gemessen und 3,0 V bzw. 3,3 V gesehen. Übrigens: Um alles zu testen, hatte ich kein 500-Ohm-Poti, sondern nur ein 10-kOhm-Poti. Das ist für diesen Zweck nicht gut geeignet, weil für uns der Bereich zwischen 50 und 300 Ohm interessant ist. Ich habe es dann aber so gelöst, dass ich die zwei Widerstände mit 174 und 523 Ohm ausgelötet und dort das 10-kOhm-Poti eingelötet habe. Somit kann ich eine beliebige Spannung von 0 bis 5 V an den ADC senden. Ich habe dann alle Werte noch einmal geprüft, und es passt alles. Also funktioniert es so: Der Sensor bildet zusammen mit den zwei Widerständen eine Spannung, die vom ADC gemessen wird. Das erste und dritte Array bilden eine interpolierte Kennlinie für ADC → Schrittmotorwerte, und das zweite und dritte Array für ADC → Temperaturwerte. Um die Plateau-Funktion zu entfernen, muss man einfach das zweite und vierte 0x95 durch den richtigen interpolierten Wert ersetzen. Laut meiner Berechnung ergibt das dann folgendes Array 3: Code: E3 B4 95 77 30Es wurden dann auch die Werte für die Warnleuchte bei hoher Temperatur herausgefunden. Es gibt zwei davon: Byte 0x44 und 0x45. 0x44 ist der ADC-Wert, bei dem die Leuchte angeht, und 0x45 der Wert, bei dem sie wieder ausgeht. Das bildet also eine Hysterese. Mit der Temperaturanzeige sind wir fertig. Jetzt kommt die Tankanzeige. Die Arrays 0x1C–0x20, 0x21–0x25 und 0x26–0x2A wurden ebenfalls herausgefunden. Gleiches Spiel … Die Widerstände für die Tankanzeige sind in diesem Fall 255 Ohm an 5 V und 2,61 kOhm an GND. Die Spritmenge wird im Bereich 0x21–0x25 in Viertellitern dargestellt. Ein Wert von 4 bedeutet also 1 Liter. Dann wurde herausgefunden, dass Byte 0x2B die Spritmenge definiert, bei der die Tankleuchte angeht. Auch hier in 1/4 Litern. 0x1C bedeutet also 7 Liter, was mit allem zusammenpasst. Nächstes Thema: Kühlmittelmengen-Warnleuchte. Der Sensor dafür ist sehr genial! Es sind einfach zwei Elektroden, die im Kühlwasserbehälter eingebaut sind. Eine ist mit Masse verbunden, die zweite geht zum KI :D Ah … es misst einfach den Widerstand des Wassers, ähnlich wie bei der Temperatur- und Tankanzeige. Wenn der Wasserstand stimmt, ist der Widerstand niedriger, und umgekehrt. Es ist aber nicht so einfach, wie ich zuerst dachte. Das Schaltbild sieht wie folgt aus: https://i.postimg.cc/BLhQHwsj/Screen...t-23-17-56.png Die MCU erzeugt ein Signal mit einer Periode von 200 ms. Dieses geht durch einen Widerstand zum Kondensator und dann noch durch einen weiteren Widerstand zum ADC-Pin der MCU. Die andere Seite des Kondensators geht zur Elektrode und wird über das Kühlmittel mit Masse verbunden. Wenn dort keine Verbindung besteht, sieht das Signal am Kondensator so aus: https://i.postimg.cc/CBvLk6Yx/Screen...t-00-39-15.png Und so sieht es aus, wenn es komplett mit Masse verbunden ist: https://i.postimg.cc/LYy6L0Rs/Screen...t-00-39-18.png Die MCU achtet auf die positive Flanke des Signals. Noch einmal vergrößert: Ohne Masse: https://i.postimg.cc/k6jXKh94/Screen...t-00-38-57.png Mit Masse: https://i.postimg.cc/XG27dD37/Screen...t-00-38-53.png Die Spannung wird 2 ms, nachdem die MCU den High-Level eingeschaltet hat, vom ADC der MCU gemessen. Man sieht: Im ersten Beispiel ist die Spannung >4 V. Das ist mehr, als der 3,3-V-ADC messen kann, deswegen wird der Wert 255 sein. Im zweiten Beispiel sieht man eine Spannung von ca. 1,7 V. Das ergibt einen ADC-Wert von 131. Dieser Wert wird mit Byte 0x43 verglichen. Wenn er nach einer bestimmten Zeit größer ist, blinkt die Kühlwasserwarnleuchte. Wie habe ich das zuerst herausgefunden? Diesen Wert sieht man im erweiterten Geheimmenü — dazu später mehr. Ich habe dann bemerkt, dass dort zuerst 255 angezeigt wurde. Später sah ich 132. Dann habe ich den verantwortlichen Pin herausgefunden, und dann ging es los. Danach habe ich herausgefunden, wie das Verbrauchssignal funktioniert, sowie auch die Konstante dafür im EEPROM. Das Motorsteuergerät sendet positive Impulse an das KI. Das KI berechnet das Tastverhältnis, und dieses wird mit einer Konstante für 100 % Tastverhältnis multipliziert. Die Konstante befindet sich bei Byte 0x1D und wird in 2 ml/s dargestellt. 0x0D bedeutet also 26 ml/s oder 93,6 l/h — der maximal mögliche Verbrauch. Bei einem Tastverhältnis von 1 % beträgt der Verbrauch 0,936 l/h usw. Und jetzt kommen wir zum Erweitern des versteckten Menüs. Um es zu aktivieren, muss man bei Byte 0x02 ein Bit mit der Bitmaske 0x80 hinzufügen. Wenn dort also 0x0E steht, muss es 0x8E werden. Und das war’s. Man geht in das Menü, in dem K-Zahl usw. stehen, und plötzlich sieht man neue Werte unter den Nummern 9, 10 und 11: Code: 9 - Tankinhalt in LDas ergibt die Position des Zeigers. Die K-Zahl ist natürlich nur für den Tacho relevant. RPM habe ich noch nicht getestet. Vielleicht ist es von der Zylinderanzahl abhängig. Es gibt noch andere kleine Sachen, die ich in der Pattern-Datei für ImHex beschrieben habe und hier nicht erwähnt habe. Ich habe versucht, dort alles zu sammeln, was ich auch von anderen in diesem Forum gefunden habe. Manche Sachen habe ich aber noch nicht getestet. Und es gibt natürlich noch mehr zu entdecken. Zum Schluss wollte ich noch erzählen, dass ich das Protokoll von VDO.EXE reverse-engineered habe, aber darüber vielleicht später mehr. Es hat schon viel Zeit gekostet, das alles zu beschreiben :) Aber einfach zur Info: Ich habe es hinbekommen, die Bytes mit einem Arduino zu schreiben und zu lesen. Leider darf man bei SW-Version 3.9 im Bereich von 0x5C bis zum Ende nicht schreiben, also kann man den Kilometerstand nicht ändern :D Ich werde versuchen, später ein GitHub-Repo zu eröffnen, in das ich den Arduino-Code sowie diese Pattern-Datei hochlade, damit wir es zusammen erweitern können — falls sich überhaupt noch jemand für solche alten Autos interessiert :D Ich hoffe, es war interessant und hilfreich :) VG Vlad Und hier ist Pattern-Datei: Code: bitfield RegionalConfig_t { |
| Alle Zeitangaben in WEZ +2. Es ist jetzt 03:46 Uhr. |
Powered by vBulletin®