Всем привет! Наконец-то допилил меню к своему БК! Но теперь возникла еще проблема. Загрузка страницы меню длится 0,9 сек, а возврат на основной экран БК- вообще 1,4 сек! Вопрос с опросом ЭБУ. Вариант 1) оставить как есть и опрашивать ЭБУ с интервалами от 0,15 до 1,5 сек(в зависимости от загрузки больших блоков). Вариант 2) поставить второй МК для общения с ЭБУ и передачи данных в первый МК. Вариант 3) (для маньяков) Разбивать большие загружаемые блоки на мелкие, правда тогда загрузки страницы меню и экрана БК увеличатся примерно в 1,5 раза! Вот чешу репу! ))) Все-таки думаю что нужно идти от простого к сложному( как учил дедушка Ленин!)
дык фото экрана БК уже выкладывал раньше(там немного что изменилось), а фотки меню выложу. Меню графическое, в нем 2 страницы по 6 пунктов каждая. Также в каждом пункте есть подпункты и изменяемые параметры. Сфоткаю, будет понятно
установка значения задержки ответа ЭБУ после запроса. Внизу температура, время, номер страницы/кол-во страниц. Exit и Back сделаны для заполнения места и так, для прикола. Но может когда-нибудь раскрашу их в цвета и сделаю функциональными!
Этот БК для личного пользования. Английскими словами проще написать, а главное то, что я могу использовать любые слова, примерно подходящие по смыслу и понятные мне (лишь бы эти слова, или их сочетания, не были больше 13 символов в строку, иначе не влезут). Есть красивый английский шрифт, но он Уже и в реальной поездке в авто, где нужно мельком читать, да и смотреть с расстояния 60-70 см на приборную панель, проблематично читается. Тем более что он весит гораздо больше! Для русского языка красивого и легкого шрифта я не нашел, да и нормально написать, чтобы влезло в 13 символов не везде получилось! Ну можно написать и на русском, если сократить некоторые слова, но русский шрифт тоже больше весит, т.е. дольше загружается! Это пока первая версия БК, упрощенная, со временем возможно что-то переделаю. А сейчас лишь бы закончить, а то 3 года уж как начал.
в программировании Си я не силен, начинал с Басика, он проще и понятней. В учебнике по Си читал только нужное. Дисплей ILI9684 320x480 точек, библиотека MCUFRIEND_kbv.h. Брал такой на шилде чтобы проще было макетировать. На днях прикручу код общения БК с ЭБУ, попробую, тогда выложу (там несколько файлов). Прорисовку картинок делал через PROGMEM. Макет спаян, можно имитировать все режимы (кроме связи с ЭБУ), а реальная плата еще не допаяна. Могу конечно что-то и сейчас выложить, но пока не знаю что, там 14 файлов с подпрограммами, логотипом, иконками и др.
внешнюю ЕЕПРОМ? Это для заставки хорошо, а для иконок 48х48 точек геморно, да и могут появляться глюки! А почему внутренняя память ЕЕПРОМ не подходит, ее дофига в Меге?! Собрал файл, удалил лишние переменные и значки...
у меня красивый цветной логотип грузится с sd-карты 9 секунд! пытался разобраться с внешней ЕЕПРОМ сколько будет грузить, вроде помню что не намного меньше. хорошо бы хотя бы 3 сек!
для такого экрана надо внешнюю память для картинок ... и тогда просто перегонять их на экран
у меня красивый цветной логотип грузится с sd-карты 9 секунд! пытался разобраться с внешней ЕЕПРОМ сколько будет грузить, вроде помню что не намного меньше. хорошо бы хотя бы 3 сек!
дык просили именно загрузку дисплея, а по обмену- пока твой вариант из 157 поста! ) Вариант с проверкой сложноват, нужно сначала разобраться!
это очень старый код, опыта тогда не было. там delay (100) в работе с блоком, это никуда не годится. ниже код гораздо более стабильный. клайн к железному Serial подключен?
#define PCM_ADDRESS 0x11 // тут выбираем адрес ЭБУ для K-line
#define K_LINE Serial2 // тут выбираем Serial, на котором висит Клайн адаптер
#define TX 16 // и соответствующий ему пин TX
#define PID_PERIOD_ms 250 // выбираем периодичность диагн запросов K-line
#define INIT_PERIOD_ms 25 // выбираем длительность импульсов fastinit K-line
#define HARDSERIAL_KLINE // раскомментить, если Клайн адаптер подключен к железному Serial
#define DEBUG_KLINE // раскомментить, если нужен дебаг сеанса клайн
//#define DEBUG_VALUES // раскомментить, если нужен дебаг параметров полученных по клайн
enum inita {NEED_INIT = 1, SENDED81 = 9, RECEIVED81, INIT_OK} ;
byte bus_init = NEED_INIT;
const byte INIT [] {0x81};
const byte PIDS[][2] {
{0x01, 0x05},
{0x01, 0x0C},
{0x01, 0x04},
{0x01, 0x0F},
{0x01, 0x0B},
{0x01, 0x10},
};
#ifdef HARDSERIAL_KLINE
byte echo = 0;
#endif
bool Timerreset = 0 ;
uint32_t prevreset = 0;
bool connectOK =0; // флаг активно ли подключение к PCM
int8_t Temper = 0;
uint8_t Speed = 0;
uint16_t N = 0;
void setup()
{
#if defined DEBUG_KLINE or defined DEBUG_VALUES
Serial.begin(115200);
#endif
delay(2000);
}
void sendMessage(const byte *command, const size_t size)
{
if (!Timerreset) {Timerreset=1; prevreset = millis(); }// старт таймера контроля, что PCM на связи
#ifdef DEBUG_KLINE
Serial.println(); Serial.print(" Send to PCM: ");
#endif
const byte siZe = size+4;
#ifdef HARDSERIAL_KLINE
echo = siZe;
#endif
byte Mes[siZe];
byte Checksum = 0;
for(byte i=0; i<siZe; i++)
{
if (i==0) {Mes[i]=size; Mes[i]|=0x80;}
if (i==1) Mes[i] = PCM_ADDRESS;
if (i==2) Mes[i] = 0xF1;
if (i==3) {for (byte t=0; t<size; t++ )
{Mes[i]=command[t]; Checksum+=Mes[i] ;
#ifdef DEBUG_KLINE
Serial.print(Mes[i],HEX);
Serial.print(" ");
#endif
K_LINE.write (Mes[i]); //delay(1); K_LINE.read();
i++;}}
if (i!=siZe-1) {Checksum+=Mes[i];}
else {Mes[i] = Checksum;}
#ifdef DEBUG_KLINE
Serial.print(Mes[i],HEX);
Serial.print(" ");
#endif
K_LINE.write (Mes[i]); //delay(1); K_LINE.read();
}
#ifdef DEBUG_KLINE
Serial.println();
#endif
}
void k_line()
{
static byte header = 0; // состояние заголовка
static byte message_size = 0; // размер тела принимаемого сообщения, кол-во байт
static byte j = 1; // инкремент
static byte n = 3;
const byte bufsize = 60; // размер буфера принятого сообщения
static byte buf [bufsize] = {0}; // буфер принятого сообщения
static byte checksum = 0; // контрольная сумма входящего сообщения
static uint32_t prevRESETheader=0; // таймер сброса заголовка если в момент приёма сообщения данные оборвались
static bool RESETheader_timer = 0; // таймер сброса заголовка если в момент приёма сообщения данные оборвались
static uint32_t timerInit = 0;
if (bus_init==NEED_INIT) {K_LINE.end(); pinMode (TX, OUTPUT); digitalWrite(TX, 0); timerInit = millis(); bus_init++;}
else if (bus_init==2 && millis() - timerInit>INIT_PERIOD_ms) {timerInit = millis(); digitalWrite(TX, 1); bus_init++; }
else if (bus_init==3 && millis() - timerInit>INIT_PERIOD_ms) {K_LINE.begin (10400);
#ifdef DEBUG_KLINE
Serial.println("Fast init 25msLOW 25msHIGH");
#endif
sendMessage (INIT, sizeof(INIT)); bus_init=SENDED81; }
if (K_LINE.available()){
#ifdef HARDSERIAL_KLINE
if (echo>0){K_LINE.read(); echo--;return;}
#endif
// первый старт байт
if (header == 0){buf[0]=K_LINE.read(); if (buf[0]!=0xFF && buf[0]!=0){
#ifdef DEBUG_KLINE
Serial.print("Receive from PCM: "); Serial.print(buf[0],HEX); Serial.print(" ");
#endif
header = 1; RESETheader_timer=1; prevRESETheader = millis();
}
else {header = 0; RESETheader_timer=0;}
}
// второй старт байт
else if (header == 1){buf[1]=K_LINE.read();
#ifdef DEBUG_KLINE
Serial.print(buf[1],HEX); Serial.print(" ");
#endif
if (buf[1]==0xF1){ header = 2;}
else {
#ifdef DEBUG_KLINE
Serial.println(" MessageReset");
#endif
header = 0; RESETheader_timer=0;}}
// третий старт байт
else if (header == 2){buf[2]=K_LINE.read();
#ifdef DEBUG_KLINE
Serial.print(buf[2],HEX); Serial.print(" ");
#endif
if (buf[2]==PCM_ADDRESS)
{
if (buf[0] !=0x80 && buf[0] !=0xC0) {header = 4; message_size=buf[0]; message_size &=~0xC0; n=3;}
else {header = 3; n=4;}
if (message_size > bufsize) message_size = bufsize; checksum = 0;
}
else {
#ifdef DEBUG_KLINE
Serial.println(" MessageReset");
#endif
header = 0; RESETheader_timer=0;
}
}
// если размер сообщения указан в дополнительном байте (нулевой байт 0x80) читаем этот дополнительный байт:
else if (header == 3){buf[3]=K_LINE.read();
#ifdef DEBUG_KLINE
Serial.print(buf[3],HEX); Serial.print(" ");
#endif
message_size = buf[3];
if (message_size > bufsize) {message_size = bufsize;}
checksum = 0; header = 4;
}
// пишем тело сообщения
else if (header == 4 && j<= message_size+1) {
buf[j+n-1] = K_LINE.read();
#ifdef DEBUG_KLINE
Serial.print(buf[j+n-1],HEX); Serial.print(" ");
#endif
if (j<message_size+1) {checksum+= buf[j+n-1];} // подсчёт КС
if (j==message_size+1) {header = 5; }
j++;
}
} // end of K_LINE.available()
// сообщение приняли, действуем
if (header == 5) {
for(byte i = 0; i<n; i++) checksum+=buf[i]; // прибавляем к контрольной сумме старт байты
//for (byte i=0; i<message_size+n+1; i++) {if (buf[i]<=0xF)Serial.print ("0"); Serial.print (buf[i], HEX); Serial.print(" ");}
// если контрольная сумма верна:
if (buf[message_size+n] == checksum)
{
prevreset = millis(); // сбрасываем таймер ресета , если получили валидное сообщение от блока
#ifdef DEBUG_KLINE
Serial.print(" CheckSUM good!" );
#endif
if (buf[n]== 0xC1 && buf[n+1]==0xEF) {bus_init=INIT_OK;}
else if (buf[n]== 0x61 && buf[n+1]==0x03) {
Temper = (int8_t)(((int)buf[n+5]*75/100)-48);
connectOK=1;
}
}
// если контрольная сумма не совпала:
else {
#ifdef DEBUG_KLINE
Serial.print(" CheckSUM fail!!!" );
#endif
}
message_size = 0; header=0; RESETheader_timer=0; j=1; checksum = 0;
#ifdef DEBUG_KLINE
Serial.println();
#endif
}
// таймер сброса заголовка если данные оборвались по середине сообщения
if (RESETheader_timer && millis() - prevRESETheader > 500)
{
#ifdef DEBUG_KLINE
Serial.println("timeout");
#endif
message_size = 0; RESETheader_timer = 0; header = 0;checksum = 0;j=1;
}
// таймер сброса диагностической сессии, если нет ответа от PCM более 5сек
if (Timerreset && millis() - prevreset>5000) {Timerreset = 0; bus_init=NEED_INIT; connectOK =0; }
//if (bus_init==RECEIVED81) {sendMessage (BEGIN, sizeof(BEGIN));bus_init=SENDED1086;} // отправка инита
static uint32_t prevtimePID = 0;
if (bus_init==INIT_OK && millis()-prevtimePID>PID_PERIOD_ms) {
static byte piD = 0;
prevtimePID= millis(); sendMessage (PIDS[piD],2);
piD++; if (piD>=sizeof(PIDS)/2)piD=0;
}
}
void DEBUGPrint()
{
#ifdef DEBUG_VALUES
static uint32_t prevdeb = 0;
if (millis()-prevdeb >500) {
prevdeb = millis();
Serial.print ("Speed="); Serial.print(Speed); Serial.print (" T="); Serial.print(Temper);
Serial.print(" N="); Serial.println(N);Serial.println();}
#endif
}
void loop()
{
k_line(); // опрос параметров по шине клайн
DEBUGPrint(); // отладка (отправка параметров в терминал)
}
спасибо, Макс! К-Line подключен к Serial2. Макс, а ведь Serial2 может принимать данные самостоятельно, без контроля процессора, насколько я понимаю! А в это время процессор может обрабатывать данные, опрашивать датчики или загружать картинки! Так?
Komandir, если подключить к Меге SPI дисплей из поста #2182 и SPI EEPROM EN25F80, то насколько изменится скорость загрузки логотипа? Глупый вопрос! ))) Нужно самому пробовать...
Если текущий дисплей реально подключен по параллельной шине D0...D8, то он должен работать шустрее чем SPI. Просто есть дисплеи с гребенками под D0-D8, D0-D16, но перемычками выставлен режим SPI и работает только D0 ...
Serial2 может принимать данные самостоятельно, без контроля процессора
Будет вызываться прерывание на каждый принятый байт. Сами байты помешаются в буфер - его размер ограничен. Надо исправить в исходниках размер этого буфера для того что бы самое большое сообщение помещалось в буфер.
штатного буфера хватит за глаза. байты принимаются в буфер да, как ты говоришь, без контроля процессора. Сообщения там короткие, каждый проход луп по одному байту будет из буфера вычитываться. Этот код во-первых, работает без задержек, то есть не влияет на другие процессы (остальной код), во-вторых, контролирует чексумму (не обращает внимания на битые пакеты), и в третьих, переподключается сам, если сессия сбросилась по каким-то причинам.
Если текущий дисплей реально подключен по параллельной шине D0...D8, то он должен работать шустрее чем SPI. Просто есть дисплеи с гребенками под D0-D8, D0-D16, но перемычками выставлен режим SPI и работает только D0 ...
Просто вижу в коде #include <SPI.h>.
SPI.h для SD карты. Дисплей сто пудов с параллельной загрузкой(8080), просматривал драйвера. Заказал дисплей с SPI, на который давал ссылку, попробую его.
Макс, все-таки начну с простого, мне важно чтобы БК заработал! Потом буду модернизировать, без обид!
Привет, Макс! Вот код связи с ЭБУ, который у меня работал (Основан на твоем). Только у меня в машине не Пиды, а запрос 2102. Ответ на него занимает 38 байт. Там все нужные данные.
Попробую посмотреть как оно, для себя пока совсем простое делаю.
Привет, k008. Не понял я какой у тебя e-mail!
Барбос - @ Пробелы убрать
ок
Всем привет! Наконец-то допилил меню к своему БК! Но теперь возникла еще проблема. Загрузка страницы меню длится 0,9 сек, а возврат на основной экран БК- вообще 1,4 сек! Вопрос с опросом ЭБУ. Вариант 1) оставить как есть и опрашивать ЭБУ с интервалами от 0,15 до 1,5 сек(в зависимости от загрузки больших блоков). Вариант 2) поставить второй МК для общения с ЭБУ и передачи данных в первый МК. Вариант 3) (для маньяков) Разбивать большие загружаемые блоки на мелкие, правда тогда загрузки страницы меню и экрана БК увеличатся примерно в 1,5 раза! Вот чешу репу! ))) Все-таки думаю что нужно идти от простого к сложному( как учил дедушка Ленин!)
Откуда такие длительности ??? Что вы там такое рисуете ???
дык фото экрана БК уже выкладывал раньше(там немного что изменилось), а фотки меню выложу. Меню графическое, в нем 2 страницы по 6 пунктов каждая. Также в каждом пункте есть подпункты и изменяемые параметры. Сфоткаю, будет понятно
вот окончательный вид экрана БК. фон черный )))
Первая страница Меню. Стырил с какого-то авто! ))) фон черный
вторая страница Меню
Подменю пункта Comm Intereval
цвета на фото получились корявые
установка значения задержки ответа ЭБУ после запроса. Внизу температура, время, номер страницы/кол-во страниц. Exit и Back сделаны для заполнения места и так, для прикола. Но может когда-нибудь раскрашу их в цвета и сделаю функциональными!
на предыдущих фото меню плохо видно правую светлую дугу (границу)
а смысл опрашивать ЭБУ часто в то время когда экран все равно грузится?
Ну, точнее будут показания расхода топлива! Но сделаю сначала проще, а то так никогда БК не закончу!
А для кого делается девайс ? Зачем там меню на английском ?
А для кого делается девайс ? Зачем там меню на английском ?
да ладно тебе, пусть хоть на инглише, лишь бы работало :)
Я всегда делаю меню на английском - просто чтобы не возиться с кириллицей :)
Этот БК для личного пользования. Английскими словами проще написать, а главное то, что я могу использовать любые слова, примерно подходящие по смыслу и понятные мне (лишь бы эти слова, или их сочетания, не были больше 13 символов в строку, иначе не влезут). Есть красивый английский шрифт, но он Уже и в реальной поездке в авто, где нужно мельком читать, да и смотреть с расстояния 60-70 см на приборную панель, проблематично читается. Тем более что он весит гораздо больше! Для русского языка красивого и легкого шрифта я не нашел, да и нормально написать, чтобы влезло в 13 символов не везде получилось! Ну можно написать и на русском, если сократить некоторые слова, но русский шрифт тоже больше весит, т.е. дольше загружается! Это пока первая версия БК, упрощенная, со временем возможно что-то переделаю. А сейчас лишь бы закончить, а то 3 года уж как начал.
сейчас лишь бы закончить, а то 3 года уж как начал.
надеюсь вы за эти три года нашли время изучить учебник программирования, а не только готовые коды по инету собирали, как первый автор ветки до вас...
Если про медленную перерисовку экрана это был вопрос - хорошо было бы выложить код.
И хорошо бы сообщить разрешение дисплея ...
в программировании Си я не силен, начинал с Басика, он проще и понятней. В учебнике по Си читал только нужное. Дисплей ILI9684 320x480 точек, библиотека MCUFRIEND_kbv.h. Брал такой на шилде чтобы проще было макетировать. На днях прикручу код общения БК с ЭБУ, попробую, тогда выложу (там несколько файлов). Прорисовку картинок делал через PROGMEM. Макет спаян, можно имитировать все режимы (кроме связи с ЭБУ), а реальная плата еще не допаяна. Могу конечно что-то и сейчас выложить, но пока не знаю что, там 14 файлов с подпрограммами, логотипом, иконками и др.
логотипы и иконки можете не выкладывать (по крайней мере пока), вряд ли они понадобятся для разбора кода
ок, создам один файл с первоначальной загрузкой экрана без картинок, и выложу
для такого экрана надо внешнюю память для картинок ... и тогда просто перегонять их на экран
внешнюю ЕЕПРОМ? Это для заставки хорошо, а для иконок 48х48 точек геморно, да и могут появляться глюки! А почему внутренняя память ЕЕПРОМ не подходит, ее дофига в Меге?! Собрал файл, удалил лишние переменные и значки...
а чё клайн обмен не стал выкладывать, я бы посмотрел как сделано, может подсказал чего.
дык просили именно загрузку дисплея, а по обмену- пока твой вариант из 157 поста! ) Вариант с проверкой сложноват, нужно сначала разобраться!
у меня красивый цветной логотип грузится с sd-карты 9 секунд! пытался разобраться с внешней ЕЕПРОМ сколько будет грузить, вроде помню что не намного меньше. хорошо бы хотя бы 3 сек!
для такого экрана надо внешнюю память для картинок ... и тогда просто перегонять их на экран
у меня красивый цветной логотип грузится с sd-карты 9 секунд! пытался разобраться с внешней ЕЕПРОМ сколько будет грузить, вроде помню что не намного меньше. хорошо бы хотя бы 3 сек!
SPI микросхемы отдают мегабайты очень быстро.
По какой шине подключен дисплей ? С таким рисованием как у вас - чуть ли не попиксельно, не мудрено что перерисовка занимает столько времени ...
на шилде у дисплея выводы: RST, CS, RS, WR, RD и D0-D7. Получается параллельный ввод. Хм, дисплей менять?
На Али есть вот такой дисплей: Последовательный ЖК-модуль HD 3,5 дюйма SPI, 480*320, TFT-модуль ILI9486 ILI9488, 4-проводная сенсорная панель с широким обзором, 65K цветной адаптер | Электронные компоненты и принадлежности | АлиЭкспресс (aliexpress.ru)
дык просили именно загрузку дисплея, а по обмену- пока твой вариант из 157 поста! ) Вариант с проверкой сложноват, нужно сначала разобраться!
это очень старый код, опыта тогда не было. там delay (100) в работе с блоком, это никуда не годится. ниже код гораздо более стабильный. клайн к железному Serial подключен?
спасибо, Макс! К-Line подключен к Serial2. Макс, а ведь Serial2 может принимать данные самостоятельно, без контроля процессора, насколько я понимаю! А в это время процессор может обрабатывать данные, опрашивать датчики или загружать картинки! Так?
Komandir, если подключить к Меге SPI дисплей из поста #2182 и SPI EEPROM EN25F80, то насколько изменится скорость загрузки логотипа? Глупый вопрос! ))) Нужно самому пробовать...
Если текущий дисплей реально подключен по параллельной шине D0...D8, то он должен работать шустрее чем SPI. Просто есть дисплеи с гребенками под D0-D8, D0-D16, но перемычками выставлен режим SPI и работает только D0 ...
Просто вижу в коде #include <SPI.h>.
Serial2 может принимать данные самостоятельно, без контроля процессора
Будет вызываться прерывание на каждый принятый байт. Сами байты помешаются в буфер - его размер ограничен. Надо исправить в исходниках размер этого буфера для того что бы самое большое сообщение помещалось в буфер.
штатного буфера хватит за глаза. байты принимаются в буфер да, как ты говоришь, без контроля процессора. Сообщения там короткие, каждый проход луп по одному байту будет из буфера вычитываться. Этот код во-первых, работает без задержек, то есть не влияет на другие процессы (остальной код), во-вторых, контролирует чексумму (не обращает внимания на битые пакеты), и в третьих, переподключается сам, если сессия сбросилась по каким-то причинам.
разбор принятых сообщений со строки 194
Если текущий дисплей реально подключен по параллельной шине D0...D8, то он должен работать шустрее чем SPI. Просто есть дисплеи с гребенками под D0-D8, D0-D16, но перемычками выставлен режим SPI и работает только D0 ...
Просто вижу в коде #include <SPI.h>.
SPI.h для SD карты. Дисплей сто пудов с параллельной загрузкой(8080), просматривал драйвера. Заказал дисплей с SPI, на который давал ссылку, попробую его.
Макс, все-таки начну с простого, мне важно чтобы БК заработал! Потом буду модернизировать, без обид!
Привет, Макс! Вот код связи с ЭБУ, который у меня работал (Основан на твоем). Только у меня в машине не Пиды, а запрос 2102. Ответ на него занимает 38 байт. Там все нужные данные.
"Zapros Initialization" :-))))))))))))
я ж по аглицки-то не шпрехаю! лишь бы для себя понятно было! ))) Английский "изучал" в 90-е по американским боевикам и по DOS-у! )))
Ну оставь вместо всех PIDов один 2102. И будет счастье. Отпишись или лог сюда.
Макс, в скетче сообщения #2192 используется запрос 2102, лог выкладываю (инициализация, запросы и ответы, еще отображаются принятые данные)
Макс, у меня есть пара вопросов, ответь пож-та! Зачем в этом коде задержка в 100 мСек?