кот лучше сбрасывать ссылку на create.arduino.cc или на любой онлайн сервис для обмена сниппетами. например
https://codeshare.io
в онлайнере кот не отформатирован смотрится хренова
кот лучше сбрасывать ссылку на create.arduino.cc или на любой онлайн сервис для обмена сниппетами. например
https://codeshare.io
в онлайнере кот не отформатирован смотрится хренова
для старика
полуфабрикат
писал в этой ночью в час
еще что-то помню спрашивай
не знаю поможет тебе старик эти решения
бредовая идейка для развлечения
пальчиком чуть касаясь крутить по чуть чуть енкодер туды сюды
на новомодном супер мелком с муравьиными штифтами графическом жки типо не картинки а буквы сколько же накрутил
шаговый мотор на нужные мне шаги елозит синхронно туды сюды
про шаговый мотор еще в самом начале развлечения по вечерам
не ну не бред?
а мне нраиица
// https://www.brainy-bits.com/nema-motor-with-rotary-encoder-part-2/
//#include <Wire.h>
//#include <Adafruit_GFX.h>
//#include <Adafruit_SSD1306.h>
//#include "GyverEncoder.h"
//pins----------------------------------------------------------
#define PIN_ENCODER_ROT1 2 //attachInterrupt(0,GetRotaryDetect,FALLING); //interrupt 0 pin 2 on Arduino UNO
#define PIN_ENCODER_ROT2 3
#define PIN_ENCODER_BUT1 4
#define PIN_STEPPER1___STEP 9
#define PIN_STEPPER1____DIR 8
#define PIN_STEPPER1_____M1 10
#define PIN_STEPPER1_____M2 11
#define PIN_STEPPER1_____M3 7
#define PIN_STEPPER1_ENABLE 12
#define PIN_LED13 13
//consts------------------------------------------------------
//Adafruit_SSD1306 display(128,32, &Wire,-1);//
//Encoder enc1(PIN_ENCODER_ROT1,PIN_ENCODER_ROT2,PIN_ENCODER_BUT1);
volatile boolean EncoderRotateFlag1; // for Interrupts
volatile boolean EncoderRotationDirectionFlag1;
int StepperPosition =0;
int EncoderStepsKoeficient =200;//2000;//200;//4; //40 400 4000 40000??
//int direction; // Variable to set Rotation (CW- CCW) of stepper
//for on button1->commandnumber12345------------------
long PreviousMillis = 0;
int CommandNumber1=0;
int CommandNumberMax=5; // for stepper driver commandnumber A4888 M1 M2 M3
// https://3deshnik.ru/wiki/index.php/Драйвер_A4988
// MS1 MS2 MS3 Дробление шага
// 0 0 0 1
// 1 0 0 1/2
// 0 1 0 1/4
// 1 1 0 1/8
// 1 1 1 1/16
//------------------------------------------------------------------------
int Oborot=0;
int OborotPrevous=0;
/*
//-------------------------------------------------
void DrawLCD132x32String1(String String1,int size1,int x1,int y1){// display.clearDisplay();
display.setTextColor(SSD1306_WHITE);
display.setTextSize(size1);
display.setCursor(x1,y1);display.print(String1);
display.display();
}
*/
//-------------------------------------------------
//void isr() {
// enc1.tick(); // отработка в прерывании
//}
// Interrupt -------------------------------------------------------------
void GetRotaryDetect(){
delay(4);//may be no need if not drebezg
if(digitalRead(PIN_ENCODER_ROT1)) EncoderRotationDirectionFlag1= digitalRead(PIN_ENCODER_ROT2);
else EncoderRotationDirectionFlag1=!digitalRead(PIN_ENCODER_ROT2);
EncoderRotateFlag1 = true;
}
//----------------------------------------------------------------
void setup(){
Serial.begin(9600);
// attachInterrupt(0, isr, CHANGE); // прерывание на 2 пине
// if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // initialise 0x3C for 128x32 SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally
// Serial.println(F("SSD1306 allocation failed"));
// for(;; // Don't proceed, loop forever
// }
// display.display();delay(2000); display.clearDisplay();//delay(10000); // display from PROGMEM buffer library AdafruitSSD1306
pinMode(PIN_STEPPER1_____M1, OUTPUT);digitalWrite(PIN_STEPPER1_____M1, LOW);
pinMode(PIN_STEPPER1_____M2, OUTPUT);digitalWrite(PIN_STEPPER1_____M2, LOW);
pinMode(PIN_STEPPER1_____M3, OUTPUT);digitalWrite(PIN_STEPPER1_____M3, LOW);
pinMode(PIN_STEPPER1____DIR, OUTPUT);
pinMode(PIN_STEPPER1___STEP, OUTPUT);
pinMode(PIN_STEPPER1_ENABLE, OUTPUT);digitalWrite(PIN_STEPPER1_ENABLE, LOW);
delay(5);
// PIN_STEPPER1_____M1 PIN_STEPPER1_____M2
// LOW LOW = Full Step
// HIGH LOW = Half Step
// LOW HIGH = A quarter of Step
// HIGH HIGH = An eighth of Step
pinMode(PIN_ENCODER_ROT1,INPUT);
pinMode(PIN_ENCODER_ROT2,INPUT);
pinMode(PIN_ENCODER_BUT1,INPUT_PULLUP);
pinMode(PIN_LED13,OUTPUT);
attachInterrupt(0,GetRotaryDetect,FALLING); //interrupt 0 pin 2 on Arduino UNO
}
//=================================================================================================================================================================
void loop(){
//enc1.tick(); // отработка
//if (enc1.isRight()) Serial.println("Right"); // если был поворот
//if (enc1.isLeft ()) Serial.println("Left");
//commands-------------------------------------------------------------
if(digitalRead(PIN_ENCODER_BUT1)==LOW){ // button slick press 1sek 2 sek 3sek 4sek
if(millis()-PreviousMillis>1000){ // wait 1 sec
PreviousMillis=millis(); // sek in memory
CommandNumber1++;
//if(CommandNumber1>CommandNumberMax)CommandNumber1=0;
Serial.println(CommandNumber1);
}
}
// else{ CommandNumber1=0;}// Serial.println(CommandNumber1);
//commands-------------------------------------------------------------
/*
//stepper speed M1 M2 M3 -------------------------------------------------
if(CommandNumber1=0) digitalWrite(PIN_STEPPER1_____M1, LOW);digitalWrite(PIN_STEPPER1_____M2, LOW);digitalWrite(PIN_STEPPER1_____M3, LOW);//// 0 0 0 1
if(CommandNumber1=1) digitalWrite(PIN_STEPPER1_____M1,HIGH);digitalWrite(PIN_STEPPER1_____M2, LOW);digitalWrite(PIN_STEPPER1_____M3, LOW);//// 1 0 0 1/2
if(CommandNumber1=2) digitalWrite(PIN_STEPPER1_____M2, LOW);digitalWrite(PIN_STEPPER1_____M2,HIGH);digitalWrite(PIN_STEPPER1_____M3, LOW);//// 0 1 0 1/4
if(CommandNumber1=3) digitalWrite(PIN_STEPPER1_____M3,HIGH);digitalWrite(PIN_STEPPER1_____M2,HIGH);digitalWrite(PIN_STEPPER1_____M3, LOW);//// 1 1 0 1/8
if(CommandNumber1=5) digitalWrite(PIN_STEPPER1_____M3,HIGH);digitalWrite(PIN_STEPPER1_____M2,HIGH);digitalWrite(PIN_STEPPER1_____M3,HIGH);//// 1 1 1 1/16
*/
// https://3deshnik.ru/wiki/index.php/Драйвер_A4988
// MS1 MS2 MS3 Дробление шага
// 0 0 0 1
// 1 0 0 1/2
// 0 1 0 1/4
// 1 1 0 1/8
// 1 1 1 1/16
/*
if(digitalRead(PIN_ENCODER_BUT1)==LOW){
if(StepperPosition>>0){
while(StepperPosition!=0){
digitalWrite(PIN_STEPPER1____DIR,HIGH);
for(int x=1;x<EncoderStepsKoeficient;x++){ digitalWrite(PIN_STEPPER1___STEP,HIGH); delay(1); digitalWrite(PIN_STEPPER1___STEP, LOW); delay(1); }
StepperPosition=StepperPosition-EncoderStepsKoeficient;
}
}
else{
while(StepperPosition!=0){
digitalWrite(PIN_STEPPER1____DIR, LOW);
for(int x=1;x<EncoderStepsKoeficient;x++){ digitalWrite(PIN_STEPPER1___STEP,HIGH); delay(1); digitalWrite(PIN_STEPPER1___STEP, LOW); delay(1); }
StepperPosition=StepperPosition+EncoderStepsKoeficient;
}
}
StepperPosition=0;
}
*/
//stepper speed M1 M2 M3 -------------------------------------------------
//stepper-------------------------------------------------------------------------------
if(EncoderRotateFlag1){
if(EncoderRotationDirectionFlag1){
digitalWrite(PIN_STEPPER1____DIR,HIGH);
for(int x=0;x<EncoderStepsKoeficient;x++){ digitalWrite(PIN_STEPPER1___STEP,HIGH); delay(1); digitalWrite(PIN_STEPPER1___STEP, LOW); delay(1); }
StepperPosition=StepperPosition-EncoderStepsKoeficient;
}
if(!EncoderRotationDirectionFlag1){
digitalWrite(PIN_STEPPER1____DIR, LOW);
for(int x=0;x<EncoderStepsKoeficient;x++){ digitalWrite(PIN_STEPPER1___STEP,HIGH); delay(1); digitalWrite(PIN_STEPPER1___STEP, LOW); delay(1); }
StepperPosition=StepperPosition+EncoderStepsKoeficient;
}
EncoderRotateFlag1=false;
OborotPrevous=Oborot+StepperPosition/EncoderStepsKoeficient;
Serial.println(OborotPrevous);
}
//stepper-------------------------------------------------------------------------------
//lcd------------------------------------
// OborotPrevous=Oborot+StepperPosition/200;
// Serial.print(OborotPrevous);
//lcd------------------------------------
}
//===============================================================================================================================================================
костылей как ты говоришь хватает
по теме енкодер и ардуиноиде
енкодер слушать надо по любому прерывая общий процесс
других решений вменяемы не видел
то есть если у тебя делей где-то затесался жди косяков на ровном месте
я работая миллис-ами нормально получалось врукопашную
достаточно ловить и прерываться всего 1-одну ногу от енкодера !!!
наплевать CLK или DT контакты
щас развлекаюсь тем что гуверовская первая в мире библиотека обрабатывает и CLK и DT контакты - прикольно
пропуски все теже а коду-то коду
атмега328 теоретически можно заставить прерываться на любой ноге а по факту работает надежно только 2-ая
ты же не всегда будешь иметь именно версию atmega328 будет попадаться и другие чипы а том все не так
што там в есп8266 где ног-то толком нет понятия не имею у меня только 8-ми ноговых пучек
я думаю тебе надо принципиально решать
прерываться только по одной ноге
щас поищу идею в моем рукопашном коде
ну вот идейка врукопашную без библиотек только одну ногу слушать да еще направление флаги поднимать
на ардуинах всех будет работать
//pins----------------------------------------------------------
#define PIN_ENCODER_ROT1 2 //attachInterrupt(0,GetRotaryDetect,FALLING); //interrupt 0 pin 2 on Arduino UNO
#define PIN_ENCODER_ROT2 3
#define PIN_ENCODER_BUT1 4
//consts------------------------------------------------------
boolean EncoderRotateFlag1; // for Interrupts
boolean EncoderRotationDirectionFlag1;
// Interrupt -------------------------------------------------------------
void GetRotaryDetect(){
delay(4);//may be no need if not drebezgа
if(digitalRead(PIN_ENCODER_ROT1)) EncoderRotationDirectionFlag1= digitalRead(PIN_ENCODER_ROT2);
else EncoderRotationDirectionFlag1=!digitalRead(PIN_ENCODER_ROT2);
EncoderRotateFlag1 = true;
}
//----------------------------------------------------------------
void setup(){
Serial.begin(9600);
pinMode(PIN_ENCODER_ROT1,INPUT_PULLUP);//подтяжка нужна если нормальный енкодер без дурацкой подтяшки в лишний провод на +5в
pinMode(PIN_ENCODER_ROT2,INPUT_PULLUP);
pinMode(PIN_ENCODER_BUT1,INPUT_PULLUP);
//interrupt 0 pin 2 on Arduino UNO прерваться да еще направления флагами замахать
attachInterrupt(0,GetRotaryDetect,FALLING);
}
//===============================================
void loop(){
if(EncoderRotateFlag1){
if(EncoderRotationDirectionFlag1){
// что-то полезное делаешь
}
if(!EncoderRotationDirectionFlag1){
// что-то полезное делаешь
}
EncoderRotateFlag1=false;
}
}
//=================================================
тут главное идею пойми
врукопашную
1 нога
подпрограмма флаги
а по флагам принимай решения полезные
классика ассемблерного мышления
RepoMan:задержки в прерываниях? треш
так да
помоги старику на есп8266 победить енкодер
у него вроде работает
косяки ловит и нервничает
но я до сих пор не понял
шо за wemos и чем он отличается от малоногой esp8266
вижу он пока не понял что перрываться достаточно по одному контакту энкодера
вот пытаюсь поддержать разговор без не известной мне платы
я вооще не доганаю где он выковырял attachInterrupt(1, isrDT_6043124_1, CHANGE); на 3-ей от чего ноге?
ща попробую почитать что такое ydjvjlyjt wemos
Старик
Это твой код для есп8266?
#include <Wire.h>
#include "GyverEncoder.h"
//#include "SH1106.h"
#include "Adafruit_SH1106.h"
extern "C" {
#include "user_interface.h";
}
SH1106 display(0x3c, D2, D1);
bool En_110083932_1;
bool right_110083932_1;
bool left_110083932_1;
bool turn_110083932_1;
bool rightHold_110083932_1;
bool leftHold_110083932_1;
bool fastRight_110083932_1;
bool fastLeft_110083932_1;
bool click_110083932_1;
bool holded_110083932_1;
#define CLK_110083932_1 D7
#define DT_110083932_1 D6
#define SW_110083932_1 D5
Encoder enc1_110083932_1(CLK_110083932_1, DT_110083932_1, SW_110083932_1);
bool en_36765545_1;
String text_36765545_1;
bool _count3I = 0;
bool _count3_SCST = 0;
int _count3_Value = 0;
void setup(){
display.init();
display.flipScreenVertically();
display.setContrast(255);
if(1==1){enc1_110083932_1.setType(TYPE1);}
if(1==2){enc1_110083932_1.setType(TYPE2);}
if(2==1){enc1_110083932_1.setDirection(NORM);}
if(2==2){enc1_110083932_1.setDirection(REVERSE);}
Serial.begin(9600);
}
//===================
void loop(){
//Плата:1
display.clear();
En_110083932_1 = 1;
if(En_110083932_1){
enc1_110083932_1.tick(); // обязательная функция отработки. Должна постоянно опрашиваться
if (enc1_110083932_1.isRight()){ right_110083932_1=true;}//Если был совершен поворот энк вправо
else right_110083932_1=false;}
if(enc1_110083932_1.isLeft()){left_110083932_1=true;} //Если был совершен поворот энк влево
else {left_110083932_1=false;}
if(enc1_110083932_1.isTurn()){turn_110083932_1=true;} //Если был совершен поворот энкодера в любую сторону
else {turn_110083932_1=false;}
if(enc1_110083932_1.isRightH()){rightHold_110083932_1=true;} //Если был совершен поворот в право с удержанием кнопки энкодера
else {rightHold_110083932_1=false;}
if(enc1_110083932_1.isLeftH()){leftHold_110083932_1=true;} //Если был совершен поворот влево с удержанием кнопки энкодера
else {leftHold_110083932_1=false;}
if(enc1_110083932_1.isFastR()){fastRight_110083932_1=true;} //Если был совершен быстрый поворот вправо
else {fastRight_110083932_1=false;}
if(enc1_110083932_1.isFastL()){fastLeft_110083932_1=true;} //Если был совершен быстрый поворот влево
else {fastLeft_110083932_1=false;}
//if(enc1_110083932_1.isPress()){press=true;} // если было нажатии кнопки, сама сбрасывается в false отрабатывает release после отпускания
// else// {press=false;}
//if(enc1_110083932_1.isRelease()){release=true;} // отпускании кнопки, сама сбрасывается в false
// else// {release=false;}
if(enc1_110083932_1.isClick()){click_110083932_1=true;} // возвращает true при нажатии и отпускании кнопки, сама сбрасывается в false
else {click_110083932_1=false;}
if(enc1_110083932_1.isHolded()){holded_110083932_1=true;} // возвращает true при удержании кнопки, сама сбрасывается в false
else {holded_110083932_1=false;}
//if(enc1_110083932_1.isHold()){hold=true;} // возвращает true при удержании кнопки, НЕ СБРАСЫВАЕТСЯ
// else {hold=false;}
}
if (right_110083932_1){
if ( ! _count3I) {
_count3I = 1;
if(_count3_Value < 12) {_count3_Value = _count3_Value + 1;}
}
}
else {
_count3I = 0;}
if (left_110083932_1){
if ( ! _count3_SCST) {
_count3_SCST = 1;
if(_count3_Value > 1) {_count3_Value = _count3_Value - 1;}
}
}
else {
_count3_SCST = 0;}
en_36765545_1 = 1;
text_36765545_1 = ((String("Encoder ")) + ((String(_count3_Value, DEC))));
if (en_36765545_1) {
display.setTextAlignment(TEXT_ALIGN_CENTER);
display.setFont(ArialRus_Plain_10);
display.drawString(50, 20, utf8rus(text_36765545_1));
}
display.display();
}
//====================================================================
bool _isTimer(unsigned long startTime, unsigned long period ){
unsigned long currentTime;
currentTime = millis();
if (currentTime>= startTime) {return (currentTime>=(startTime + period));} else {return (currentTime >=(4294967295-startTime+period));}
}
//----------------------------
String utf8rus(String source){
int i,k;
String target;
unsigned char n;
char m[2] = { '0', '\0' };
k = source.length(); i = 0;
while (i < k) {
n = source; i++;
if (n >= 0xC0) {
switch (n) {
case 0xD0: { n = source; i++;
if (n == 0x81) { n = 0xA8; break; }
if (n >= 0x90 && n <= 0xBF) n = n + 0x30; break; }
case 0xD1: { n = source; i++;
if (n == 0x91) { n = 0xB8; break; }
if (n >= 0x80 && n <= 0x8F) n = n + 0x70; break; }
}
}
m[0] = n; target = target + String(m);
}
return target;
}
//----------------------------
void isrCLK_110083932_1(){ enc1_110083932_1.tick(); }// отработка в прерывании
void isrDT_110083932_1(){ enc1_110083932_1.tick(); }// отработка в прерывании
тут же вызывается уже кем-то написанная библиотека
enc1_110083932_1.tick();
конечно если еще раз вызовешь тоже самое прерывание то зациклишь бедный камень
attachInterrupt(0, isrCLK_6043124_1, CHANGE);
art100:шо за wemos и чем он отличается от малоногой esp8266
то же самое, что и, например, ардуино уно по отношению к ATmega328P - удобная платка с разведенным контроллером. Гугли wemos d1
Да я уже победил.
art100,
Счас кручу управление 5 ШИМ контролерами по сети.
Вот вемос, он же 8266
[censored by Grace-o]
Жёлтая карточка была показана пользователю за этот пост модератором Grace-o (31 марта 2020 19:12)
Основание: 3.5.16 / 3.5.19
Народ, кто поможет со скетчем? у меня есть недоделанный. делал не я.
Сижу, пыхчу как могу, не со всем разобраться выходит
офлайн
Protez1999
Senior Member
Автор темы
|
|
9977 |
16 лет на сайте Город:
|
yoheer:у меня есть недоделанный. делал не я.
Сижу, пыхчу как могу
Зачастую проще свою прогу с 0 написать , чем понять задумку автора.
проект сканер-компьютер для машины
Скетчей 2. Один полностью готов, второй расширенная версия
не могу понять принцип, чтобы доделать вторую
yoheer, спроси у автора скетча, как он работает. потому как просить разбираться в чужом скетче может обойтись дороже, чем писать свой.
может глянет кто.
не могу понять, как вытаскиваются данные из ЭБУ
автора уже не найти (
#include <SoftwareSerial.h>
#include <LiquidCrystal.h>
#include <avr/pgmspace.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7 );
SoftwareSerial PCM_Serial(3, 2);
// Нажатые кнопки
byte button;
const byte BUTTON_NONE = 0;
const byte BUTTON_RIGHT = 1;
const byte BUTTON_UP = 2;
const byte BUTTON_DOWN = 3;
const byte BUTTON_LEFT = 4;
const byte BUTTON_SELECT = 5;
byte DispReg; // Режим дисплея
// = 0 - Приветствие
// = 1 - вин-номер
// = 2 - ошибки DTC
// = 3 - скорость, обороты, передача
// = 4 - температура, напряжение
// = 5 - TPS
// = 6 - Расход
// = 7 - Общий литраж и км
// = 100 - попытка коннекта
// = 101 - счет при попытке коннекта
// = 102 - Связь успешна
// = 103 - Ошибка связи
byte DispNeedRedraw; //Нужно ли обновлять дисплей
// = 1 - обновить целиком
// = 2 - обновить только параметры
byte dataStream[100]; // Массив с данными
byte Try; // Номер отображаемой попытки связи
bool find_Sync; //Признак синхронизации с мозгом
long msec;
long msec_Disp;
long msec_L_KM;
byte VIN[17]; //Для отображения VIN
byte DTC_Num; // Номер отображаемой ошибки
byte DTC_ALL; // Всего ошибок
byte ErrorCode_Table[99];
word Velosity;
word RPM;
byte PRNDL;
int t_Eng;
int t_AT;
byte U_1;
byte U_2;
byte TPS;
byte L_H1, L_H2, L_H3, L_H4;
float L_all;
float KM_all;
byte L_KM1, L_KM2;
byte L_all1, L_all2;
byte KM_all1, KM_all2;
//--------------------Работа с кнопками---------------------------------------------
byte getPressedButton()
{
int buttonValue = analogRead(0); // считываем значения с аналогового входа(A0)
if (buttonValue < 100) {
return BUTTON_RIGHT;
}
else if (buttonValue < 200) {
return BUTTON_UP;
}
else if (buttonValue < 400) {
return BUTTON_DOWN;
}
else if (buttonValue < 600) {
return BUTTON_LEFT;
}
else if (buttonValue < 800) {
return BUTTON_SELECT;
}
return BUTTON_NONE;
}
//--------------------Работа с кнопками---------------------------------------------
//--------------------Работа с дисплеем---------------------------------------------
void DispDraw()
{
byte i;
if (DispNeedRedraw == 0) return;
if (DispReg == 0)
{
lcd.clear();
lcd.print(F(" LT1 ECM Scaner"));
lcd.setCursor(0, 1);
lcd.print(F(" OBD-1 93-95"));
}
if (DispReg == 100)
{
lcd.clear();
lcd.print(F("Initialising PCM"));
lcd.setCursor(3, 1);
lcd.print(F("Wait......"));
}
if (DispReg == 101)
{
lcd.setCursor(9, 1);
lcd.print(" ");
lcd.setCursor(9, 1);
lcd.print(Try);
}
if (DispReg == 102)
{
lcd.clear();
lcd.print(F(" PCM connection"));
lcd.setCursor(0, 1);
lcd.print(F(" DONE"));
}
if (DispReg == 103)
{
lcd.clear();
lcd.print(F(" Turn ignition"));
lcd.setCursor(0, 1);
lcd.print(F(" ON!"));
}
if (DispReg == 1)
{
lcd.clear();
lcd.print(F("VIN: "));
for (i=0;i<7;i++) lcd.print((char)VIN);
lcd.setCursor(5, 1);
for (i=7;i<17;i++) lcd.print((char)VIN);
}
if (DispReg == 2)
{
lcd.clear();
if (DTC_ALL == 0)
{
lcd.print(F("DTC: 0/0"));
lcd.setCursor(0, 1); lcd.print(F("None Error"));
}
else
{
if (((DTC_Num+1) > DTC_ALL)) DTC_Num = DTC_ALL-1;
lcd.print(F("DTC: "));
lcd.print(DTC_ALL);lcd.print(F("/"));lcd.print(DTC_Num+1);
lcd.setCursor(0, 1); lcd.print(ErrorCode_Table[DTC_Num]);
}
}
if (DispReg == 3)
{
if (DispNeedRedraw==1) {lcd.clear(); lcd.print(F("KM/H RPM PRNDL"));}
lcd.setCursor(0, 1); lcd.print(F(" "));
lcd.setCursor(0, 1); lcd.print(Velosity);
lcd.setCursor(5, 1); lcd.print(RPM);
lcd.setCursor(12, 1);
if (PRNDL & (1<<0)) lcd.print(F("D1"));
if (PRNDL & (1<<1)) lcd.print(F("D2"));
if (PRNDL & (1<<2)) lcd.print(F("D3"));
if (PRNDL & (1<<3)) lcd.print(F("D4"));
if (PRNDL & (1<<5)) lcd.print(F("Rev"));
if (PRNDL & (1<<6)) lcd.print(F("P/N"));
}
if (DispReg == 4)
{
if (DispNeedRedraw==1) {lcd.clear(); lcd.print(F("t_EN t_AT volt "));}
lcd.setCursor(0, 1); lcd.print(F(" "));
lcd.setCursor(0, 1); lcd.print(t_Eng);lcd.print(char(223));lcd.print(F("C"));
lcd.setCursor(6, 1); lcd.print(t_AT);lcd.print(char(223));lcd.print(F("C"));
lcd.setCursor(12, 1); lcd.print(U_1);lcd.print(F("."));lcd.print(U_2);
}
if (DispReg == 5)
{
//TPS = 5*Try; if (TPS>100) TPS = 0;
if (DispNeedRedraw==1) {lcd.clear(); lcd.print(F("TPS: "));}
lcd.setCursor(6, 0); lcd.print(F(" "));
lcd.setCursor(6, 0); lcd.print(TPS);lcd.print(F("%"));
lcd.setCursor(0, 1); lcd.print(F(" "));
lcd.setCursor(0, 1);
for (i=0;i<(16*TPS/100);i++) lcd.print(char(255));lcd.print(F(">"));
}
if (DispReg == 6)
{
if (DispNeedRedraw==1) {lcd.clear(); lcd.print(F("L/H M-L/100KM-S"));}
lcd.setCursor(0, 1); lcd.print(F(" "));
lcd.setCursor(0, 1); lcd.print(L_H1);lcd.print(F("."));lcd.print(L_H2);
lcd.setCursor(6, 1); lcd.print(L_H3);lcd.print(F("."));lcd.print(L_H4);
lcd.setCursor(12, 1); lcd.print(L_KM1);lcd.print(F("."));lcd.print(L_KM2);
}
if (DispReg == 7)
{
if (DispNeedRedraw==1) {lcd.clear(); lcd.print(F("Fuel,L Dist,KM "));}
lcd.setCursor(0, 1); lcd.print(F(" "));
lcd.setCursor(0, 1); lcd.print(L_all1);lcd.print(F("."));lcd.print(L_all2);
lcd.setCursor(8, 1); lcd.print(KM_all1);lcd.print(F("."));lcd.print(KM_all2);
}
DispNeedRedraw = 0;
}
//--------------------Работа с дисплеем---------------------------------------------
//--------------------Работа с ECU---------------------------------------------
byte Calc_CheckSum(byte StartByte, byte EndByte)
{
byte i=0;
byte checkSum=0;
for (i=StartByte; i < EndByte; i++) checkSum += dataStream;
checkSum = ~checkSum + 1;
return checkSum;
}
byte ECU_get_Sync()
{
byte i,j;
long temp_msec;
//Serial.println("ECU_get_Sync");
temp_msec = millis();
while ((!find_Sync) && ((millis() - temp_msec) < 200))
{
while((!PCM_Serial.available()) && ((millis() - temp_msec) < 100));
dataStream[0] = dataStream[1];
dataStream[1] = dataStream[2];
dataStream[2] = dataStream[3];
dataStream[3] = PCM_Serial.read();
if ((dataStream[0] == 0xF0) && (dataStream[1] == 0x56) && (dataStream[2] == 0xF4) && (dataStream[3] == 0xC6)) find_Sync = true;
}
for (j=0;j<4;j++)
{
if (find_Sync)
{
find_Sync = false;
delay(10);
PCM_Serial.write(0xF4);
PCM_Serial.write(0x56);
PCM_Serial.write(0x08);
PCM_Serial.write(0xAE);
temp_msec = millis();
for (i=0; i < 5; i++)
{
while((!PCM_Serial.available()) && ((millis() - temp_msec) < 100));
dataStream = PCM_Serial.read();
}
if ((dataStream[0] == 0xF4) && (dataStream[1] == 0x56) && (dataStream[2] == 0x0 && (dataStream[3] == 0xAE)) find_Sync = true;
//if ((dataStream[1] == 0xF4) && (dataStream[2] == 0x56) && (dataStream[3] == 0x0 && (dataStream[4] == 0xAE)) find_Sync = true;
}
}
return find_Sync;
}
bool ECU_get_vin()
{
byte i;
long temp_msec;
delay(20);
PCM_Serial.write(0xF4);
PCM_Serial.write(0x57);
PCM_Serial.write(0x01);
PCM_Serial.write(0x04);
PCM_Serial.write(0xB0);
temp_msec = millis();
for (i=0; i < 3; i++)
{
while((!PCM_Serial.available()) && ((millis() - temp_msec) < 100));
dataStream[i] = PCM_Serial.read();
}
if (!(dataStream[0] == 0xF4 && dataStream[1] == 0x83 && dataStream[2] == 0x01))
{
PCM_Serial.flush();
return false;
}
temp_msec = millis();
for (i=3; i < 49; i++)
{
while((!PCM_Serial.available()) && ((millis() - temp_msec) < 100));
dataStream[i] = PCM_Serial.read();
}
//Serial.println(dataStream[48]);
//Serial.println(Calc_CheckSum(0, 48));
if (dataStream[48] != Calc_CheckSum(0, 48)) return false;
for (i=3; i < 20; i++) VIN[i-3] = dataStream[i];
//Serial.println("equal");
return true;
}
bool ECU_get_data0()
{
byte i;
long temp_msec, time_v;
word PW1, PW2;
float PW, L_H, L_KM, L_100;
delay(20);
PCM_Serial.write(0xF4);
PCM_Serial.write(0x57);
PCM_Serial.write(0x01);
PCM_Serial.write(byte(0));
PCM_Serial.write(0xB4);
temp_msec = millis();
for (i=0; i < 3; i++)
{
while((!PCM_Serial.available()) && ((millis() - temp_msec) < 100));
dataStream[i] = PCM_Serial.read();
}
if (!(dataStream[0] == 0xF4 && dataStream[1] == 0x92 && dataStream[2] == 0x01))
{
PCM_Serial.flush();
return false;
}
temp_msec = millis();
for (i=3; i < 64; i++)
{
while((!PCM_Serial.available()) && ((millis() - temp_msec) < 100));
dataStream[i] = PCM_Serial.read();
}
if (dataStream[63] != Calc_CheckSum(0, 63)) return false;
//Обработка данных
DTC_ALL = 0;
i = 0;
memset(ErrorCode_Table, 0, sizeof(ErrorCode_Table));
if (dataStream[3] & (1<<0)) {ErrorCode_Table[i]=86; DTC_ALL++;i++;}
if (dataStream[3] & (1<<1)) {ErrorCode_Table[i]=85; DTC_ALL++;i++;}
if (dataStream[3] & (1<<2)) {ErrorCode_Table[i]=84; DTC_ALL++;i++;}
if (dataStream[3] & (1<<3)) {ErrorCode_Table[i]=83; DTC_ALL++;i++;}
if (dataStream[3] & (1<<4)) {ErrorCode_Table[i]=82; DTC_ALL++;i++;}
if (dataStream[3] & (1<<5)) {ErrorCode_Table[i]=81; DTC_ALL++;i++;}
if (dataStream[3] & (1<<6)) {ErrorCode_Table[i]=80; DTC_ALL++;i++;}
if (dataStream[3] & (1<<7)) {ErrorCode_Table[i]=79; DTC_ALL++;i++;}
if (dataStream[4] & (1<<0)) {ErrorCode_Table[i]=27; DTC_ALL++;i++;}
if (dataStream[4] & (1<<1)) {ErrorCode_Table[i]=26; DTC_ALL++;i++;}
if (dataStream[4] & (1<<2)) {ErrorCode_Table[i]=25; DTC_ALL++;i++;}
if (dataStream[4] & (1<<3)) {ErrorCode_Table[i]=23; DTC_ALL++;i++;}
if (dataStream[4] & (1<<4)) {ErrorCode_Table[i]=16; DTC_ALL++;i++;}
if (dataStream[4] & (1<<5)) {ErrorCode_Table[i]=13; DTC_ALL++;i++;}
if (dataStream[4] & (1<<6)) {ErrorCode_Table[i]=12; DTC_ALL++;i++;}
if (dataStream[4] & (1<<7)) {ErrorCode_Table[i]=11; DTC_ALL++;i++;}
if (dataStream[5] & (1<<0)) {ErrorCode_Table[i]=43; DTC_ALL++;i++;}
if (dataStream[5] & (1<<1)) {ErrorCode_Table[i]=42; DTC_ALL++;i++;}
if (dataStream[5] & (1<<2)) {ErrorCode_Table[i]=41; DTC_ALL++;i++;}
if (dataStream[5] & (1<<3)) {ErrorCode_Table[i]=36; DTC_ALL++;i++;}
if (dataStream[5] & (1<<4)) {ErrorCode_Table[i]=48; DTC_ALL++;i++;}
if (dataStream[5] & (1<<5)) {ErrorCode_Table[i]=47; DTC_ALL++;i++;}
if (dataStream[5] & (1<<6)) {ErrorCode_Table[i]=32; DTC_ALL++;i++;}
if (dataStream[5] & (1<<7)) {ErrorCode_Table[i]=29; DTC_ALL++;i++;}
if (dataStream[6] & (1<<0)) {ErrorCode_Table[i]=61; DTC_ALL++;i++;}
if (dataStream[6] & (1<<1)) {ErrorCode_Table[i]=55; DTC_ALL++;i++;}
if (dataStream[6] & (1<<2)) {ErrorCode_Table[i]=54; DTC_ALL++;i++;}
if (dataStream[6] & (1<<3)) {ErrorCode_Table[i]=52; DTC_ALL++;i++;}
if (dataStream[6] & (1<<4)) {ErrorCode_Table[i]=50; DTC_ALL++;i++;}
if (dataStream[6] & (1<<5)) {ErrorCode_Table[i]=46; DTC_ALL++;i++;}
if (dataStream[6] & (1<<6)) {ErrorCode_Table[i]=45; DTC_ALL++;i++;}
if (dataStream[6] & (1<<7)) {ErrorCode_Table[i]=44; DTC_ALL++;i++;}
if (dataStream[7] & (1<<0)) {ErrorCode_Table[i]=69; DTC_ALL++;i++;}
if (dataStream[7] & (1<<1)) {ErrorCode_Table[i]=68; DTC_ALL++;i++;}
if (dataStream[7] & (1<<2)) {ErrorCode_Table[i]=67; DTC_ALL++;i++;}
if (dataStream[7] & (1<<3)) {ErrorCode_Table[i]=66; DTC_ALL++;i++;}
if (dataStream[7] & (1<<4)) {ErrorCode_Table[i]=65; DTC_ALL++;i++;}
if (dataStream[7] & (1<<5)) {ErrorCode_Table[i]=64; DTC_ALL++;i++;}
if (dataStream[7] & (1<<6)) {ErrorCode_Table[i]=63; DTC_ALL++;i++;}
if (dataStream[7] & (1<<7)) {ErrorCode_Table[i]=62; DTC_ALL++;i++;}
if (dataStream[8] & (1<<0)) {ErrorCode_Table[i]=78; DTC_ALL++;i++;}
if (dataStream[8] & (1<<1)) {ErrorCode_Table[i]=77; DTC_ALL++;i++;}
if (dataStream[8] & (1<<2)) {ErrorCode_Table[i]=71; DTC_ALL++;i++;}
if (dataStream[8] & (1<<3)) {ErrorCode_Table[i]=70; DTC_ALL++;i++;}
// if (dataStream[8] & (1<<4)) {ErrorCode_Table[i]=31; DTC_ALL++;i++;}
// if (dataStream[8] & (1<<5)) {ErrorCode_Table[i]=19; DTC_ALL++;i++;}
// if (dataStream[8] & (1<<6)) {ErrorCode_Table[i]=18; DTC_ALL++;i++;}
// if (dataStream[8] & (1<<7)) {ErrorCode_Table[i]=17; DTC_ALL++;i++;}
// if (dataStream[9] & (1<<0)) {ErrorCode_Table[i]=57; DTC_ALL++;i++;}
// if (dataStream[9] & (1<<1)) {ErrorCode_Table[i]=56; DTC_ALL++;i++;}
// if (dataStream[9] & (1<<2)) {ErrorCode_Table[i]=49; DTC_ALL++;i++;}
if (dataStream[9] & (1<<3)) {ErrorCode_Table[i]=34; DTC_ALL++;i++;}
if (dataStream[9] & (1<<4)) {ErrorCode_Table[i]=33; DTC_ALL++;i++;}
// if (dataStream[9] & (1<<5)) {ErrorCode_Table[i]=39; DTC_ALL++;i++;}
// if (dataStream[9] & (1<<6)) {ErrorCode_Table[i]=35; DTC_ALL++;i++;}
if (dataStream[9] & (1<<7)) {ErrorCode_Table[i]=24; DTC_ALL++;i++;}
if (dataStream[10] & (1<<0)) {ErrorCode_Table[i]=53; DTC_ALL++;i++;}
if (dataStream[10] & (1<<1)) {ErrorCode_Table[i]=51; DTC_ALL++;i++;}
if (dataStream[10] & (1<<2)) {ErrorCode_Table[i]=38; DTC_ALL++;i++;}
if (dataStream[10] & (1<<3)) {ErrorCode_Table[i]=37; DTC_ALL++;i++;}
if (dataStream[10] & (1<<4)) {ErrorCode_Table[i]=22; DTC_ALL++;i++;}
if (dataStream[10] & (1<<5)) {ErrorCode_Table[i]=21; DTC_ALL++;i++;}
if (dataStream[10] & (1<<6)) {ErrorCode_Table[i]=15; DTC_ALL++;i++;}
if (dataStream[10] & (1<<7)) {ErrorCode_Table[i]=14; DTC_ALL++;i++;}
if (dataStream[59] & (1<<0)) {ErrorCode_Table[i]=99; DTC_ALL++;i++;}
if (dataStream[59] & (1<<1)) {ErrorCode_Table[i]=98; DTC_ALL++;i++;}
if (dataStream[59] & (1<<2)) {ErrorCode_Table[i]=97; DTC_ALL++;i++;}
if (dataStream[59] & (1<<3)) {ErrorCode_Table[i]=96; DTC_ALL++;i++;}
if (dataStream[59] & (1<<4)) {ErrorCode_Table[i]=95; DTC_ALL++;i++;}
// if (dataStream[59] & (1<<5)) {ErrorCode_Table[i]=60; DTC_ALL++;i++;}
// if (dataStream[59] & (1<<6)) {ErrorCode_Table[i]=40; DTC_ALL++;i++;}
// if (dataStream[59] & (1<<7)) {ErrorCode_Table[i]=30; DTC_ALL++;i++;}
//Serial.println(dataStream[3]);
//Serial.println(dataStream[4]);
//Serial.println(dataStream[5]);
//Serial.println(dataStream[6]);
//Serial.println(dataStream[7]);
//Serial.println(dataStream[8]);
//Serial.println(dataStream[9]);
//Serial.println(dataStream[10]);
//Serial.println(dataStream[59]);
//Serial.println();
Velosity = (word) ((float) (dataStream[60])*1.609343);
RPM = dataStream[24]*25;
PRNDL = dataStream[18];
U_1 = (byte)((float)dataStream[33]) / 10;
U_2 = dataStream[33] - U_1*10;
TPS = (byte)((float)dataStream[32]) / 2.55;
//расчет расхода
if (RPM > 500)
{
PW1 = (((word)dataStream[44]) << + dataStream[45]; //LEFT BASE PULSE WIDTH
PW2 = (((word)dataStream[46]) << + dataStream[47]; //RIGHT BASE PULSE WIDTH
PW = ((float)(PW1+PW2)) / 131.072; //Cредняя ширина импульса
L_H = PW * RPM * 0.001008; //Расход л/час
L_H1 = (byte)(L_H);
L_H2 = (byte)((L_H - L_H1)*10);
//Расчет всего потраченого топлива
time_v = millis() - msec_L_KM;
msec_L_KM = millis();
L_all = L_all + (L_H / 3600000 * time_v);
L_all1 = (byte)(L_all);
L_all2 = (byte)((L_all - L_all1)*10);
//Если скорость больше 10 км/час считаем расход на 100км
if (Velosity > 5)
{
//Мнгновенный расход
L_100 = L_H/((float)Velosity)*100;
if (L_100 > 99) L_100 = 99;
L_H3 = (byte)(L_100);
L_H4 = (byte)((L_100 - L_H3)*10);
//Средний расход
KM_all = KM_all + (((float)Velosity) / 3600000 * time_v);
KM_all1 = (byte)(KM_all);
KM_all2 = (byte)((KM_all - KM_all1)*10);
L_KM = L_all / KM_all *100;
if (L_KM > 99) L_KM = 99;
L_KM1 = (byte)(L_KM);
L_KM2 = (byte)((L_KM - L_KM1)*10);
}
}
return true;
}
bool ECU_get_data1()
{
byte i;
long temp_msec;
delay(20);
PCM_Serial.write(0xF4);
PCM_Serial.write(0x57);
PCM_Serial.write(0x01);
PCM_Serial.write(0x01);
PCM_Serial.write(0xB3);
temp_msec = millis();
for (i=0; i < 3; i++)
{
while((!PCM_Serial.available()) && ((millis() - temp_msec) < 100));
dataStream[i] = PCM_Serial.read();
}
if (!(dataStream[0] == 0xF4 && dataStream[1] == 0x84 && dataStream[2] == 0x01))
{
PCM_Serial.flush();
return false;
}
temp_msec = millis();
for (i=3; i < 50; i++)
{
while((!PCM_Serial.available()) && ((millis() - temp_msec) < 100));
dataStream[i] = PCM_Serial.read();
}
if (dataStream[49] != Calc_CheckSum(0, 49)) return false;
//Обработка данных
t_Eng = (int)(((float) dataStream[34])*0.75 - 40);
t_AT = (int)(((float) dataStream[35])*0.75 - 40);
return true;
}
//--------------------Работа с ECU---------------------------------------------
void setup()
{
Serial.begin(115200);
PCM_Serial.begin(8192);
lcd.begin(16, 2);
DispReg = 0;DispNeedRedraw = 1;DispDraw();delay(2000);
DTC_Num = 0;
Try = 0;
msec = millis();
msec_Disp = millis();
msec_L_KM = millis();
find_Sync = false;
DTC_ALL = 0;
memset(ErrorCode_Table, 0, sizeof(ErrorCode_Table));
Velosity = 0;
RPM = 0;
PRNDL = 0;
t_Eng = 0;
t_AT = 0;
U_1 = 0;
U_2 = 0;
TPS = 0;
L_H1 = 0;
L_H2 = 0;
L_H3 = 0;
L_H4 = 0;
L_all = 0;
KM_all = 0;
L_KM1 = 0;
L_KM2 = 0;
L_all1 = 0;
KM_all1 = 0;
L_all2 = 0;
KM_all2 = 0;
}
void loop()
{
DispDraw();
button = getPressedButton();
switch (button)
{
case BUTTON_SELECT:
if (!find_Sync) break;
DispReg++;
if (DispReg > 7) DispReg = 1;
DispNeedRedraw = 1;
break;
case BUTTON_LEFT:
if (!find_Sync)
{
DispReg++;
if (DispReg > 7) DispReg = 1;
DispNeedRedraw = 1;
}
else
{
if (DispReg == 2)
{
DTC_Num++;
if ((DTC_Num+1) > DTC_ALL) DTC_Num = 0;
}
}
break;
}
if ((millis() - msec_Disp) > 300)
{
if ((DispReg == 3)||(DispReg == 4)||(DispReg == 5)||(DispReg == 6)) if (DispNeedRedraw == 0) DispNeedRedraw = 2;
msec_Disp = millis();
}
if ((millis() - msec) > 1000)
{
Try++;
msec = millis();
if ((Try == 3) && (DispReg == 0)) {DispReg = 100;DispNeedRedraw = 1;Try = 0;}
if ((DispReg == 100) && (DispNeedRedraw == 0)) {DispReg = 101;DispNeedRedraw = 1;}
if (DispReg == 101) {DispNeedRedraw = 1;}
if ((Try == 3) && (DispReg == 102) && (DispNeedRedraw == 0)) {DispReg = 1;DispNeedRedraw = 1;}
if ((Try == 15) && (!find_Sync)/*&& (DispReg == 101)*/) {DispReg = 103;DispNeedRedraw = 1;Try = 0;}
if ((Try == 3) && (DispReg == 103) && (DispNeedRedraw == 0)) {DispReg = 100;DispNeedRedraw = 1;Try = 0;}
}
if (!find_Sync)
{
if (ECU_get_Sync())
if (ECU_get_vin()) {DispReg = 102;DispNeedRedraw = 1;Try = 0;}
}
else
{
if (!ECU_get_data0()) {DispReg = 103;DispNeedRedraw = 1;Try = 0;find_Sync=false;}
if (!ECU_get_data1()) {DispReg = 103;DispNeedRedraw = 1;Try = 0;find_Sync=false;}
}
}
ну, судя по коду данные вытаскиваются по следующему алгоритму
1. посылается серия команд при помощи
PCM_Serial.write
2. ожидается ответ при помощи
PCM_Serial.available()
3. данные вытаскиваются при помощи
PCM_Serial.read
4. данные обрабатываются
а уже какие команды, в какой последовательности, какие данные - это нужно смотреть даташит железки.
даташит есть, но я не могу сопоставить
DATA STREAM A274 SPECIFICATION
..PAGE
SPECIFICATIONS FOR DATA STREAM INFORMATION
------------------------------------------
ENGINE USAGE:
5.7L SFI (LT1) (VIN = P) 1994 1,2F - CARS AUTOMATIC TRANSMISSION
* 5.7L SFI (LT1) (VIN = P) 1995 1,2F - CARS AUTOMATIC TRANSMISSION
DATA PIN: READ DATA ON PIN "M" OF ALDL CONNECTOR
BAUD RATE: 8192
PAGE
MODE 0 (RETURN TO NORMAL MODE)
ALDL REQUEST:
- MESSAGE ID = $F4
- MESSAGE LENGTH = $56
- MODE NUMBER = $00
- MESSAGE CHECKSUM
ECM RESPONSE:
NORMAL MESSAGES
MODE 1 (TRANSMIT FIXED DATA STREAM MESSAGE 0)
ALDL REQUEST:
- MESSAGE ID = $F4
- MESSAGE LENGTH = $57
- MODE NUMBER = $01
- MESSAGE NUMBER = $00
- CHECKSUM
THE ECM WILL RESPOND WITH THE FOLLOWING MESSAGE:
- MESSAGE ID = $F4
- MESSAGE LENGTH = $92
- MODE NUMBER = $01
- DATA BYTE 1
.
.
- DATA BYTE 60
- CHECKSUM
MODE 1 (TRANSMIT FIXED DATA STREAM MESSAGE 1)
ALDL REQUEST:
- MESSAGE ID = $F4
- MESSAGE LENGTH = $57
- MODE NUMBER = $01
- MESSAGE NUMBER = $01
- CHECKSUM
THE ECM WILL RESPOND WITH THE FOLLOWING MESSAGE:
- MESSAGE ID = $F4
- MESSAGE LENGTH = $84
- MODE NUMBER = $01
- DATA BYTE 1
.
.
- DATA BYTE 46
- CHECKSUM
MODE 1 (TRANSMIT FIXED DATA STREAM MESSAGE 2)
ALDL REQUEST:
- MESSAGE ID = $F4
- MESSAGE LENGTH = $57
- MODE NUMBER = $01
- MESSAGE NUMBER = $02
- CHECKSUM
THE ECM WILL RESPOND WITH THE FOLLOWING MESSAGE:
- MESSAGE ID = $F4
- MESSAGE LENGTH = $8B
- MODE NUMBER = $01
- DATA BYTE 1
.
.
- DATA BYTE 53
- CHECKSUM
MODE 1 (TRANSMIT FIXED DATA STREAM MESSAGE 4)
ALDL REQUEST:
- MESSAGE ID = $F4
- MESSAGE LENGTH = $57
- MODE NUMBER = $01
- MESSAGE NUMBER = $04
- CHECKSUM
THE ECM WILL RESPOND WITH THE FOLLOWING MESSAGE:
- MESSAGE ID = $F4
- MESSAGE LENGTH = $83
- MODE NUMBER = $01
- DATA BYTE 1
.
.
- DATA BYTE 45
- CHECKSUM
MODE 1 (TRANSMIT FIXED DATA STREAM MESSAGE 6)
ALDL REQUEST:
- MESSAGE ID = $F4
- MESSAGE LENGTH = $57
- MODE NUMBER = $01
- MESSAGE NUMBER = $06
- CHECKSUM
THE ECM WILL RESPOND WITH THE FOLLOWING MESSAGE:
- MESSAGE ID = $F4
- MESSAGE LENGTH = $7C
- MODE NUMBER = $01
- DATA BYTE 1
.
.
- DATA BYTE 38
- CHECKSUM
MODE 7 (COMMAND MESSAGE NORMAL MODE MESSAGE)
ALDL REQUEST:
- MESSAGE ID = $F4
- MESSAGE LENGTH = $57
- MODE NUMBER = $07
- MESSAGE ID = $45, $4A, OR $F0
- CHECKSUM
THE ECM WILL RESPOND WITH THE REQUESTED WITH NORMAL MESSAGE
MODE 8 (DISABLE NORMAL COMMUNICATIONS)
ALDL REQUEST:
- MESSAGE ID = $F4
- MESSAGE LENGTH = $56
- MODE NUMBER = $08
- CHECKSUM
THE ECM WILL RESPOND WITH THE FOLLOWING MESSAGE:
- MESSAGE ID = $F4
- MESSAGE LENGTH = $56
- MODE NUMBER = $08
- CHECKSUM
..PAGE
MODE 9 (ENABLE NORMAL COMMUNICATIONS)
ALDL REQUEST:
- MESSAGE ID = $F4
- MESSAGE LENGTH = $56
- MODE NUMBER = $09
- CHECKSUM
THE ECM WILL RESPOND WITH THE FOLLOWING MESSAGE:
- MESSAGE ID = $F4
- MESSAGE LENGTH = $56
- MODE NUMBER = $09
- CHECKSUM
MODE 10 (CLEAR MALFUNCTION CODES - TESTER TO ECM)
ALDL REQUEST:
- MESSAGE ID = $F4
- MESSAGE LENGTH = $56
- MODE NUMBER = $0A
- CHECKSUM
THE ECM WILL RESPOND WITH THE FOLLOWING MESSAGE:
- MESSAGE ID = $F4
- MESSAGE LENGTH = $56
- MODE NUMBER = $0A
- CHECKSUM
..PAGE
..HEAD02L ALDL DATA LIST
..HEAD03L NUMBER OF DATA WORDS - 60
..HEAD04L ALDL MODE 1 MESSAGE 0 DATA LIST
WORD # DATA NAME DESCRIPTION
1 MALFFW10 LOGGED MALF FLAG WORD 10
0 CODE 86 LOW RATIO
1 CODE 85 TCC STUCK ON
2 CODE 84 3-2 DOWNSHIFT FEEDBACK FAULT (ODM)
3 CODE 83 TCC CONTROL FEEDBACK FAULT (ODM)
4 CODE 82 SHIFT A SOLENOID FAULT (ODM)
5 CODE 81 SHIFT B SOLENOID FAULT (ODM)
6 CODE 80 TRANSMISSION COMPONENT SLIPPING
7 CODE 79 TRANSMISSION OVER TEMPERATURE
2 MALFFW2 LOGGED MALF FLAG WORD 2
0 CODE 27 EGR ELECTRICAL FAULT (ODM)
1 CODE 26 CCP ELECTRICAL FAULT (ODM)
2 CODE 25 MAT SENSOR HIGH
3 CODE 23 MAT SENSOR LOW
4 CODE 16 LO-RES FAILURE
5 CODE 13 LEFT O2 SENSOR FAILED
6 CODE 12 NO REFERENCE PULSES
7 CODE 11 MALF INDICATOR LAMP (MIL) FAULT
3 MALFFW3 LOGGED MALF FLAG WORD 3
0 CODE 43 ESC FAILURE
1 CODE 42 EST GROUNDED
2 CODE 41 EST OPEN
3 CODE 36 HI-RES FAILURE
4 CODE 48 MASS AIR FLOW SYSTEM FAILURE
5 CODE 47 NOT USED
6 CODE 32 EGR SYSTEM FAULT
7 CODE 29 EAS ELECTRICAL FAULT (ODM)
MALFFW4 LOGGED MALF FLAG WORD 4
0 CODE 61 A/C LOW CHARGE
1 CODE 55 FUEL SYSTEM LEAN
2 CODE 54 NOT USED
3 CODE 52 OIL TEMPERATURE LOW
4 CODE 50 SYSTEM VOLTAGE LOW
5 CODE 46 FUEL ENABLE FAILURE
6 CODE 45 LEFT O2 SENSOR RICH
7 CODE 44 LEFT O2 SENSOR LEAN
5 MALFFW5 LOGGED MALF FLAG WORD 5
0 CODE 69 A/C CLUTCH CIRCUIT OPEN
1 CODE 68 A/C RELAY SHORTED
2 CODE 67 A/C PRESSURE TRANSDUCER DEGRADED
3 CODE 66 A/C PRESSURE TRANSDUCER OPEN/SHORT
4 CODE 65 RIGHT O2 SENSOR RICH
5 CODE 64 RIGHT O2 SENSOR LEAN
6 CODE 63 RIGHT O2 SENSOR FAILED
7 CODE 62 OIL TEMPERATURE HIGH
6 MALFFW6 LOGGED MALF FLAG WORD 6
0 CODE 78 FAN 2 FAULT (ODM)
1 CODE 77 FAN 1 FAULT (ODM)
2 CODE 71 A/C EVAPORATOR TEMP SENSOR FAILED
3 CODE 70 A/C CLUTCH RELAY FAULT (ODM)
4 CODE 31 NOT USED
5 CODE 19 NOT USED
6 CODE 18 NOT USED
7 CODE 17 NOT USED
7 MALFFW7 LOGGED MALF FLAG WORD 7
0 CODE 57 NOT USED
1 CODE 56 NOT USED
2 CODE 49 NOT USED
3 CODE 34 MAP SENSOR LOW
4 CODE 33 MAP SENSOR HIGH
5 CODE 39 NOT USED
6 CODE 35 NOT USED
7 CODE 24 OUTPUT SPEED LOW
8 MALFFW8 LOGGED MALF FLAG WORD 8
0 CODE 53 SYSTEM VOLTAGE HIGH
1 CODE 51 PROM/FLASH ERROR
2 CODE 38 BRAKE SWITCH STUCK OFF
3 CODE 37 BRAKE SWITCH STUCK ON
4 CODE 22 THROTTLE POSITION LOW
5 CODE 21 THROTTLE POSITION HIGH
6 CODE 15 COOLANT TEMPERATURE LOW
7 CODE 14 COOLANT TEMPERATURE HIGH
9 SDINMW1 INPUT MODE WORD 1
0 1 = A/C CLUTCH STATUS
1 1 = A/C REQUEST
2 1 = HEATED WINDSHIELD REQUEST
3 1 = POWER STEERING PRESSURE SWITCH
4 1 = OIL CHANGE RESET SWITCH
5 1 = OIL LEVEL SWITCH
6 1 = PARK/NEUTRAL SWITCH
7 1 = CRUISE ACTIVE
10 SDINMW2 INPUT MODE WORD 2
0 1 = TCC BRAKE SWITCH
1 1 = NOT USED
2 1 = TRANSMISSION PERFORMANCE/NORMAL SWITCH PRESSED
3 1 = TRANSMISSION MODE A
4 1 = TRANSMISSION MODE B
5 1 = TRANSMISSION MODE C
6 1 = SPARK RETARD REQUEST
7 1 = ASR ACTIVE
11 SDOUTMW1 OUTPUT MODE WORD 1
0 1 = TCC CONTROL
1 1 = TCC ENABLE
2 1 = SHIFT A SEE TABLE
3 1 = SHIFT B SEE TABLE
4 1 = NOT USED
5 NOT USED
6 NOT USED
7 NOT USED
SHIFT B SHIFT A GEAR
----------------------
0 0 3RD
----------------------
0 1 4TH
----------------------
1 0 2ND
----------------------
1 1 1ST
----------------------
12 SDOUTMW2 OUTPUT MODE WORD 2
0 1 = FAN 1 RELAY
1 1 = FAN 2 RELAY
2 1 = A.I.R. PUMP
3 1 = A/C CLUTCH
4 NOT USED
5 NOT USED
6 NOT USED
7 NOT USED
13 SDSTMW1 STATUS MODE WORD 1
0 1 = ENGINE CLOSED LOOP
1 1 = LEFT O2 READY
2 1 = RIGHT O2 READY
3 1 = LEARN ENABLED
4 1 = CLEAN CANISTER
5 1 = CATALYTIC CONVERTER OVERTEMP
6 1 = ENGINE MALFS OCCURRED
7 1 = TRANSMISSION MALFS OCCURRED
14 SDSTMW2 STATUS MODE WORD 2
0 1 = POWER ENRICHMENT ACTIVE
1 1 = KICKDOWN PATTERN
2 1 = MALF 43A ACTIVE
3 1 = MALF 43C ACTIVE
4 1 = MALF 43D ACTIVE
5 1 = INJECTOR FAULT DETECTED THIS RUN CYCLE
6 1 = FEDS ENABLED
7 1 = RESET OCCURRED THIS RUN CYCLE
15 NOT USED
16 PRNDLFLG RANGE INDICATION
0 1 = LOW
1 1 = DRIVE 2
2 1 = DRIVE 3
3 1 = DRIVE 4
4 1 = NOT USED
5 1 = REVERSE
6 1 = PARK/NEUTRAL
7 1 = INVALID
17 SDCYLID CYLINDER ID (LOWER BYTE)
N = CYLINDER ID
18 NEWRFPRT PRESENT MINOR LOOP REFERENCE PERIOD (MSB)
19 NEWRFPRT+1 PRESENT MINOR LOOP REFERENCE PERIOD (LSB)
RPM = 2949120/N
MSECS = N * .005078
20 GP6ERPMC COEFFICIENT OF VARIATION OF RPM
N = % * 10.24
21 ISESDD DESIRED IDLE SPEED
N = RPM / 12.5
22 NTRPMX RPM VARIABLE SCALED 25 RPM / BIT
N = RPM / 25
23 COOLDEGR RAW LINEARIZED COOLANT TEMPERATURE
DEG C = .75N - 40
DEG F = 1.35N - 40
24 NOT USED
25 MATDEGND NON-DEFAULTED MAT VARIABLE
DEG C = .75N - 40
DEG F = 1.35N - 40
26 EVAPTEMP A/C EVAPORATOR TEMPERATURE
DEG F = N/2
DEG C = (N - 64)/3.6
27 ADACPRES A/D RESULT FROM A/C PRESSURE TRANSDUCER
VOLTS = 5N/255
PSI = 1.833N - 14.95
28 ADMAP A/D RESULT FROM MANIFOLD PRES. SENSOR INPUT
VOLTS = 5N/255
(kpa = (N + 28.06)/2.71)
29 ADTHROTT A/D RESULT FROM TPS INPUT
VOLTS = 5N/255
30 NTPSLDT THROTTLE POSITION LOAD AXIS VARIABLE
% TPS = N/2.55
31 ADIGNVLT A/D RESULT FROM IGNITION VOLTAGE INPUT
VOLTS = N/10
32 NVADBARO NON-VOLATILE COMPUTED A/D BARO
VOLTS = 5N/255
(kpa = (N + 28.06)/2.71)
33 ADLO2RAW RAW A/D COUNTS FROM LEFT O2 SENSOR (EECC)
mV = 4.44N
34 ADRO2RAW RAW A/D COUNTS FROM RIGHT O2 SENSOR (EECC
mV = 4.44N
35 NOT USED
36 NOT USED
37 BLMCELL BLOCK LEARN MULTIPLIER CELL NUMBER
N = CELL
38 LBLM LEFT BANK BLOCK LEARN MULTIPLIER
N = COUNTS
39 RBLM RIGHT BANK BLOCK LEARN MULTIPLIER
N = COUNTS
40 LCORRCL CLOSED LOOP CORRECTION FOR LEFT O2 SENSOR
N = COUNTS
41 RCORRCL CLOSED LOOP CORRECTION FOR RIGHT O2 SENSOR
N = COUNTS
42 GP6EBPWL GMP6-E LEFT BASE PULSE WIDTH (MSB)
43 GP6EBPWL+1 GMP6-E LEFT BASE PULSE WIDTH (LSB)
MSEC = N/65.536
44 GP6EBPWR GMP6-E RIGHT BASE PULSE WIDTH (MSB)
45 GP6EBPWR+1 GMP6-E RIGHT BASE PULSE WIDTH (LSB)
MSEC = N/65.536
46 GP6EAFND GMP6-E NON-DEFAULTED AIRFLOW (MSB)
47 GP6EAFND+1 GMP6-E NON-DEFAULTED AIRFLOW (LSB)
GM/SEC = 512N/65536
48 CCPDC OUTPUT DUTY CYCLE FOR CCP
%DC = N/2.55
49 ISSPMP IAC PRESENT MOTOR POSITION
MOTOR POSITION = N
50 ISMNMPKA KEEP-ALIVE IAC MINIMUM MOTOR POSITION
KA MINIMUM MOTOR POSITION = N
51 GP6ESPKO SPARK OUTPUT
DEGREES = N
52 GP6ENOCK KNOCK RETARD
DEGREES = N/16
53 GP6EP2CT UP INTEGRATED KNOCK SENSOR INPUT (MSB)
54 GP6EP2CT+1 UP INTEGRATED KNOCK SENSOR INPUT (LSB)
N = ESC COUNTS
55 NOT USED
56 GP6TEGR EGR DUTY CYCLE
%DC = N/2.55
57 MALFFW12 LOGGED MALF FLAG WORD 12
0 CODE 99 TACH OUTPUT CKT FAULT
1 CODE 98 TORQUE DELIVERED CKT FAULT
2 CODE 97 4K PULSES CKT FAULT (VSS)
3 CODE 96 OIL LEVEL LAMP CKT FAULT
4 CODE 95 OIL LIFE LAMP CKT FAULT
5 CODE 60 NOT USED
6 CODE 40 NOT USED
7 CODE 30 NOT USED
58 MPH VEHICLE SPEED
MPH = N
59 TIME ENGINE RUN TIME (MSB)
60 TIME+1 ENGINE RUN TIME (LSB)
SECONDS = N
..PAGE
..HEAD02L ALDL DATA LIST
..HEAD03L NUMBER OF DATA WORDS - 46
..HEAD04L ALDL MODE 1 MESSAGE 1 DATA LIST
WORD # DATA NAME DESCRIPTION
1 MALFFW7 MALF FLAGWORD #7
0 CODE 57 NOT USED
1 CODE 56 NOT USED
2 CODE 49 NOT USED
3 CODE 34 MAP SENSOR LOW
4 CODE 33 MAP SENSOR HIGH
5 CODE 39 NOT USED
6 CODE 35 NOT USED
7 CODE 24 OUTPUT SPEED LOW
2 MALFFW8 MALF FLAGWORD #8
0 CODE 53 SYSTEM VOLTAGE HIGH
1 CODE 51 PROM/FLASH ERROR
2 CODE 38 BRAKE SWITCH STUCK OFF
3 CODE 37 BRAKE SWITCH STUCK ON
4 CODE 22 THROTTLE POSITION LOW
5 CODE 21 THROTTLE POSITION HIGH
6 CODE 15 COOLANT TEMPERATURE LOW
7 CODE 14 COOLANT TEMPERATURE HIGH
3 MALFFW9 MALF FLAGWORD #9
0 CODE 76 LONG SYSTEM VOLTAGE HIGH
1 CODE 75 SYSTEM VOLTAGE LOW
2 CODE 74 ASR ACTIVE FAULT
3 CODE 73 FORCE MOTOR CURRENT
4 CODE 72 OUTPUT SPEED LOSS
5 CODE 59 TRANSMISSION TEMPERATURE LOW
6 CODE 58 TRANSMISSION TEMPERATURE HIGH
7 CODE 28 PRESSURE SWITCH MANIFOLD
4 MALFFW10 MALF FLAGWORD #10
0 CODE 86 LOW RATIO
1 CODE 85 TCC STUCK ON
2 CODE 84 3-2 DOWNSHIFT FEEDBACK FAULT (ODM)
3 CODE 83 TCC CONTROL FEEDBACK FAULT (ODM)
4 CODE 82 SHIFT A SOLENOID FAULT (ODM)
5 CODE 81 SHIFT B SOLENOID FAULT (ODM)
6 CODE 80 TRANSMISSION COMPONENT SLIPPING
7 CODE 79 TRANSMISSION OVER TEMPERATURE
5 MALFFW11 MALF FLAGWORD #11
0 CODE 94 TRANS MANUAL LIGHT FAULT (ODM)
1 CODE 93 SERVICE VEH. SOON LIGHT FAULT (ODM)
2 CODE 92 TRANS PERF LIGHT FAULT (ODM)
3 CODE 91 1-4, 2-5 SHIFT LIGHT FAULT (ODM)
4 CODE 90 TCC ENABLE FAULT (ODM)
5 CODE 89 MAX ADAPT AND LONG SHIFT
6 CODE 88 NOT USED
7 CODE 87 HIGH RATIO
6 ADTHROT A/D RESULT FROM TPS INPUT
VOLTS = 5N/255
7 NDTHRPOS CURRENT NON-DEFAULTED POSITION OF THROTTLE
N = A/D COUNTS
8 NE ENGINE SPEED (FILTERED) MSB
9 NE+1 ENGINE SPEED (FILTERED) LSB
RPM = N/8
10 VEHSPEED VEHICLE SPEED (FILTERED)
MPH = N/2
11 PRESSURE CURRENT TORQUE SIGNAL PRESSURE
PSI = N
12 CURRENT REFERENCE CURRENT FORCE MOTOR CIRCUIT
AMPS = N/51.2
13 CURRACT ACTUAL CURRENT SAMPLED FROM A/D
AMPS = N/51.2
14 FMDC FORCE MOTOR DUTY CYCLE
% = N/2.55
15 PRNDLFLG RANGE FLAGWORD
0 1 = LOW GEAR
1 1 = DRIVE 2
2 1 = DRIVE 3
3 1 = DRIVE 4
4 1 = NOT USED
5 1 = REVERSE
6 1 = PARK/NEUTRAL
7 1 = ILLEGAL RANGE
16 ADBAT TRANSMISSION IGNITION VOLTAGE VARIABLE
VOLTS = N/10
17 GEAR CURRENT COMMANDED GEAR OF TRANSMISSION
GEAR = N + 1
18 CURADPT CURRENT ADAPTIVE MODIFIER
PSI = N
19 CURCELL CURRENT ADAPTIVE MODIFIER INDEX WITHIN TABLE
N = CELL
20 ERROR12 ERROR BETWEEN DESIRED AND ACTUAL SHIFT TIMES FOR LATEST
SECONDS = N/40
21 ERROR23 ERROR BETWEEN DESIRED AND ACTUAL SHIFT TIMES FOR LATEST
SECONDS = N/40
22 SLIP ABSOLUTE VALUE OF SLIP (MSB)
23 SLIP+1 ABSOLUTE VALUE OF SLIP (LSB)
RPM = N/8 (SIGNED)
24 TIME12 TIME OF LATEST 1-2 UPSHIFT
SECONDS = N/40
25 TIME23 TIME OF LATEST 2-3 UPSHIFT
SECONDS = N/40
26 PROMIDB PROM ID FOR TRANSMISSION (MSB)
27 PROMIDB+1 PROM ID FOR TRANSMISSION (LSB)
ID = N
28 DSSDC 3-2 PWM SOL.% DUTY CYCLE
%DC = N/2.55
29 MPH 1 MPH/BIT ROAD SPEED VARIABLE
MPH = N
30 NORAWA RAW OUTPUT SPEED (MSB)
31 NORAWA+1 RAW OUTPUT SPEED (LSB)
RPM = N/8
32 CLDEGFLT COOLANT VARIABLE, FILTERED - ENGINE
DEG C = .75N - 40
DEG F = 1.35N - 40
33 TRANDEGA NORMALIZED TRANSMISSION FLUID TEMPERATURE
DEG C = .75N - 40
DEG F = 1.35N - 40
34 TCCDC TCC PWM SOLENOID DUTY CYCLE (MSB)
35 TCCDC+1 TCC PWM SOLENOID DUTY CYCLE (LSB)
%DC = (256MSB + LSB)/655.36
36 SDINMW1 INPUT MODE WORD 1
0 A/C CLUTCH STATUS
1 A/C REQUEST
2 NOT USED
3 NOT USED
4 NOT USED
5 NOT USED
6 PARK/NEUTRAL SWITCH
7 CRUISE ACTIVE
37 SDINMW2 INPUT MODE WORD 2
0 TCC BRAKE SWITCH
1 NOT USED
2 TRANSMISSION PERFORMANCE/NORMAL SWITCH
3 TRANSMISSION MODE A
4 TRANSMISSION MODE B
5 TRANSMISSION MODE C
6 SPARK RETARD REQUEST
7 ASR ACTIVE
38 SDOUTMW1 OUTPUT MODE WORD 1
0 TCC CONTROL
1 TCC ENABLE
2 SHIFT A
3 SHIFT B
4 NOT USED
5 NOT USED
6 NOT USED
7 NOT USED
39 SDSTMW1 STATUS MODE WORD 1
0 1 = ENGINE CLOSED LOOP
1 1 = LEFT O2 READY
2 1 = RIGHT O2 READY
3 1 = LEARN ENABLED
4 1 = CLEAN CANISTER
5 1 = CATALYTIC CONVERTER OVERTEMP
6 1 = ENGINE MALFS OCCURRED
7 1 = TRANSMISSION MALFS OCCURRED
40 SDSTMW2 STATUS MODE WORD 2
0 1 = POWER ENRICHMENT ACTIVE
1 1 = KICKDOWN PATTERN
2 1 = MALF 43A ACTIVE
3 1 = MALF 43C ACTIVE
4 1 = MALF 43D ACTIVE
5 1 = INJECTOR FAULT DETECTED THIS RUN CYCLE
6 1 = FEDS ENABLED
7 1 = RESET OCCURRED THIS RUN CYCLE
41 SDTCCOFF SERIAL DATA TCCOFF MODE WORD
0 1 = RANGE CONTINGENCY
1 1 = MIN TPS CONTINGENCY
2 1 = BRAKE ON, TCC OFF
3 1 = NEGATIVE DELTA TPS
4 1 = TCC SLIP CONTINGENCY
5 1 = A/C ON CONTINGENCY
6 1 = TCC ENGAGED
7 NOT USED
42 SDADPTBL SERIAL DATA ADAPTABLE SHIFT MW
0 1 = NOT IN NORMAL MODE
1 1 = LAST WAS STANDARD ADAPT
2 1 = LONG SHIFT DELAY
3 1 = LONG SHIFT TIME
4 1 = NOT WITHIN TPS RANGE
5 1 = EXCESSIVE DELTA TPS
6 1 = IN HOT MODE
7 1 = EXCESSIVE DELTA VEHICLE SPEED
43 PATTERN TRANSMISSION PATTERN SELECTION
0 1 = "NORMAL" PATTERN REQUESTED
1 1 = "PERFORMANCE" PATTERN REQUESTED
2 NOT USED
3 NOT USED
4 NOT USED
5 NOT USED
6 NOT USED
7 NOT USED
44 MISCSTAT MISC STATUS BITS
0 1 = START OF SHIFT
1 1 = END OF SHIFT
2 1 = POWERTRAIN IN MOTION
3 1 = IGNITION OFF
4 NOT USED
5 NOT USED
6 NOT USED
7 NOT USED
45 ODMTRNOP OPEN CIRCUIT STATUS
0 1 = TCC CONTROL
1 1 = TCC ENABLE
2 1 = SHIFT A SOLENOID
3 1 = SHIFT B SOLENOID
4 1 = 3-2 DSS SOLENOID
5 1 = TRANSMISSION PERFORMANCE LAMP
6 NOT USED
7 NOT USED
46 ODMTRNSH SHORT CIRCUIT STATUS
0 1 = TCC CONTROL
1 1 = TCC ENABLE
2 1 = SHIFT A SOLENOID
3 1 = SHIFT B SOLENOID
4 1 = 3-2 DSS SOLENOID
5 1 = TRANSMISSION PERFORMANCE LAMP
6 NOT USED
7 NOT USED
..PAGE
..HEAD02L ALDL DATA LIST
..HEAD03L NUMBER OF DATA WORDS - 53
..HEAD04L ALDL MODE 1 MESSAGE 2 DATA LIST
WORD # DATA NAME DESCRIPTION
1 NOT USED
2 NEWMLF2 NEW MALF FLAG WORD 2
0 CODE 27 EGR ELECTRICAL FAULT (ODM)
1 CODE 26 CCP ELECTRICAL FAULT (ODM)
2 CODE 25 MAT SENSOR HIGH
3 CODE 23 MAT SENSOR LOW
4 CODE 16 LO-RES FAILURE
5 CODE 13 LEFT O2 SENSOR FAILED
6 CODE 12 NO REFERENCE PULSES
7 CODE 11 MALF INDICATOR LAMP (MIL) FAULT
3 NEWMLF3 NEW MALF FLAG WORD 3
0 CODE 43 ESC FAILURE
1 CODE 42 EST GROUNDED
2 CODE 41 EST OPEN
3 CODE 36 HI-RES FAILURE
4 CODE 48 MASS AIR FLOW SYSTEM FAILURE
5 CODE 47 NOT USED
6 CODE 32 EGR SYSTEM FAULT
7 CODE 29 EAS ELECTRICAL FAULT (ODM)
4 NEWMLF4 NEW MALF FLAG WORD 4
0 CODE 61 A/C LOW CHARGE
1 CODE 55 FUEL SYSTEM LEAN
2 CODE 54 NOT USED
3 CODE 52 OIL TEMPERATURE LOW
4 CODE 50 SYSTEM VOLTAGE LOW
5 CODE 46 FUEL ENABLE FAILURE
6 CODE 45 LEFT O2 SENSOR RICH
7 CODE 44 LEFT O2 SENSOR LEAN
5 NEWMLF5 NEW MALF FLAG WORD 5
0 CODE 69 A/C CLUTCH CIRCUIT OPEN
1 CODE 68 A/C RELAY SHORTED
2 CODE 67 A/C PRESSURE TRANSDUCER DEGRADED
3 CODE 66 A/C PRESSURE TRANSDUCER OPEN/SHORT
4 CODE 65 RIGHT O2 SENSOR RICH
5 CODE 64 RIGHT O2 SENSOR LEAN
6 CODE 63 RIGHT O2 SENSOR FAILED
7 CODE 62 OIL TEMPERATURE HIGH
6 NEWMLF6 NEW MALF FLAG WORD 6
0 CODE 78 FAN 2 FAULT (ODM)
1 CODE 77 FAN 1 FAULT (ODM)
2 CODE 71 A/C EVAPORATOR TEMP SENSOR FAILED
3 CODE 70 A/C CLUTCH RELAY FAULT (ODM)
4 CODE 31 NOT USED
5 CODE 19 NOT USED
6 CODE 18 NOT USED
7 CODE 17 NOT USED
7 NOT USED
8 NOT USED
9 NOT USED
10 NOT USED
11 NOT USED
12 NOT USED
13 NOT USED
14 MALFFW2 LOGGED MALF FLAG WORD 2
0 CODE 27 EGR ELECTRICAL FAULT (ODM)
1 CODE 26 CCP ELECTRICAL FAULT (ODM)
2 CODE 25 MAT SENSOR HIGH
3 CODE 23 MAT SENSOR LOW
4 CODE 16 LO-RES FAILURE
5 CODE 13 LEFT O2 SENSOR FAILED
6 CODE 12 NO REFERENCE PULSES
7 CODE 11 MALF INDICATOR LAMP (MIL) FAULT
15 MALFFW3 LOGGED MALF FLAG WORD 3
0 CODE 43 ESC FAILURE
1 CODE 42 EST GROUNDED
2 CODE 41 EST OPEN
3 CODE 36 HI-RES FAILURE
4 CODE 48 MASS AIR FLOW SYSTEM FAILURE
5 CODE 47 NOT USED
6 CODE 32 EGR SYSTEM FAULT
7 CODE 29 EAS ELECTRICAL FAULT (ODM)
16 MALFFW4 LOGGED MALF FLAG WORD 4
0 CODE 61 A/C LOW CHARGE
1 CODE 55 FUEL SYSTEM LEAN
2 CODE 54 NOT USED
3 CODE 52 OIL TEMPERATURE LOW
4 CODE 50 SYSTEM VOLTAGE LOW
5 CODE 46 FUEL ENABLE FAILURE
6 CODE 45 LEFT O2 SENSOR RICH
7 CODE 44 LEFT O2 SENSOR LEAN
17 MALFFW5 LOGGED MALF FLAG WORD 5
0 CODE 69 A/C CLUTCH CIRCUIT OPEN
1 CODE 68 A/C RELAY SHORTED
2 CODE 67 A/C PRESSURE TRANSDUCER DEGRADED
3 CODE 66 A/C PRESSURE TRANSDUCER OPEN/SHORT
4 CODE 65 RIGHT O2 SENSOR RICH
5 CODE 64 RIGHT O2 SENSOR LEAN
6 CODE 63 RIGHT O2 SENSOR FAILED
7 CODE 62 OIL TEMPERATURE HIGH
18 MALFFW6 LOGGED MALF FLAG WORD 6
0 CODE 78 FAN 2 FAULT (ODM)
1 CODE 77 FAN 1 FAULT (ODM)
2 CODE 71 A/C EVAPORATOR TEMP SENSOR FAILED
3 CODE 70 A/C CLUTCH RELAY FAULT (ODM)
4 CODE 31 NOT USED
5 CODE 19 NOT USED
6 CODE 18 NOT USED
7 CODE 17 NOT USED
19 MALFFW7 LOGGED MALF FLAG WORD 7
0 CODE 57 NOT USED
1 CODE 56 NOT USED
2 CODE 49 NOT USED
3 CODE 34 MAP SENSOR LOW
4 CODE 33 MAP SENSOR HIGH
5 CODE 39 NOT USED
6 CODE 35 NOT USED
7 CODE 24 OUTPUT SPEED LOW
20 MALFFW8 LOGGED MALF FLAG WORD 8
0 CODE 53 SYSTEM VOLTAGE HIGH
1 CODE 51 PROM/FLASH ERROR
2 CODE 38 BRAKE SWITCH STUCK OFF
3 CODE 37 BRAKE SWITCH STUCK ON
4 CODE 22 THROTTLE POSITION LOW
5 CODE 21 THROTTLE POSITION HIGH
6 CODE 15 COOLANT TEMPERATURE LOW
7 CODE 14 COOLANT TEMPERATURE HIGH
21 MALFFW9 LOGGED MALF FLAG WORD 9
0 CODE 76 LONG SYSTEM VOLTAGE HIGH
1 CODE 75 SYSTEM VOLTAGE LOW
2 CODE 74 ASR ACTIVE FAULT
3 CODE 73 FORCE MOTOR CURRENT
4 CODE 72 OUTPUT SPEED LOSS
5 CODE 59 TRANSMISSION TEMPERATURE LOW
6 CODE 58 TRANSMISSION TEMPERATURE HIGH
7 CODE 28 PRESSURE SWITCH MANIFOLD
22 MALFFW10 LOGGED MALF FLAG WORD 10
0 CODE 86 LOW RATIO
1 CODE 85 TCC STUCK ON
2 CODE 84 3-2 DOWNSHIFT FEEDBACK FAULT (ODM)
3 CODE 83 TCC CONTROL FEEDBACK FAULT (ODM)
4 CODE 82 SHIFT A SOLENOID FAULT (ODM)
5 CODE 81 SHIFT B SOLENOID FAULT (ODM)
6 CODE 80 TRANSMISSION COMPONENT SLIPPING
7 CODE 79 TRANSMISSION OVER TEMPERATURE
23 MALFFW11 LOGGED MALF FLAG WORD 11
0 CODE 94 TRANS MANUAL LIGHT FAULT (ODM)
1 CODE 93 SERVICE VEH. SOON LIGHT FAULT (ODM)
2 CODE 92 TRANS PERF LIGHT FAULT (ODM)
3 CODE 91 1-4, 2-5 SHIFT LIGHT FAULT (ODM)
4 CODE 90 TCC ENABLE FAULT (ODM)
5 CODE 89 MAX ADAPT AND LONG SHIFT
6 CODE 88 NOT USED
7 CODE 87 HIGH RATIO
24 MALFFW12 LOGGED MALF FLAG WORD 12
0 CODE 99 TACH OUTPUT FAULT (ODM)
1 CODE 98 TORQUE DELIVERED FAULT (ODM)
2 CODE 97 4K PULSES PER MILE FAULT (ODM)
3 CODE 96 OIL LEVEL LIGHT FAULT (ODM)
4 CODE 95 OIL LIFE LIGHT FAULT (ODM)
5 CODE 60 NOT USED
6 CODE 40 NOT USED
7 CODE 30 NOT USED
25 NVRATIO RATIO OF ENGINE SPEED TO VEHICLE SPEED
N = RATIO
26 NEWRFPRT PRESENT MINOR LOOP REFERENCE PERIOD (MSB)
27 NEWRFPRT+1 PRESENT MINOR LOOP REFERENCE PERIOD (LSB)
RPM = 2949120/N
28 SDINMW2 INPUT MODE WORD 2
0 TCC BRAKE SWITCH
1 NOT USED
2 TRANSMISSION PERFORMANCE/NORMAL SWITCH
3 TRANSMISSION MODE A
4 TRANSMISSION MODE B
5 TRANSMISSION MODE C
6 SPARK RETARD REQUEST
7 ASR ACTIVE
29 PRNDLFLG PRNDL POSITION
0 1 = LOW GEAR
1 1 = DRIVE 2
2 1 = DRIVE 3
3 1 = DRIVE 4
4 1 = NOT USED
5 1 = REVERSE
6 1 = PARK/NEUTRAL
7 1 = ILLEGAL RANGE
30 ODM1OPFL ODM1 OPEN FAULT WORD
0 1 = FAN 1 OPEN FAILURE
1 1 = FAN 2 OPEN FAILURE
2 1 = TACH OUTPUT OPEN FAILURE
3 1 = TORQUE AVAILABLE OPEN FAILURE
4 1 = EGR 1 OPEN FAILURE
5 1 = ELECTRIC AIR SWITCH OPEN FAILURE
6 1 = TRANSMISSION PERFORMANCE LIGHT OPEN FAILURE
7 1 = ODM 1 OVER VOLTAGE FAILURE
31 ODM1SHFL ODM1 SHORT FAULT WORD
0 1 = FAN 1 SHORT FAILURE
1 1 = FAN 2 SHORT FAILURE
2 1 = TACH OUTPUT SHORT FAILURE
3 1 = TORQUE AVAILABLE SHORT FAILURE
4 1 = EGR 1 SHORT FAILURE
5 1 = ELECTRIC AIR SWITCH SHORT FAILURE
6 1 = TRANSMISSION PERFORMANCE LIGHT SHORT FAILURE
7 1 = ODM 1 OVER TEMPERATURE FAILURE
32 ODM2OPFL ODM2 OPEN FAULT WORD
0 1 = CHECK TRANSMISSION LIGHT OPEN FAILURE
1 1 = 4K PULSES/MILE OPEN FAILURE
2 1 = OIL LEVEL OPEN FAILURE
3 1 = TRANSMISSION MANUAL LIGHT OPEN FAILURE
4 1 = SHIFT A OPEN FAILURE
5 1 = SHIFT B OPEN FAILURE
6 1 = 3-2 SHIFT SOLENOID
7 1 = ODM 2 OVER VOLTAGE FAILURE
33 ODM2SHFL ODM2 SHORT FAULT WORD
0 1 = CHECK TRANSMISSION LIGHT SHORT FAILURE
1 1 = 4K PULSES/MILE SHORT FAILURE
2 1 = OIL LEVEL SHORT FAILURE
3 1 = TRANSMISSION MANUAL LIGHT SHORT FAILURE
4 1 = SHIFT A SHORT FAILURE
5 1 = SHIFT B SHORT FAILURE
6 1 = 3-2 SHIFT SOLENOID
7 1 = ODM 2 OVER TEMPERATURE FAILURE
34 ODM3OPFL ODM3 OPEN FAULT WORD
0 1 = CHECK ENGINE LIGHT (MIL) OPEN FAILURE
1 1 = A/C CLUTCH OPEN FAILURE
2 1 = OIL LIFE OPEN FAILURE
3 1 = 1-4 LIGHT OPEN FAILURE
4 1 = CCP OPEN FAILURE
5 1 = TCC ENABLE SOLENOID OPEN FAILURE
6 1 = TCC CONTROL SOLENOID OPEN FAILURE
7 1 = ODM 3 OVER VOLTAGE FAILURE
35 ODM3SHFL ODM3 SHORT FAULT WORD
0 1 = CHECK ENGINE LIGHT (MIL) SHORT FAILURE
1 1 = A/C CLUTCH SHORT FAILURE
2 1 = OIL LIFE SHORT FAILURE
3 1 = 1-4 LIGHT SHORT FAILURE
4 1 = CCP SHORT FAILURE
5 1 = TCC ENABLE SOLENOID SHORT FAILURE
6 1 = TCC CONTROL SOLENOID SHORT FAILURE
7 1 = ODM 3 OVER TEMPERATURE FAILURE
BYTES 36-53 NOT USED
..PAGE
..HEAD02L ALDL DATA LIST
..HEAD03L NUMBER OF DATA WORDS - 45
..HEAD04L ALDL MODE 1 MESSAGE 4 DATA LIST
WORD # DATA NAME DESCRIPTION
1-17 VIN VEHICLE IDENTIFICATION NUMBER
18-21 ENDMODEL END MODEL PART NUMBER
22-37 SIDERAIL SIDE RAIL NUMBER
38-41 M1BTPTRN MODULE 1 BIT PATTERN NUMBER
42-45 GP6EM2P1 MODULE 2 (GMP6-E) PART NUMBER BYTE
..PAGE
..HEAD02L ALDL DATA LIST
..HEAD03L NUMBER OF DATA WORDS - 38
..HEAD04L ALDL MODE 1 MESSAGE 6 DATA LIST
WORD # DATA NAME DESCRIPTION
1 EADPT2 PRESSURE MODIFIER (ADAPTIVE) - 2ND GEAR
NOT USED
2 EADPT2+1 PRESSURE MODIFIER (ADAPTIVE) - 2ND GEAR
NOT USED
3 EADPT2+2 PRESSURE MODIFIER (ADAPTIVE) - 2ND GEAR
NOT USED
4 EADPT2+3 PRESSURE MODIFIER (ADAPTIVE) - 2ND GEAR
NOT USED
5 EADPT2+4 PRESSURE MODIFIER (ADAPTIVE) - 2ND GEAR
PSI = (N*.125)-16
6 EADPT2+5 PRESSURE MODIFIER (ADAPTIVE) - 2ND GEAR
PSI = (N*.125)-16
7 EADPT2+6 PRESSURE MODIFIER (ADAPTIVE) - 2ND GEAR
PSI = (N*.125)-16
8 EADPT2+7 PRESSURE MODIFIER (ADAPTIVE) - 2ND GEAR
PSI = (N*.125)-16
9 EADPT2+8 PRESSURE MODIFIER (ADAPTIVE) - 2ND GEAR
PSI = (N*.125)-16
10 EADPT2+9 PRESSURE MODIFIER (ADAPTIVE) - 2ND GEAR
PSI = (N*.125)-16
11 EADPT2+10 PRESSURE MODIFIER (ADAPTIVE) - 2ND GEAR
PSI = (N*.125)-16
12 EADPT2+11 PRESSURE MODIFIER (ADAPTIVE) - 2ND GEAR
PSI = (N*.125)-16
13 EADPT2+12 PRESSURE MODIFIER (ADAPTIVE) - 2ND GEAR
PSI = (N*.125)-16
14 EADPT2+13 PRESSURE MODIFIER (ADAPTIVE) - 2ND GEAR
PSI = (N*.125)-16
15 EADPT2+14 PRESSURE MODIFIER (ADAPTIVE) - 2ND GEAR
PSI = (N*.125)-16
16 EADPT2+15 PRESSURE MODIFIER (ADAPTIVE) - 2ND GEAR
PSI = (N*.125)-16
17 EADPT2+16 PRESSURE MODIFIER (ADAPTIVE) - 2ND GEAR
PSI = (N*.125)-16
18 EADPT3 PRESSURE MODIFIER (ADAPTIVE) - 3ND GEAR
NOT USED
19 EADPT3+1 PRESSURE MODIFIER (ADAPTIVE) - 3ND GEAR
NOT USED
20 EADPT3+2 PRESSURE MODIFIER (ADAPTIVE) - 3ND GEAR
NOT USED
21 EADPT3+3 PRESSURE MODIFIER (ADAPTIVE) - 3ND GEAR
NOT USED
22 EADPT3+4 PRESSURE MODIFIER (ADAPTIVE) - 3ND GEAR
NOT USED
23 EADPT3+5 PRESSURE MODIFIER (ADAPTIVE) - 3ND GEAR
NOT USED
24 EADPT3+6 PRESSURE MODIFIER (ADAPTIVE) - 3ND GEAR
NOT USED
25 EADPT3+7 PRESSURE MODIFIER (ADAPTIVE) - 3ND GEAR
NOT USED
26 EADPT3+8 PRESSURE MODIFIER (ADAPTIVE) - 3ND GEAR
NOT USED
27 EADPT3+9 PRESSURE MODIFIER (ADAPTIVE) - 3ND GEAR
NOT USED
28 EADPT3+10 PRESSURE MODIFIER (ADAPTIVE) - 3ND GEAR
NOT USED
29 EADPT3+11 PRESSURE MODIFIER (ADAPTIVE) - 3ND GEAR
NOT USED
30 EADPT3+12 PRESSURE MODIFIER (ADAPTIVE) - 3ND GEAR
NOT USED
31 EADPT3+13 PRESSURE MODIFIER (ADAPTIVE) - 3ND GEAR
NOT USED
32 EADPT3+14 PRESSURE MODIFIER (ADAPTIVE) - 3ND GEAR
NOT USED
33 EADPT3+15 PRESSURE MODIFIER (ADAPTIVE) - 3ND GEAR
NOT USED
34 EADPT3+16 PRESSURE MODIFIER (ADAPTIVE) - 3ND GEAR
NOT USED
35 SDADPTBL
0 1 = NOT IN NORMAL MODE
1 1 = LAST WAS STANDARD ADAPT
2 1 = LONG SHIFT DELAY
3 1 = LONG SHIFT TIME
4 1 = NOT WITHIN TPS RANGE
5 1 = EXCESSIVE DELTA TPS
6 1 = IN HOT MODE
7 1 = EXCESSIVE DELTA VEHICLE SPEED
36 LSTADEL LAST CHANGE TO ADAPTIVE MODIFIER
NOT USED
37 CURADPT CURRENT ADAPTIVE MODIFIER
PSI = (N*.125)-16
38 CURCELL CURRENT ADAPTIVE MODIFIER INDEX WITHIN TABLE
N = CELL
кто может посодействовать с программной. не бесплатно
офлайн
ВиталийXXL
Senior Member
|
|
9898 |
21 год на сайте Город:
|
RepoMan:yoheer, на какой железке это запускается? Там есть uart-can мост?
Запускается на ардуино уно
И должно вроде на нано