wtorek, 22 kwietnia 2014

EasyRTP dla ECU Hondy OBD1

Za napisanie tego posta zabieram się już od dłuższego czasu ale jakoś zawsze wylatuje mi to z głowy. Nie jest to pierwszy raz kiedy temat EasyRTP jest poruszany na tym blogu, było to już omawiany przy Civica Turbo ale pojawiło się kilka pytań i pomyślałem, że warto trochę dokładnie to opisać aby uświadomić czytelnikom, że nie taki diabeł straszny jak może się wydawać na pierwszy rzut oka.


Zanim przejdziemy do samego EasyRTP, potrzebne będzie małe wprowadzenie do ECU Hondy oraz ogólnie RTP.

ECU OBD1

Na pokładzie komputera oznaczanego potocznie OBD1 (np. P06, P28) stosowanego w Hondzie znajduje się procesor M66207, 16-bitowy, 32kb rom, 1024 bajty ram - stosunkowo prostu i wolny jak na dzisiejsze standardy. Jednak dzięki różnym trickom programistycznym oraz optymalizacji kodu (przede wszystkim obliczeń matematycznych) bez problemu jest w stanie on sterować silnikiem który rozkręca się do 8tyś obrotów.

Zewnętrzny EEPROM

Domyśle procesor M66207 używa swojej wewnętrznej pamięci ROM i z niej startuje. Honda na szczęście przewidziała na płycie ECU możliwość podłączenia zewnętrznej pamięci - typowego EEPROM-u w postaci kostki 27C256 na którą można wgrać program za pomocą programatora np. Willem. Dzięki temu możliwy jest w miarę prosty tuning parametrów silnika, gdyż nie trzeba zmieniać kodu zaszytego w procesorze a wystarczy jedynie wymieniać kod w EEPROM'ie.

Pomimo, że jest to operacja prosta i dość tania, to niestety jest czasochłonna:
  1. Zatrzymać samochód
  2. Odłączyć ECU
  3. Wyjąć EEPROM
  4. Skasować EEPROM za pomocą kasownika UV
  5. Wgrać nowy wsad za pomocą programatora
  6. Włożyć EEPROM do ECU
  7. Podłączyć ECU
  8. Odpalić samochód
Oczywiście można przyspieszyć trochę cały proces używając kilku kostek (kasowanie trochę trwa) czy też używając pamięci FLASH zamiast EEPROM-u. Niestety nawet pomimo tych usprawnień wciąż wymagane jest wyciąganie kostki z ECU. I tutaj właśnie pojawia się koncepcja RTP.

RTP = Real Time Programming

W ogólności RTP oznacza możliwość zmiany programu (zarówno kodu jak i danych) w czasie rzeczywistym bez zatrzymywania pracy procesora. W praktyce zazwyczaj zmienia się jedynie dane (parametry) a kod programu pozostaje taki sam. Dlaczego?

Zmiana kodu w locie, szczególnie aktualnie wykonywanego jest niebezpieczna.

Wyobraźmy sobie sytuację w której aktualnie wykonywana pętla obsługi zapłonu jest nadpisywana przez kod do obsługi wtrysków. Nawet przesunięcie kodu o jedną instrukcje może skończyć się niespodziewanym efektem. Dlatego w przypadku wymiany kodu sterującego, potrzebny jest reset i zazwyczaj do wgrywania go służy bootlaoder którym sam siebie nie nadpisze.

Warto przypomnieć, że w przypadku M66207 nie ma rozdzielnia pomiędzy pamięcią kodu a pamięcią zmiennych - to wszystko jest razem w obrębie jednego bloku. Dlatego też parametry związane w obsługą wolnych obrotów mogą być gdzieś w środku tych 32kb a natomiast mapy paliwowe czy zapłony gdzieś pod koniec. Sprawia to, że trzeba uważać aby nie nadpisać za dużo.

W Crome'ie można zainstalować dodatkowe feature'y do ROM-u. Wgranie takiego zmodyfikowanego ROM-u w czasie rzeczywistym może skończyć się zawieszeniem procesora i przerwaniem pracy silnika.

