Ответить
  • zverjuga Senior Member
    офлайн
    zverjuga Senior Member

    5030

    13 лет на сайте
    пользователь #346019

    Профиль
    Написать сообщение

    5030
    # 8 марта 2020 21:31

    кот лучше сбрасывать ссылку на create.arduino.cc или на любой онлайн сервис для обмена сниппетами. например
    https://codeshare.io

    в онлайнере кот не отформатирован смотрится хренова

    проклятый антисутенерский закон!
  • art100 Клуб Самоделкиных
    офлайн
    art100 Клуб Самоделкиных

    5057

    12 лет на сайте
    пользователь #397580

    Профиль
    Написать сообщение

    5057
    # 9 марта 2020 13:16 Редактировалось art100, 8 раз(а).

    для старика
    полуфабрикат
    писал в этой ночью в час
    еще что-то помню спрашивай

    не знаю поможет тебе старик эти решения
    бредовая идейка для развлечения
    пальчиком чуть касаясь крутить по чуть чуть енкодер туды сюды
    на новомодном супер мелком с муравьиными штифтами графическом жки типо не картинки а буквы сколько же накрутил
    шаговый мотор на нужные мне шаги елозит синхронно туды сюды
    про шаговый мотор еще в самом начале развлечения по вечерам :shuffle:
    не ну не бред? :trollface:
    а мне нраиица :ura:

    код выделить все

    // 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-ми ноговых пучек

    я думаю тебе надо принципиально решать
    прерываться только по одной ноге
    щас поищу идею в моем рукопашном коде

    Добавлено спустя 29 минут 49 секунд

    ну вот идейка врукопашную без библиотек только одну ногу слушать да еще направление флаги поднимать
    на ардуинах всех будет работать

    код выделить все

    //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 нога
    подпрограмма флаги
    а по флагам принимай решения полезные

    классика ассемблерного мышления

    Круиз-контроль 88 км/ч. Радость никакая печаль.
  • RepoMan Senior Member
    офлайн
    RepoMan Senior Member

    923

    13 лет на сайте
    пользователь #295041

    Профиль
    Написать сообщение

    923
    # 9 марта 2020 13:54

    задержки в прерываниях? треш

  • art100 Клуб Самоделкиных
    офлайн
    art100 Клуб Самоделкиных

    5057

    12 лет на сайте
    пользователь #397580

    Профиль
    Написать сообщение

    5057
    # 9 марта 2020 13:55 Редактировалось art100, 3 раз(а).
    RepoMan:

    задержки в прерываниях? треш

    так да :)

    помоги старику на есп8266 победить енкодер
    у него вроде работает
    косяки ловит и нервничает
    но я до сих пор не понял
    шо за wemos и чем он отличается от малоногой esp8266
    вижу он пока не понял что перрываться достаточно по одному контакту энкодера
    вот пытаюсь поддержать разговор без не известной мне платы
    я вооще не доганаю где он выковырял attachInterrupt(1, isrDT_6043124_1, CHANGE); на 3-ей от чего ноге?
    ща попробую почитать что такое ydjvjlyjt wemos

    Добавлено спустя 38 минут 44 секунды

    Старик
    Это твой код для есп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);

    Круиз-контроль 88 км/ч. Радость никакая печаль.
  • RepoMan Senior Member
    офлайн
    RepoMan Senior Member

    923

    13 лет на сайте
    пользователь #295041

    Профиль
    Написать сообщение

    923
    # 9 марта 2020 15:15
    art100:

    шо за wemos и чем он отличается от малоногой esp8266

    то же самое, что и, например, ардуино уно по отношению к ATmega328P - удобная платка с разведенным контроллером. Гугли wemos d1

  • starik Senior Member
    офлайн
    starik Senior Member

    8793

    22 года на сайте
    пользователь #1163

    Профиль
    Написать сообщение

    8793
    # 9 марта 2020 21:42

    Да я уже победил.
    art100,

    Счас кручу управление 5 ШИМ контролерами по сети.

    Добавлено спустя 3 минуты 40 секунд

    Вот вемос, он же 8266

  • Yoda_49 Senior Member
    офлайн
    Yoda_49 Senior Member

    4773

    16 лет на сайте
    пользователь #108018

    Профиль
    Написать сообщение

    4773
    # 30 марта 2020 09:54

    [censored by Grace-o]

    Жёлтая карточка была показана пользователю за этот пост модератором Grace-o (31 марта 2020 19:12)
    Основание: 3.5.16 / 3.5.19

    Гло́кая ку́здра ште́ко будлану́ла бо́кра и курдя́чит бокрёнка
  • yoheer Senior Member
    офлайн
    yoheer Senior Member

    1753

    17 лет на сайте
    пользователь #62617

    Профиль
    Написать сообщение

    1753
    # 14 апреля 2020 14:30

    Народ, кто поможет со скетчем? у меня есть недоделанный. делал не я.
    Сижу, пыхчу как могу, не со всем разобраться выходит

    Если сказал, что не брал-значит не отдам.
  • Protez1999 Senior MemberАвтор темы
    офлайн
    Protez1999 Senior Member Автор темы

    9977

    16 лет на сайте
    пользователь #113845

    Профиль
    Написать сообщение

    9977
    # 14 апреля 2020 14:31

    А что за проект

  • SIO Паяльник & Отвертка TEAM
    офлайн
    SIO Паяльник & Отвертка TEAM

    4105

    17 лет на сайте
    пользователь #68847

    Профиль
    Написать сообщение

    4105
    # 14 апреля 2020 14:59 Редактировалось SIO, 1 раз.
    yoheer:

    у меня есть недоделанный. делал не я.
    Сижу, пыхчу как могу

    Зачастую проще свою прогу с 0 написать , чем понять задумку автора. :znaika:

    Паяльник & Отвертка TEAM, MikroPascal for AVR http://forum.onliner.by/viewtopic.php?t=637523
  • yoheer Senior Member
    офлайн
    yoheer Senior Member

    1753

    17 лет на сайте
    пользователь #62617

    Профиль
    Написать сообщение

    1753
    # 14 апреля 2020 15:03

    проект сканер-компьютер для машины

    Добавлено спустя 35 минут 44 секунды

    Скетчей 2. Один полностью готов, второй расширенная версия
    не могу понять принцип, чтобы доделать вторую

    Если сказал, что не брал-значит не отдам.
  • zverjuga Senior Member
    офлайн
    zverjuga Senior Member

    5030

    13 лет на сайте
    пользователь #346019

    Профиль
    Написать сообщение

    5030
    # 14 апреля 2020 16:18 Редактировалось zverjuga, 1 раз.

    yoheer, спроси у автора скетча, как он работает. потому как просить разбираться в чужом скетче может обойтись дороже, чем писать свой.

    проклятый антисутенерский закон!
  • yoheer Senior Member
    офлайн
    yoheer Senior Member

    1753

    17 лет на сайте
    пользователь #62617

    Профиль
    Написать сообщение

    1753
    # 14 апреля 2020 16:27

    может глянет кто.
    не могу понять, как вытаскиваются данные из ЭБУ

    Добавлено спустя 21 секунда

    автора уже не найти (

    Если сказал, что не брал-значит не отдам.
  • RepoMan Senior Member
    офлайн
    RepoMan Senior Member

    923

    13 лет на сайте
    пользователь #295041

    Профиль
    Написать сообщение

    923
    # 14 апреля 2020 16:42

    ну скетч то может уже пора показать, не?

  • yoheer Senior Member
    офлайн
    yoheer Senior Member

    1753

    17 лет на сайте
    пользователь #62617

    Профиль
    Написать сообщение

    1753
    # 14 апреля 2020 16:58

    #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] == 0x08) && (dataStream[3] == 0xAE)) find_Sync = true;
    //if ((dataStream[1] == 0xF4) && (dataStream[2] == 0x56) && (dataStream[3] == 0x08) && (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]) << 8) + dataStream[45]; //LEFT BASE PULSE WIDTH
    PW2 = (((word)dataStream[46]) << 8) + 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;}
    }

    }

    Если сказал, что не брал-значит не отдам.
  • zverjuga Senior Member
    офлайн
    zverjuga Senior Member

    5030

    13 лет на сайте
    пользователь #346019

    Профиль
    Написать сообщение

    5030
    # 14 апреля 2020 17:09

    ну, судя по коду данные вытаскиваются по следующему алгоритму

    1. посылается серия команд при помощи
    PCM_Serial.write
    2. ожидается ответ при помощи
    PCM_Serial.available()
    3. данные вытаскиваются при помощи
    PCM_Serial.read
    4. данные обрабатываются

    а уже какие команды, в какой последовательности, какие данные - это нужно смотреть даташит железки.

    проклятый антисутенерский закон!
  • yoheer Senior Member
    офлайн
    yoheer Senior Member

    1753

    17 лет на сайте
    пользователь #62617

    Профиль
    Написать сообщение

    1753
    # 14 апреля 2020 17:19

    даташит есть, но я не могу сопоставить

    Добавлено спустя 1 минута 58 секунд

    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
    

    Добавлено спустя 4 минуты 12 секунд

    кто может посодействовать с программной. не бесплатно

    Если сказал, что не брал-значит не отдам.
  • ВиталийXXL Senior Member
    офлайн
    ВиталийXXL Senior Member

    9897

    21 год на сайте
    пользователь #4150

    Профиль
    Написать сообщение

    9897
    # 14 апреля 2020 22:00

    Очевидно - работает с CAN-шиной .... судя по командам

    раба кормят бесплатно, а свободному самому за всё платить приходится...
  • RepoMan Senior Member
    офлайн
    RepoMan Senior Member

    923

    13 лет на сайте
    пользователь #295041

    Профиль
    Написать сообщение

    923
    # 15 апреля 2020 04:08

    yoheer, на какой железке это запускается? Там есть uart-can мост?

  • yoheer Senior Member
    офлайн
    yoheer Senior Member

    1753

    17 лет на сайте
    пользователь #62617

    Профиль
    Написать сообщение

    1753
    # 15 апреля 2020 12:57
    RepoMan:

    yoheer, на какой железке это запускается? Там есть uart-can мост?

    Запускается на ардуино уно
    И должно вроде на нано

    Если сказал, что не брал-значит не отдам.