Вот(!!!) , умничка(!!!) , возьми с полки прянеГ, их там два, бери тот, что лежит ПОСЕРЕДИНЕ!!!
Пофлудим)) , можно вместо прянега будет пеценько?
Именно о чем то подобном речь и идет , как писал выше , есть примерное понимание что нужно сделать,но не более . суть именно послать в эбу раздатки сигнал нейтраль , т.к. блок управления двигатели нейтраль видит , но говорить об этом не хочет )), т.к. ему это не нужно
У меня чуть другая ситуация, PCM в принципе не работает с J1850, и соответственно надо эмулировать весь обмен TCCM-PCM, хотя в вашем случае думаю тоже, PCM отправляет свой статус ( процент нажатия педали газа, положение селектора, и т.д.) одним сообщением в ответ на запрос TCCM, скорее всего этот запрос не поддерживается вашим PCM поэтому ничего и не возвращается
Вроде того , все функционирует кроме пониженной , зараза блок не шлет нейтраль )) блок управления раздаткой специально для свапа , а эти пиндосы перестали выпускать блоки работающие без обмена по шине ((хотя продается он как самостоятельный
Ну короче пока разбираюсь сам, если найдёшь кто может помочь, готов поделиться своими наработками
На гитхабе есть проект на ардуине авр. Может мне кто пояснить, как там рвботает передатчик? Схема там есть. Как там “0” формируется?
Холостой tx “1”
С “холостой” “1” я согласен. Это если в цепи только один трансивер. А если в цепи их два или более? Вообще, если скомпилировать этот проект, он работает?
Работает. Библиотека кривая до ужаса, тайминг передачи данных у меня получился только на delay, на millis почему то не работает, не стал вникать в проблему, просто собрал трансивер на отдельной дурине
Попозже в протеусе схему нарисую и смоделирую. Всё дело в том, что в оригинальном описании спецификации шины драйвер сделан на компараторах, а здесь на транзисторах, да и сопротивления разные на “подтяжку” Может быть на гитхабе схема с ошибкой? Всё-таки 47 Ом и 47 кОм — достаточно большой разброс. Там ещё у этого-же автора есть реализация на ESP, можно её попробовать, ибо 16мГц, думаю, маловато.
Сама библиотека написана исключительно в блокирующем стиле. Не смотрите на то, что там есть миллис и микрос - это не более чем делей по методу использования. А раз библиотека блокирующая - использовать ее с миллис довольно-таки
писать на ЕСП точный ногодрыг это извращение. На РП2040 проще должно быть
а какая там родная частота шины, если “16 Мгц маловато”?
Я с помощью этой схемы принимаю и передаю данные, ни каких конфликтов нет
Тоесть принять-передать “ногодрыгом” + отправить в uart скорости хватает? Если да, то 16 мГц достаточно.
Странно. Может быть там в коде так реализовано. Инверсия. Схема на транзисторах (с гитхаба) в состоянии IDLE = IFS (по спецификации GM и Ford) должна быть в лог “0” , те < 3.5 В. Она же “держит” шину примерно на уровне 8 В. Переход с IFS в SOF, равный 200uS (RISING) является стартом передачи пакета данных. А схема на компараторах в состоянии IDLE держит шину в лог “0” Таким образом шина=8В вешает наглухо весь обмен. Первая непонятка.
Осцилл есть? Можешь пару-тройку пакетов запостить сюда?
Осцил есть, но машина уже уехала кататься, tx инвертирован в библиотеке и при отсутствии передачи на Пине Ардуины висит “1”
#include "j1850vpw.h"
#define TX 2
#define RX 3
static uint8_t sendBuffA[5] = {0xC8, 0x29, 0x10, 0x01, 0x00};
static uint8_t sendBuffN[6] = {0xC8, 0x83, 0x10, 0x0A, 0x00, 0x00}; // message to send, CRC will be read and appended to frame on the fly
static uint8_t sendBuffS[4] = {0xC8, 0xFF, 0x10, 0x03};
static uint8_t sendBuffID1[4] = {0xC8, 0x3B, 0x10, 0xA0};
static uint8_t sendBuffID2[7] = {0xC8, 0x3B, 0x10, 0x3C, 0x04, 0x00, 0x00 };
static uint8_t sendBuffID3[6] = {0xC8, 0x3B, 0x10, 0x3D, 0x65, 0x3A};
static uint8_t BuffTC[5] = {0xE8, 0xFF, 0x1A, 0x03, 0x71};
uint8_t buff[BS]; // buffer for read message
uint8_t dataSize; // size of message
boolean aSend = false;
boolean id1Send = false;
boolean id2Send = false;
void handleError(J1850_Operations op, J1850_ERRORS err);
J1850VPW vpw;
void setup() {
vpw.init(RX, TX);
}
void loop() {
//Serial.begin(115200);
while (dataSize = vpw.tryGetReceivedFrame(buff)){
//for (int i = 0; i < dataSize; i++){
//if(buff[i] < 0x10) Serial.print("0");
//Serial.print(buff[i], HEX);
//Serial.print(" ");
//}
//Serial.println(";");
//Serial.println();
//}
delay(200);
if (
buff[0] == 0xE8 &&
buff[1] == 0xFF ) {
aSend = true;
// Serial.print("sendA ");
}
if (
buff[0] == 0xC9 &&
buff[3] == 0x3A ) {
id1Send = true;
//Serial.print("sendID1 ");
}
if (
buff[0] == 0xC9 &&
buff[1] == 0xFA ) {
id1Send = true;
//Serial.print("sendID2 ");
}
}
if(aSend == true) {
delay(50);
vpw.send(sendBuffS, sizeof(sendBuffS));
// if (millis() - lastSend > 500){
delay(250);
vpw.send(sendBuffN, sizeof(sendBuffN));
delay(250);
vpw.send(sendBuffA, sizeof(sendBuffA));
aSend = false;
}
if(id1Send == true) {
delay(50);
vpw.send(sendBuffID1, sizeof(sendBuffID1));
delay(250);
vpw.send(sendBuffID2, sizeof(sendBuffID2));
id1Send = false;
}
if(id2Send == true) {
delay(50);
vpw.send(sendBuffID3, sizeof(sendBuffID3));
delay(250);
id2Send = false;
}
}
Вот примерно такой черновичёк я пользовал для работы с gm, обмен вычитывал с помощью serial , дополнительно проверял с помощью elm327, попытки сделать это как то элегантнее ни к чему не привели, работает почему-то только с помощью delay
T3=PNP и перевернуть эмиттером вверх решит проблему инверсии.