Często stosowanym rozwiązaniem jest używanie bootloadera do wgrywania nowego programu natomiast zmiana parametrów (map) jest możliwa poprzez protokół komunikacyjny którym zazwyczaj producenci się nie chwalą. Jako medium transmisyjne może służyć CAN, linie K i L w OBD, RS232 (i wariacje w tym także USB). W przypadku Hondy i EasyRTP będzie to właśnie RS232 działający z logiką 5V (potocznie TTL) który zazwyczaj jest podłączany do komputera PC za pomocą przejściówki RS232-USB (o tym za chwilę).

Honda w OBD1 nie przewidziała żadnego protokołu do zmiany parametrów (a przynajmniej nie jest on powszechnie znany) , nie wiadomo też nic o sposobie wgrywania nowego kodu do procesora (jest tylko możliwość zmiany kości EEPROM). Dlatego w tym przypadku do wyboru mamy dwa rozwiązania:
  • zewnętrzny moduł RTP
  • wewnętrzny moduł RTP - EasyRTP

Zewnętrzny moduł RTP

Jest kilka tego typu konstrukcji. Przykładem może być NeptuneRTP czy też jego następca Daemon. Można pokusić się także o zbudowanie własnego. Nie będę tutaj wnikał w szczegóły jak działa to czy inne rozwiązanie a przedstawię jedynie ogólny schemat.

Zewnętrzny moduł RTP podpinany jest zamiast EEPROM-u i przez procesor ECU widziany jest jako pamięć EEPROM. Z drugiej strony jest układ który pozwala w locie zmieniać zawartość tej pamięci w taki sposób aby ECU nie miało przestojów w pracy. Można to realizować za pomocą modułów SRAM z obsługą dwóch kanałów lub poprzez używanie dwóch jednokanałowych modułów SRAM i przełączanie ich pomiędzy ECU a kontrolerem RTP. W uproszczeniu działa to tak:
  1. ECU startuje z banku nr 1
  2. Użytkownik zmienia mapy i inne parametry, RTP cały czas zapisuje to w banku nr 2
  3. Gdy wszystkie parametry (mapy) są już poustawiane RTP czeka aż ECU skończy odczyt komórki i przełącza banki - musi to zostać zrobione szybko i dobrze zsynchronizowane
  4. ECU teraz pracuje z bankiem nr 2 nie będąc nawet świadomym zamiany
  5. RTP wpisuje do banku nr 1 zawartość banku nr 2 którą trzyma w pamięci RAM aby oba banki miały taką samą zawartość
  6. Tutaj następuje skok do punktu nr 2
Pierwszy problem jaki się pojawia to start. Pamięć SRAM jest bardzo szybka (szybsza od EEPROM-u) ale traci swoją zawartość po zniknięciu zasilania. Można tutaj stosować baterię  podtrzymującą lub po prostu ładować zawartość do SRAM-u przy włączaniu RTP (np. z pamięci FLASH albo bezpośrednio z PC). Wymaga to niestety trochę czasu, dlatego często RTP musi zostać uruchomione zanim zostanie włączone ECU.

Drugi problem to przełączanie banków które musi zostać zrealizowane w odpowiednim momencie tak aby ECU nie zanotował błędu odczytu.

Trzeci problem to właściwie cecha wszystkich RTP,  jeśli chcemy zmienić sam kod to w sumie należy to robić na wyłączonym ECU i dopiero po wgraniu kodu do RTP podać napięcie dla ECU - w przeciwnym przypadku możemy mieć doprowadzić do zawieszenie się ECU co samo z siebie nie jest problemem, chyba że akurat wchodzimy w zakręt.

Zdecydowanym plusem zewnętrznego RTP jest łatwość instalacji i brak ingerencji mechanicznej w ECU (w przeciwieństwie do EasyRTP). Minusem natomiast jest cena.

Wewnętrzny moduł RTP - EasyRTP

Jest to rozwiązanie wychodzące z założenia, że parametry (mapy) powinno dać się zmieniać za pomocą protokółu komunikacyjnego bez potrzebny używania zewnętrznych modułów. Honda nie przewidziała takiej możliwości jednak kilka pomysłowych osób wymyśliło w jaki sposób zmodyfikować płytę ECU w taki sposób aby proces M66207 mógł nie tylko odczytywać z zewnętrznej kości EEPROM ale także do niej zapisywać. Aby było to możliwe potrzebne są dwie zmiany, które pociągają za sobie kilka dodatkowych:
  • EEPROM musi zostać wymieniony na coś łatwo zapisywalnego
  • Linia WRITE ENABLE musi zostać doprowadzona do EEPROM-u, domyślnie płyta ECU nie obsługuje tej linii
