![]() |
Короче получил в лоб от Pro Micro!
подключаю плату кан 10 вывод CS, 16 MOSI, 14 MISO, 15 SCK. (эти выводы идут подряд на самом деле на плате дуины взято отсюда распиновка https://learn.sparkfun.com/tutorials...3-hookup-guide) И нефига не работает! Такое впечатление что контроллер подвисает! Отcоединяем SCK и естественно эрор инита. Даже попробовал именно под эту плату бутлоадер https://github.com/sparkfun/Arduino_Boards и ни чего! Перепаял назад на Nano- всё работает снова! Это так, ради страховки, ну типо не попалил ли я платку кана пока паял. У кого какие соображения? Хочется на pro-micro всё собрать. |
Сам себе отвечаю.
Всё и так работало, просто то что в void setup() было в порт не попадало. Другие ардуины проходили инит при подключении программы к COM порту (или сбрасывались), а эта нет. Так что если нужно увидеть эти сообщения, то нужна задержка в 10 секунд. Там лоадер инится 8 секунд. А по подключению то что выше написал. И ещё на ардуине перемычку запаял чтоб плата CAN питалась напрямую от порта, а не через резистор на плате. Как только всё заработает окончательно питание с USB разъёма вообще уберу. Ща время нету, но попозде попробую с Interupt сделать и скажу пропали задержки или нет. По поводу меню. Само меню реально прошито в дисплее. Дисплей ловит нажатия на кнопки после получение сообщения от магнитолы что мы нажали кнопку меню. Далее обрабатывает нажатия кнопок и в обратку выдаёт в 125 сообщение активна настройка или нет. Скорее всего при изменении значения меню посылается или модифицируется сообщение. И скорее всего это сообщение 1E0. Так что данные об том что в данный момент на дисплее отображает меню в CAN не идёт. Посему это можно реализовать только ловя нажатие кнопок без пропусков и задержек. Если модуль радио покажет себя лутчше чем штатная магнитола, то париться с этим я больше не буду. |
Вложений: 2
Цитата:
PHP код:
|
Цитата:
Я наступаю на грабли char* OUTLINE[] = {"RPM","|","SPD","|","ILPK","|","LPK","|","Trip","|","AVG SPD","|","Themp"}; задали массив и так его можно выводить спокойно, но он требует char. модифицируем строку которая в int RPM = (int)buf[0] << 5 | buf[1] >> 3; в str = String((int)buf[0] << 5 | buf[1] >> 3); загоняем в массив OUTLINE[0] = str; Получаем несоответствие типов данных. Как это побороть? мне просто нужно чтоб был какой нить разделитель в строке между числами. |
Наверное так, если я правильно понял задачу:
Код:
void setup() { |
Цитата:
Именно это и нужно. Блин, какой С оказывается не простой язык. Паскаль проще. |
но поторопился!
char *OUTLINE[] = {"RPM","|","SPD","|","ILPK","|","LPK","|","Trip","|","AVG SPD","|","Themp"}; for(int i=0; i<13; i++){ Serial.print(OUTLINE[i]); } Так будет всё правильно, но стоит между этим вставить OUTLINES[0] = ""; str = String(123); str.toCharArray(OUTLINES[0],str.length()+1); OUTLINES[1] = "bbb"; как вместо того что нужно получим 123123|bbb|SPD||| А если сделаем вот так, то получим ещё круче! OUTLINES[0] = ""; str = String(123); str.toCharArray(OUTLINES[0],str.length()+1); OUTLINES[1] = ""; str = String(278); str.toCharArray(OUTLINES[1],str.length()+1); OUTLINES[2] = "str"; выведет 278278|278|str||| |
Короче сделал вот так:
#include #include "mcp_can.h" MCP_CAN CAN(10); unsigned char len = 0; unsigned char buf[8]; INT32U canId = 0x000; // идентификаторы могут быть 11-ти или 29-битные //RPM SPD ILPK LPK AVG_SPD Trp Tmp // /100 /10 /10 делить на int OUTLINES[] = {0,0,0,0,0,0,0}; void setup() { Serial.begin(115200); pinMode(9, INPUT); delay(10000); START_INIT: if(CAN_OK == CAN.begin(CAN_125KBPS,MCP_8MHz)) {Serial.println("Init OK!");} else {Serial.println("Init fail");delay(100);goto START_INIT;} } void loop() { if(CAN_MSGAVAIL == CAN.checkReceive()) { CAN.readMsgBuf(&len, buf); canId = CAN.getCanId(); //_________________________________TRIP_____________ ______________________ if(canId == 182) //0B6 { OUTLINES[0] = (int)buf[0] << 5 | buf[1] >> 3; //Обороты OUTLINES[1] = ((int)buf[2] << 8 | buf[3]); //скорость / 100 } if(canId == 545) //221 { OUTLINES[2] = (int)buf[1] << 8 | buf[2]; //моментальный расход / 10, если -1 то показаний нет //ARCFL = (int)buf[3] << 8 | buf[4]; //Километры на остатке топлива } if(canId == 673) //0B6 { OUTLINES[3] = (int)buf[3] << 8 | buf [4]; //Расход на 100км /10 OUTLINES[4] = buf[0]; //Средняя скорость OUTLINES[5] = ((int)buf[1] << 8 | buf [2]); //Трип } if(canId == 246) //0F6 { OUTLINES[6] = (buf[6] / 2) - 39; //Температура //Odometr = ((unsigned long)buf[2] << 16 | (unsigned int)buf[3] << 8 | buf[4])/10; //Там есть десятые километра } } __________________________________Выводим данные__________________________________ Serial.print(" { Serial.print(OUTLINES[i]); if (i != 6){Serial.print("|");} } Serial.println(">"); } Это собственно всё что показывает борт комп не считая сообщений информационных. Ну и то что закоменчено, то на верхнем дисплее и скорость с оборотами тоже. Надо ещё поколдовать и сделать что если массив не менялся, то и данные выводить не надо. |
Цитата:
PHP код:
Какой-то костыль получается, но работает. Ссылка. |
Цитата:
Я уже int массив сделал, в принципе и так пойдёт. |
Часовой пояс GMT +4, время: 10:02. |
Работает на vBulletin® версия 3.8.4.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot