![]() |
![]() |
+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
|
|
Начинающий Технический Маньяк ![]() ![]() Группа: Технический Маньяк Сообщений: 84 Регистрация: 22.7.2009 Из: г. Москва Вне форума Авто: Lancer IX 2.0 MT STW, 2005 Репутация: ![]() ![]() ![]() |
В прошлом году пытался подружить атмегу с лансом. Но инициализации так и не прошла.
Вот еще одна ссылочка с фрагментом кода: Тыц. Может поможет. Если на выходных получится попробую получить дамп инита с evoscan... Хотя, мне кажется, эти снифферы только со стандартными скоростями работать будут... И вот еще кусок кода инициализации по ISO9141 для arduino: Код /* ISO 9141 init */ // The init process is done in timed sections now so that during the reinit process // the user can use the buttons, and the screen can be updated. // Note: Due to the timed nature of this init process, if the display screen takes up too much CPU time, this will not succeed void iso_init() { long currentTime = millis(); static long initTime; static int initFirstDelay = 300; #ifdef ISO_9141 // CodeOptimization (128bytes) // Changed ISO init 2-7 steps to take values from array (could be moved to PROGMEM) // ISO_14230_slow could be changed too (same way) byte ISOSteps[8] = { 0, //0 not used 30, //1 HIGH 20, //2 LOW 40, //3 HIGH 40, //4 LOW 40, //5 HIGH 40, //6 LOW 26 //7 HIGH }; if (ISO_InitStep == 0) { // setup ECUconnection = false; serial_tx_off(); //disable UART so we can "bit-Bang" the slow init. serial_rx_off(); initTime = currentTime + initFirstDelay; initFirstDelay = (initFirstDelay % 4500) * 2; //if 4800 then down to 300ms AND sequence: 300, 600, 1200, 2400, 4800 ISO_InitStep++; } else if (currentTime >= initTime) { if (ISO_InitStep > 0 && ISO_InitStep < 8) { digitalWrite(K_OUT, ISO_InitStep % 2); #ifdef useL_Line digitalWrite(L_OUT, ISO_InitStep % 2); #endif initTime = currentTime + ISOSteps[ISO_InitStep] * 10; ISO_InitStep++; } else if (ISO_InitStep == 8) { #ifdef useL_Line digitalWrite(L_OUT, LOW); #endif // bit banging done, now verify connection at 10400 baud byte b = 0; // switch now to 10400 bauds Serial.begin(10400); // wait for 0x55 from the ECU (up to 300ms) //since our time out for reading is 125ms, we will try it up to three times for (byte i=0; i<3; i++) if (iso_read_byte(&b)) break; if(b == 0x55) { ISO_InitStep++; } else { // oops unexpected data, try again ISO_InitStep = 0; } } else // ISO_InitStep == 9 { byte b; bool bread; bread = iso_read_byte(&b); // read kw1 #ifdef DEBUGOutput LastReceived1 = b; LastReceived1OK = bread ? 1 : 0; #endif bread = iso_read_byte(&b); // read kw2 #ifdef DEBUGOutput LastReceived2 = b; LastReceived2OK = bread ? 1 : 0; #endif // 25ms delay needed before reply (url with spec is on forum page 56) // it does not work without it on VW MK4 delay(25); // send ~kw2 (invert of last keyword) iso_write_byte(~b); #ifdef DEBUGOutput LastSend1 = ~b; #endif // ECU answer by 0xCC (~0x33) // read several times, ECU not always responds in time for (byte i=0; i<3; i++) { bread = iso_read_byte(&b); if (bread) break; } #ifdef DEBUGOutput LastReceived3 = b; LastReceived3OK = bread ? 1 : 0; #endif if (b == 0xCC) { ECUconnection = true; // update for correct delta time in trip calculations. old_time = millis(); } ISO_InitStep = 0; } } Сам проект лежит тут: Obduino |
![]() |
|
![]() ![]() ![]() |
![]() |
+7-978-708-85-73 Дроссель Amadeus Productions. Быстрый заказ по телефону. (Viber, WhatsApp, Telegram) |
Текстовая версия | © 2006-2025 Форум Технических Маньяков. |
|