Dodatkowo kod do obsługi RTP musi być umieszczony w ROM-ie (w pamięci EEPROM lub zamieniku) oraz cały ROM musi być wgrany do EEPROM-u na stole.

EasyRTP nie zadziała z pustą kością - pierwszy raz kod musi zostać wgrany za pomocą zewnętrznego urządzenia.

Warto nadmienić, że poniższy opis EasyRTP bazuje na materiałach z PGMI.ORG, w szczególności na instrukcji montażu oraz wykonania modułu EasyRTP.

Zamiast EEPROM-u

Użyjemy NVRAM, np. DS1230Y w obudowie DIP-28 - zgodnej rozmiarem i rozstawem nóg z obudową EEPROM-u. Pamięć ta ma własne wewnętrze podtrzymywania i jest łatwa w zapisie (nie trzeba jej kasować w specjalny sposób). W poprzednim poście o EasyRTP pisałem, że była trudno dostępna ale udało mi się zamówić sample, natomiast teraz widzę, że jest dostępna np. w TME. Warto się tylko upewnić, że jest to kość przewidziana na niskie temperatury jeśli zamierzamy jej używać w zimę. Ogólnie zalecenie to dotyczy wszystkich komponentów EasyRTP.

Linia WE

Tutaj jest cały trick. ECU jedynie odczytuje z EERPOM-u więc jak zmusić go do zapisu, skoro nie ma doprowadzonej linii WE (Write Enable) do EEPROM-u? Sam procesor ma oczywiście linie WE (oznaczona jako WR) ale używana jest ona do sterowania układem M82C55.


W jakiś sposób musimy czasami używać linii WR do sterowania NVRAM a czasami do M82C55. Potrzebny jest przełącznik którym będzie można sterować za pomocą inne linii najlepiej niewykorzystywanej obecnie. Analizując ścieżki na płycie ECU oraz poszczególne scalaki w końcu można zauważyć, że linia A15 (pin 16 na M66207) nie jest wykorzystywana, gdyż adresowanie EEPROM-u kończy się na A14.

Dzięki temu linię A15 można wykorzystywać do przełączania układu docelowego dla sygnału WR i to właśnie dlatego potrzebne jest lutowanie kabelków oraz cięcie ścieżki na płycie ECU.

Przełączanie linii WR to cała tajemnica działania EasyRTP.

Znając już koncepcję działania pozostaje złożyć to wszystko razem.

Budujemy EasyRTP

Schemat w formacie Eagle (istnieje wersja darmowa do celów niekomercyjnych) można pobrać z PGMFI.ORG. Poniżej znajduje się screenshot przestawiający jak to wygląda. Jak funkcję przełącznika pełni tutaj 74HC00.

Źródło: http://wikitest.pgmfi.org/twiki/bin/view.pl/Library/EasyRtpV10
Kolejnym krokiem jest wytrawienie płytki oraz zalutowanie potrzebnych elementów. Procesu trawienia nie będę tutaj opisywał jako, że jestem początkujący w tej kwestii i nie wychodzi mi to jeszcze za dobrze. Jeśli chodzi o części to potrzebne są:
  • wytrawiona płytka
  • DS1230Y/AB od 70ns do 120ns w obudowie DIP28
  • 74HC00 THT w obudowie DIL14 (IC2 na schemacie)
  • 2x ceramiczne kondensatory 0.1uF do montażu przewlekanego (C1 i C2 na schemacie)
  • 3x rezystor 10k do montażu przewlekanego (R1, R2 i R4na schemacie)
  • 2x 1x14 goldpiny o rozstawie nóżek takim samym jak w DIP28 aby można było włożyć je w podstawkę EEPROM
  • 1x rezystor 100k do montażu przewlekanego (R3 na schemacie)
  • 1x tranzystor NPN - np. 2N4401, BC337 (Q1 na schemacie)
  • 1x dioda 1n4148 lub podoba (D1 na schemacie)
  • 2x gniazdo potrójne aby można było podłączyć kable idące do ECU (JP1 na schemacie)
  • 1x wtyczka z trzema kablami do gniazda powyżej
