I have simple MIL code 16804 catalyst eficiency below treshhold, it is part of exhaust system (something with cleaning exhaust gas) I'm ignoring it or cleaning it with VAG-COM cable/software.
Today this code came back, and OBDuino32K shows message on start:
CHECK ENGINE ON 1 CODE(S) IN ECU
But it is not showing codes
How to clean those codes with Obduino32K? Is it possible?
Code:
if(1L<<31 & n) // test bit A7
{
// we have MIL on
nb=(n>>24) & 0x7F;
lcd_cls_print_P(PSTR("CHECK ENGINE ON"));
lcd_gotoXY(0,1);
sprintf_P(str, PSTR("%d CODE(S) IN ECU"), nb);
lcd_print(str);
delay(2000);
lcd_cls();
#ifdef ELM
// retrieve code
elm_command(str, PSTR("03\r"));
// ELM returns something like 43 01 33 00 00 00 00
if(str[0]!='4' && str[1]!='3')
return; // something wrong
// must convert to P/C/B/U etc
lcd_print(str+3);
delay(5000);
#else
// we display only the first 6 codes
// if you have more than 6 in your ECU
// your car is obviously wrong :-/
// retrieve code
cmd[0]=0x03;
iso_write_data(cmd, 1);
for(i=0;i<nb/3;i++) // each received packet contain 3 codes
{
iso_read_data(buf, 6);
k=0; // to build the string
for(j=0;j<3;j++) // the 3 codes
{
switch(buf[j*2] & 0xC0)
{
case 0x00:
str[k]='P'; // powertrain
break;
case 0x40:
str[k]='C'; // chassis
break;
case 0x80:
str[k]='B'; // body
break;
case 0xC0:
str[k]='U'; // network
break;
}
k++;
str[k++]='0' + (buf[j*2] & 0x30)>>4; // first digit is 0-3 only
str[k++]='0' + (buf[j*2] & 0x0F);
str[k++]='0' + (buf[j*2 +1] & 0xF0)>>4;
str[k++]='0' + (buf[j*2 +1] & 0x0F);
}
str[k]='\0'; // make asciiz
lcd_print(str);
lcd_gotoXY(0, 1); // go to next line to display the 3 next
}
#endif
}
1. could it be problem with
for(i=0;i<nb/3;i++), becouse nb==1, and 1/3=0, so for loop is not starting?
or
2. can not seen any delay in ISO part, so if it displaying - it is for a very very short time and i cannot see?
or is it both problems at same time?
3. after displaying that there are CODE(S) OBDuino32K start showing PIDs, but all of them are wrong -24°C coolant temp, 17ltr/hour (instead of normal 1-2) could this be becouse OBDuino32K sends request for ECU error codes read, but is not reading them and all comunucation becomes corupted?
proposed code:
code not checked jet.
Code:
if(1L<<31 & n) // test bit A7
{
// we have MIL on
nb=(n>>24) & 0x7F;
lcd_cls_print_P(PSTR("CHECK ENGINE ON"));
lcd_gotoXY(0,1);
sprintf_P(str, PSTR("%d CODE(S) IN ECU"), nb);
lcd_print(str);
delay(2000);
lcd_cls();
#ifdef ELM
// retrieve code
elm_command(str, PSTR("03\r"));
// ELM returns something like 43 01 33 00 00 00 00
if(str[0]!='4' && str[1]!='3')
return; // something wrong
// must convert to P/C/B/U etc
lcd_print(str+3);
delay(5000);
#else
// we display only the first 6 codes
// if you have more than 6 in your ECU
// your car is obviously wrong :-/
// retrieve code
cmd[0]=0x03;
iso_write_data(cmd, 1);
// REPLACE: nb/3 with (nb-1)/3+1 //
for(i=0;i<(nb-1)/3+1;i++) // each received packet contain 3 codes
{
iso_read_data(buf, 6);
k=0; // to build the string
for(j=0;j<3;j++) // the 3 codes
{
switch(buf[j*2] & 0xC0)
{
case 0x00:
str[k]='P'; // powertrain
break;
case 0x40:
str[k]='C'; // chassis
break;
case 0x80:
str[k]='B'; // body
break;
case 0xC0:
str[k]='U'; // network
break;
}
k++;
str[k++]='0' + (buf[j*2] & 0x30)>>4; // first digit is 0-3 only
str[k++]='0' + (buf[j*2] & 0x0F);
str[k++]='0' + (buf[j*2 +1] & 0xF0)>>4;
str[k++]='0' + (buf[j*2 +1] & 0x0F);
}
str[k]='\0'; // make asciiz
lcd_print(str);
lcd_gotoXY(0, 1); // go to next line to display the 3 next
}
// ADD: delay(4000), 5seconds is limit for ISO for NO comunication //
delay(4000);
#endif
}
btw, is it possible to get access to google code trunk, i would like to put some new code