![]() |
![]() |
+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) Репутация: ![]() ![]() ![]() |
CONNECT TO ECU
OK Vbat: 12.02612 Другими словами соединение с ECU побеждено. Для истории или для других желающих реализовать подобные проекты немного информации. MUT-II INIT (соединение по MUT-II): Код K line = 0 // так как по умолчанию держим K линию в потенциале лог1, что бы не греть резистор и аккум не жрать, теперь переведём в лог0 delay_ms(2000); // ждём отстоя пены K line = 1 // старт инита delay_ms(300); K line = 0 delay_ms(200); // передаём "стартовый бит" K line = 0 delay_ms(200*8); // якобы передаём байт 0x00 - это адрес ECU двигателя (не сочтите за быдлокодинг, это для примера, естественно можно эти 2 строки не писать, просто в предыдущей задержке вписать 200*9), для системы ABS адрес будет 0x04 и передавать надо его. K line = 1 delay_ms(200); // передаём "стоповый бит" // Переключаемся на 15625 бод, 8 Data, 1 Stop, No Parity ждём прихода синхробайта, должен быть равен 0x55 если синхробайт не пришёл, то говорим "Ошибка, где ECU?" и далее не продолжаем ждём прихода 0xEF если не пришло, говорим "Ошибка, вы подсовываете нам не то ECU!" и далее не продолжаем ждём прихода концовки ответа которая при любом ECU равна 0x85, будь то ABS или иное ECU. Здесь и далее можем начинать слать запросы и получать ответы При посылке запросов, не забываем, что байт, который мы передаём нам и возвращается, то есть пока мы его передаём мы его и принимаем, он как эхо. Проверить, что присоединились верно можно отправив запрос 0x14 (показать напряжение аккумулятора) и если получим значение менее 0x33, то выдать "Ошибка ECU не отвечает на наши запросы". MUT-II WORK (работа по протоколу MUT-II): Код Отправляем байт запроса к ECU Дожидаемся конца отправки (или принятия байта) Принимаем байт Если принятый байт не равен байту, который отправляли, то сообщим "Ошибка, на K-линии неполадки!" и далее не продолжаем Дожидаемся принятия байта Принимаем байт (это ответ ECU на наш запрос) Специально написал процедуры на русском, а не в кодах, что бы не путать людей, вдруг кто асм, си или васик не знает, что бы не мучались. Едем далее. Пару "ласковых": Забудте как страшный сон сайт www.myrollingroad.com Или специально врут или просто их EVO и Lancer IX совсем разные машины, что у EVO адрес ECU 0x01, но у Lancer IX он точно на адресе 0x00! --- Так как соединение побеждено, перехожу к этапу #2 - считывание ошибок. С сбросом ошибок понятно, есть команда 0xFC, с чтением пока не понял, кто может растолкуйте - есть команды, например: 0x40 - Stored Faults Lo 0x41 - Stored Faults Hi Внимание вопрос! хорошо, считали 2 байта, теперь как эти 2 байта превратить в ошибку вида: P0110 (Датчик температуры воздуха на впуске) или P0720 (Электрическая цепь датчика частоты вращения выходного вала) Ведь буквы бывают не только P но и B и C, да и 2 байта это 65536 комбинаций (кодов) а в виде "P0110", даже учитывая буквы, гораздо меньше. |
![]() |
|
![]() ![]() ![]() |
![]() |
+7-978-708-85-73 Дроссель Amadeus Productions. Быстрый заказ по телефону. (Viber, WhatsApp, Telegram) |
Текстовая версия | © 2006-2025 Форум Технических Маньяков. |
|