Jeśli ktoś czuje się na siłach - istnieje opcja montażu na płytce uniwersalnej.

Dlaczego wpisałem 2x gniazdo potrójne? Aby można było zrobić zworkę w sytuacji gdy demontujemy EasyRTP. Oczywiście można włożyć kabelek we wtyczkę aby połączyć dwa skrajne piny (WE_IN i WE_OUT) ale gniazdo jest bezpieczniejsze chociażby dlatego, że ma mini zatrzask.

Samo lutowanie nie jest jakieś problematyczne a poszczególne kroki wraz z obrazkami można znaleźć na tej stronie, ale wydaje mi się, że sam schemat w zupełności wystarczy.

Co nam powstanie? Taki oto potworek - wybaczcie jakoś płytki, trochę się z nią namęczyłem.



Montujemy w ECU

Jak już zostało wyjaśnione, cały trick polega dociągnięciu trzech kabli oraz przecięciu jednej ścieżki. Niestety nie mam własnego zdjęcia jak to wygląda po zamontowaniu dlatego posłużę się zdjęciem z pgmi.org. Na tej stronie można także znaleźć zdjęcia ilustrujące poszczególne kroki.

Źródło: http://wikitest.pgmfi.org/twiki/bin/view.pl/Library/EasyRtpInstall
  1. Tniemy ścieżkę pomiędzy nogą numer 25 układu M66207 a nogą numer 38 układu M82C55 
  2. Lutujemy kabel (np. czerwony) do nogi numer 25 układu M66207 a drugi koniec montujemy we wtyczce w pinie WE_IN (najbliżej CPU)
  3. Lutujemy kabel (np. niebieski) do nogi numer 16 układy MM66207 a drugi koniec montujemy we wtyczce w pinie A15 (środkowy)
  4. Lutujemy kabel (np. żółty) do nogi numer 38 układu M82C55 a drugi konie montujemy we wtyczce w pinie WE_OUT (najdalej od CPU)
  5. Programujemy EasyRTP jak zwykły EEPROM 27C256 za pomocą programatora
  6. Wkładamy EasyRTP w podstawkę i podpinamy kabel
  7. Gotowe 

Linia datalogging - CN2

Jeśli nie podłączyliśmy jeszcze żadnego modułu pod tą linię, to czas to zrobić. Ogólnie wyjście CN2 jest to wyjście zgodne logicznie z RS232 ale używające logiki 5V (TTL). Aby móc połączyć się z tym poprzez USB potrzebna jest przejściówka zbudowane na bazie FT232.


Ważne aby to była wersja układu która dobrze działa pod Windowsem 8 i 10 (na rynku zdarzają się jeszcze starocie, trzeba na nie uważać). Samo łącze CN2 ma 5 pinów:
  1. Masa
  2. RX (dane z PC do ECU)
  3. +5V
  4. TX (dane z ECU do PC)
  5. Nie używane
Przejściówkę należy skonfigurować za pomocą zworki do pracy z sygnałami 5V (zworka JP1). Jeśli przejściówka ma być zasilana z USB (zworka JP2), to nie należy podłączać pinu nr 3 ze złącza CN2. Natomiast jeśli zasilanie z USB jest odpięte, to należy wykorzystać 5V oferowane przez ECU.

Jeśli nie wiadomo jak jest ustawiona zworka zasilania, to najlepiej nie podłączać pinu nr 3 z CN2. Wtedy jeśli po podłączeniu modułu do komputera, urządzenie zostanie rozpoznane przez system operacyjny, to znaczy że jest zasilane z USB.

Wystarczy odpowiednio podłączyć kabelkami przejściówkę FT232 - USB i gotowe.

Jak używać EasyRTP?

Pierwszy na myśl przychodzi Crome'a. Niestety w moim przypadku Crome nie był w stanie wgrać nowego wsadu (pomimo, że odczytywał stary bez problemu). Dlatego stworzyłem własny program który zajmował się wgrywaniem zmian natomiast Crome był używany do modyfikowana map. Działało to całkiem sprawnie. Jedynie należy pamiętać, że port COM nie jest współdzielony dlatego w momencie wgrywania nowych map należy przerwać logowanie we FreeLogu czy innym programie.



