![]() |
![]() |
+7-978-708-85-73 Дроссель Amadeus Productions. Быстрый заказ по телефону. (Viber, WhatsApp, Telegram) |
![]() |
![]()
Сообщение
#1
|
|
Начинающий Технический Маньяк ![]() ![]() Группа: Технический Маньяк Сообщений: 54 Регистрация: 8.5.2011 Из: Новосибирск Вне форума Авто: Mitsubishi Lancer IX '03 (4G13) Репутация: ![]() ![]() ![]() |
Так как я крайне не люблю часы с 12-ти часовым форматом времени, то решил заменить в машине штатные часы на собственной разработки, а раз уж всё одно делать на микроконроллере, то счёл правильным дополнить функционал возможностью считывать/сбрасывать ошибки ECU и сделать возможность выдавать некий сигнал на какое либо исполнительное устройство, если обороты двигателя привысят некое число XX но до этого не проведена какая либо специальная процедура (пусть даже элементарная, например не поднесён магнит с крытому геркону).
Итого, хочется получить: + Часы с 24х часовым ворматом отображения времени; + Считывание/сброс ошибок ECU; + Дополнительную охранную систему, которая беспрепятственно позволяет заводить двигатель дистанционно, на прогрев, но блокировать его работу если не сняли с охраны но попытались двигаться (подняли обороты выше XX). Пока это проект, так как устройство собрано, но работает лишь как часы, все попытки научить его соединяться с ECU были тщетны. Девайс сейчас выглядит так: ![]() Схема (уж простите что не причёсана, ведь пока проект): ![]() Процедура иницимализации соединения с ECU которую пробовал: CODE Take K Line High Pause 300ms 'Send 0x01 (00000001) at rate of 5 baud (LSB) with a Start Bit and a Stop bit 'Send Startbit Set K line low (0) Pause 200ms 'Now to send out 0x01 'Send out bit0 Set K line high (1) pause 200ms 'Send out bit1 Set K line low (0) pause 200ms 'Send out bit2 Set K line low (0) pause 200ms 'Send out bit3 Set K line low (0) pause 200ms 'Send out bit4 Set K line low (0) pause 200ms 'Send out bit5 Set K line low (0) pause 200ms 'Send out bit6 Set K line low (0) pause 200ms 'Send out bit7 Set K line low (0) pause 200ms 'Send Stopbit Set K line high (1) Pause 200ms Switch to 15625 baud Receive C0 55 EF 85 send FE Receive E4 ' First Byte of ECU ID Send FF Receive B3 ' Second byte of ECU ID Send FE Receive E4 ' First Byte of ECU ID Send FF Receive B3 ' Second Byte of ECU ID Send FD Receive 20 Send FD Receive 20 Send FD Receive 20 Соответственно в си это выглядит у меня так: CODE WHdisplayClear(); WHdisplayPrint("CONNECT TO ECU.."); #asm("cli") UBRR0H=0; UBRR0L=0; UCSR0B=0; UCSR0A=0; UCSR0C=0; #asm("sei") PORTD.1=0; // В обычном состоянии, когда зажигание выключено USART отключен а линию держим в состоянии "High", что бы через нагрузочный резистор на 510 ом не кушать аккумулятор и резистор не греть delay_ms(3000); // Сделаем задержку на 3 сек, что бы этот переход с лог 1 на лог 0 не воспринимался как что то нужное // Slow Init PORTD.1=1; delay_ms(300); // Send 0x01 (00000001) at rate of 5 baud (LSB) with a Start Bit and a Stop bit PORTD.1=0; // стартовый бит delay_ms(200); PORTD.1=1; // первый бит байта x01 delay_ms(200); PORTD.1=0; delay_ms(1400); // 7 бит =0 PORTD.1=1; // стоповый бит delay_ms(200); PORTD.1=0; // опустили стоповый бит // Переключаемся на 15625 бит/сек // USART initialization // Communication Parameters: 8 Data, 1 Stop, No Parity // USART Receiver: On // USART Transmitter: On // USART0 Mode: Asynchronous // USART Baud Rate: 15625 #asm("cli") UCSR0A=0x00; UCSR0B=0x98; UCSR0C=0x06; UBRR0H=0x00; UBRR0L=0x0F; #asm("sei") Buffer_clear(); // начало для теста (в течение 5 сек попробуем принять что нам ответит ECU и покажем это на дисплей) for(TmpIndexInRecivSnd=0; TmpIndexInRecivSnd<8; TmpIndexInRecivSnd++){MassivECUid[TmpIndexInRecivSnd]=0;} TmpTimer0=0; TmpIndexInRecivSnd=0; TmpFlagConnectOk=0; while (TmpTimer0<5 && TmpFlagConnectOk ==0){ if (TmpIndexInRecivSnd < 7){ TmpRecivChar=Buffer_getchar(); if (rx_buffer_empty0 ==0){ MassivECUid[TmpIndexInRecivSnd]=TmpRecivChar; TmpIndexInRecivSnd++; } }else{TmpFlagConnectOk=1;} } // while (TmpTimer0<5 && TmpFlagConnectOk ==0) if (TmpFlagConnectOk ==0){ErrorECUconnect(2,99); return;} WHdisplayClear(); WHdisplayPrint("ECU CONNECT OK"); sprintf(OULCD_bufferStr0, "%02X%02X%02X%02X%02X%02X%02X%02X", MassivECUid[0], MassivECUid[1], MassivECUid[2], MassivECUid[3], MassivECUid[4], MassivECUid[5], MassivECUid[6], MassivECUid[7]); WHdisplaySetKursor(0, 1); WHdisplayPrint(OULCD_bufferStr0); delay_ms(5000); WHdisplayClear(); return; // конец для теста В общем столкнулся с проблемой: ничего ECU в ответ на такой инит не шлёт. Изначальна информация по иниту связи взята по адресу: http://www.myrollingroad.com/showthread.php?t=60 но там встречается и упоминание что надо слать на 5 бод не байт 01 а байт 33, в общем всё мутно. Соответственно прошу помощи - может быть кто то может помочь осциллограммами связи с ECU, скажем снять осциллограмму с K-line при соединении какой ни будь софтины через шнурок на FT232 или так располагает ясными и чёткими сведениями о том, что за сигналы нужно передать/принять? P.S. Если у кого какие идеи есть что ещё желательно прикрутить в готовый девайс, то озвучивайте, постараюсь уложить, по окончании работ над девайсом выложу схему причёсанную, прошивку и платку. |
![]() |
|
![]() |
![]()
Сообщение
#2
|
|
Начинающий Технический Маньяк ![]() ![]() Группа: Технический Маньяк Сообщений: 54 Регистрация: 8.5.2011 Из: Новосибирск Вне форума Авто: Mitsubishi Lancer IX '03 (4G13) Репутация: ![]() ![]() ![]() |
Предложение по функционалу: не по оборотам блокировать, а по показания датчика скорости (либо от ЭБУ, либо с импульсного входа спидометра). Это поистине отличная идея! Спидометр я конечно трогать не буду равно как и лишние провода тянуть не предполагаю, есть же запрос который выдаёт "Vehicle speed". Как то я сглупил что сразу о скорости не подумал. можно будет запустить вообще в коммерческий юз - ибо девайс супер ;) по фичам и тп - если не против - можем подумать все вместе, чего ему еще не хватает и тп - основная задумка у тебя очень классная :) Коммерческий юз можно, если ни чьи из заседателей этого форума права/доходы это не ущемит. А так - есть схема, есть печатка, код как доведу, если никто не против, в открытый доступ выложу на форум. Что касается фич - что угодно. Если нужно, то ещё полно ног на контроллере, можно хоть флешку зацепить и логировать всё на неё, хоть I2C память, хоть таблеткой-ключиком домофона "открывать" перед движением, хоть приятным голосом семпла с флешки говорить "вы превысили установленный предел оборотов двигателя". Правда, лучше выбирать что надо, а не пытаться засунуть всё и сразу, а то припаивать разное и писать обвязку этого устать могу, всё же в контроллере не так много оперативной и памяти программ, придётся очень постараться что бы навешать и голос и логирование и GPS координаты с отдельного модуля и вывод всех значений да ещё и по голубому зубу на мобильный телефон =) Доделать, я обязательно доделаю, даже если для этого придётся 1000 и 1 раз сходить от ЭВМ до автомобиля или вырвать из него ECU и разобрать вскрыв консервным ножиком =) Другой вопрос - если найдутся те, кто помогут разобраться с протоколом, хотя бы до уровня "инициализировать соединение, отправить простенький запрос и получить на него ответ", то времени на разработку уйдёт на пару-тройку порядков меньше, чем при беготне и выяснению всего методом тыка. Пока я не очень понял где тот самый Ёжик, которому надо писать в личку, надеюсь он сам заглянет и может что подскажет, а может даже и осциллограмму процесса инита обмена, запроса и ответа даст или просто пнёт меня в нужную почку, что бы я побрёл в правильном направлении. ---------- Развёрнуто о том, что видел читал, что понял, что нет. Имеется информация: 1) http://en.wikipedia.org/wiki/OBD-II_PIDs // прочитано 2) http://www.myrollingroad.com/showpost.php?...amp;postcount=3 // накидал даже на досуге на сях генератор этой самой CRC 3) http://www.chiptuner.ru/content/obdcod // расшифровка прям в девайсе не запланирована (считав код и дома в интернете найти можно что за ошибка), по этому прочитал бегло 4) XML файл программы EvoScan // не всё пока ясно 5) http://www.myrollingroad.com/showthread.php?t=60 и http://www.myrollingroad.com/showthread.php?t=65 // попробовал соединиться как указано, ECU отвечает 55 70 85 вместо C0 55 EF 85, во втором источнике указано что ответ должен быть 55 EF 85, близко но не оно - приплыли. 6) http://www.myrollingroad.com/showthread.php?t=32 // прочитано, конфликтует с п.5 по иниту (33 вместо 01 надо слать) и дальнейшему обмену 10400 вместо 15625 бод Мутные моменты (требуется уточнение): A) Информация из п. 5 либо кривая, либо не для того ECU что у меня, либо у меня ошибки в коде. B) Есть у кого ни будь понимание почему именно C0 или 55 в том или ином месте ответа ECU и почему слать в ответ такой последовательности надо именно FE а не какое другое значение? Ведь нутром чую, что этим самым ECU что-то пытается сказать, например 55h вероятно байт для проверки синхронизации и скорости порта, уж слишком специфичен он в виде бит. C) в п. 5 говорится: For example if you wanted to know the RPM of the engine. Send 21 and it will reply with a answer ... хотя в п. 1,2 нет никакого "отправьте просто 21 и получите RPM", там целый пакет надо формировать а не 1 байтик слать. D) Не понятно как лучше работать по ISO 9141-2 или по MUT-II протоколу, что бы уметь читать/сбрасывать ошибки и другие параметры, например ту же скорость и желательно не только ошибки ECU двигателя но и ECU ABS. E) ECU двигателя и ECU ABS сидят на одной шине но у них просто адреса разные или как то ещё хитрее? То есть как сказать им - сейчас я обращаюсь к двигателю, а вот этот запрос к АБС? |
![]() |
|
![]()
Сообщение
#3
|
|
Don Amadeus ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Главные администраторы Сообщений: 29954 Регистрация: 19.2.2009 Из: Russia, Sevastopol Вне форума Авто: Lancer IX-1.6 MT Turbo, Honda Accord IX-2.4 AT Executive. Репутация: ![]() ![]() ![]() |
Коммерческий юз можно, если ни чьи из заседателей этого форума права/доходы это не ущемит. Дык со мной и обсудим, я даже думаю создать скоро раздел внутренних разработок нашего форума - если интересно поучаствовать будет в долях - велкам (IMG:style_emoticons/default/wink.gif) |
![]() |
|
![]() ![]() ![]() |
![]() |
+7-978-708-85-73 Дроссель Amadeus Productions. Быстрый заказ по телефону. (Viber, WhatsApp, Telegram) |
Текстовая версия | © 2006-2025 Форум Технических Маньяков. |
|