Sam program jest mały, ale biblioteki Qt trochę ważą. Nie wiem też czy zadziała na Windows XP.

Jeśli chodzi o używanie, to w programie są trzy przyciski :
  • Read - odczytuje BIN z ECU, to trochę trwa, sugeruję zrobić to przynajmniej raz
  • Read File - odczytuje BIN z pliku, jeśli wiadomo, że na pewno taki jest w ECU to można wczytywać z pliku zamiast z ECU, jest szybciej
  • Upload - wgrywa całość od zera, prawie nigdy nie działa poprawnie gdyż ECU źle znosi nadpisywanie programu
  • Upload Changes - w sumie najczęściej używana opcja, sprawia, że do ECU wysyłane są tylko zmiany
Jeśli chodzi o typowe używanie całego zestawu to u mnie wyglądało to tak:
  1. Ładujemy plik BIN programatorem do EasyRTP
  2. Montujemy EasyRTP do ECU
  3. Odpalamy
  4. Podpinamy się PnP@RTP
  5. Klikamy Read (sugeruję to zrobić chociaż raz aby upewnić się, że działa, później można robić Read File).
  6. Otwieramy BIN w Cromie, zmieniamy co chcemy, zapisujemy
  7. W PnP@RTP klikamy Upload Changes
  8. Włączamy FreeLog i jeździmy obserwując co się dzieje jednocześnie nanosząc zmiany w Crome
  9. Gdy chcemy wysłać poprawki do ECU:
    1. zatrzymujemy samochód (niech chodzi na wolnych obrotach)
    2. przerywamy logowanie w FreeLog,
    3. klikamy Upload Changes w PnP@RTP
    4. włączamy logowanie w FreeLog
    5. jedziemy dalej
Program można pobrać w jednym z następujących formatów:
- instalator MSI
- wersja przenośna w postaci archiwum 7-zip

Uwaga! Wersja przenośna wymaga ręcznej instalacji Visual C++ Redistributable - potrzebna jest wersja x86 nawet na systemach x64. Instalator MSI wszystko instaluje sam, ale doszły mnie słuchy, że nie działa na niektórych niezaktualizowanych systemach.

Demontaż EasyRTP

Gdy skończymy tuning i wszystkie parametry są takie jak być warto rozważyć demontaż EasyRTP i zastąpienie go zwykłym EEPROM-em. Poza wyjęciem modułu i włożeniem EEPROM-u trzeba jeszcze założyć zworkę na wtyczkę pomiędzy skrajnymi pinami - WE_IN i WE_OUT (czerwony i żółty kabel). Najlepiej wykorzystać do tego drugie gniazdko które możemy nawet gdzieś przykleić na klej termiczny.

EasyRTP FAQ

Czy trzeba gasić silnik do wgrywania?

Nie, ale dobrze jest to robić na wolnych obrotach i podczas postoju. Dopóki zmieniamy tylko parametry i mapy, ECU nie powinien się zawiesić. Niestety Crome czasami potrafi zmienić trochę więcej niż powinien (nie wiem z czego to wynika), dlatego trzeba być przygotowanym na różne ewentualności. Najlepiej jest mieć ze sobą zapasowy EEPROM który można w trasie na szybko przełożyć. Dodatkowo ważne jest aby wgrywać tylko zmiany a nie cały wsad - mnie osobiści nie udało się nigdy wgrać całego ROM-u za pomocą EasyRTP nawet jeśli był on identyczny z już obecnym - moja teoria jest taka, że aktualnie wykonywany kod (np. ten do RTP) nadpisuje sam siebie co źle się kończy.

Jak szybkie jest EasyRTP?

Ściągnięcie całego ROM-u trochę trwa (kilka minut), na szczęście nie trzeba robić tego często. Nie wiem ile trwa wgranie całości, nigdy nie udało mi się tego dokonać. Wgranie zmian trwa kilkanaście sekund i zazwyczaj jest to opcja którą należy używać.

Czy mogę włączyć EasyRTP bez programatora?

Nie. Pierwsze uruchomienie wymaga wgrania ROM-u za pomocą programatora dla EEPROM-ów. Aby EasyRTP działało potrzebny jest kod obsługujący protokół RTP, tego kodu nie ma w oryginalnym ROM-ie Hondy więc ECU musi wystartować już ze zmodyfikowanego ROM-u. Stąd wymóg pierwszego wgrania na stole.

Czy mogę nie ciąć ścieżek i lutować kabelków?

Wtedy EasyRTP będzie działać jako zwykły EEPROM tylko do odczytu, nie będzie możliwości zmiany map w czasie rzeczywistym.

Przez które złącze wgrywam mapy?

Poprzez złącze data logging - CN2.

Czy mogę używać EasyRTP wraz z FreeLog?

Nie w tym samym czasie. FreeLog jaki i program obsługujący protokół RTP używają tego samego portu w Windowsie, a porty COM nie są przewidziane do współdzielenia. Procedura wygląda tak, że na czas wgrywania zmian do ROM-u należy wyłączyć logowanie w FreeLog (lub innym programie do logowania) aby nie wysyłał żadnych komend przez port COM. W sumie najlepiej jest na chwilę wyłączyć program do logowania.

Czy EasyRTP działa z Cromem?

U mnie działał tylko odczyt, zapis się nie udawał. Dodatkowo Crome zawsze chciał wgrywać cały ROM co kończy się niepowodzeniem. Dlatego do EasyRTP używałem własnego programu.

Jakie zmiany muszę zrobić ROM-ie aby móc używać EasyRTP?

Wystarczy w Crome'ie zainstalować RTP + DataLogging oraz usunąć sumę kontrolną.

Czy EasyRTP będzie działać w zimie?

Kompletując części należy sprawdzić czy ich specyfikacja przewiduje pracę w temp -40C. Jeśli nie, mogą być problemy.
  • DS1230AB-70+, 0°C to +70°C, 5V ± 5%, DIP 28
  • DS1230AB-70IND+ -40°C to +85°C 5V ± 5% DIP 28
  • DS1230Y-70+ 0°C to +70°C 5V ± 10% DIP 28
  • DS1230Y-70IND+ -40°C to +85°C 5V ± 10% DIP 28
Dodatkowo w przypadku Civica Turbo raz zawartość pamięci wyparowała i musieliśmy ją wgrać ponownie za pomocą programatora. Wygląda na to, że niska temperatura zaszkodziła trochę podtrzymywaniu (jeśli dobrze pamiętam to w DS1230 jest bateryjka). Ogólnie wg mnie najlepiej jest używać EasyRTP do tuningu a gdy wszystko jest już poustawiane włożyć EEPROM.

Jaka jest różnica między DS1230AB i DS1230Y?

Wersja "Y" ma większą tolerancję na skoki napięcia i właśnie DS1230Y używałem, ale "AB" także powinno działać.

Jaki czas dostępu potrzebuje, 70ns czy 120ns?

Zadziała wszystko od 70ns do 120ns. Osobiście używałem kości 120ns.

Na zakończenie

Mam nadzieję, że tym postem rozjaśniłem trochę temat RTP, w szczególności EasyRTP i zachęcę Was do zbudowania własnego modułu. Oczywiście robicie to na własne ryzyko i nie wińcie mnie gdy coś pójdzie nie tak jak trzeba.

UWAGA!

W opis wkradł się błąd wynikający z innej liczby nóg układu M82C55A-2 opisanej w PDF-ie kontra liczba nóżek na PCB (40 vs 42). Należy przylutować kabel do nogi nr 38, nie 36. Dziękuję czytelnikowi DM za zwrócenie uwagi na to.

4 komentarze:

  1. Czy zadziała DS1230 150ns?

    OdpowiedzUsuń
    Odpowiedzi
    1. Osobiście nie testowałem niczego powyżej 120ns.

      Usuń
  2. Czy są jakieś aktualne linki do pobrania?

    OdpowiedzUsuń
  3. Siema, a ja kupiłem CobraRTP od Ruskich czy tam białoruskich + programator Xgecu T48 + SST27SF512 i program HTS , zobaczymy co z tego wyjdzie. narazie na sucho udało mi się zczytać stare eepromy ST i wrzucić je w HTS aczkolwiek wyrzuca komunikat że jeden jest zrobiony w Crome drugi Crome Gold więc nie będzie w stanie wszystkich danych konwertować. Jaki polecacie sprzęt do przenośnego pomiaru AFR?

    OdpowiedzUsuń

Reklamy będą usuwane.