29.10.2015, 16:01 | #101 |
Старший Пользователь
Регистрация: 03.07.2015
Регион: 77, 97, 99, 177
Сообщений: 372
|
Короче получил в лоб от 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 всё собрать. Последний раз редактировалось T_r_D; 29.10.2015 в 17:35. |
30.10.2015, 14:27 | #102 |
Старший Пользователь
Регистрация: 03.07.2015
Регион: 77, 97, 99, 177
Сообщений: 372
|
Сам себе отвечаю.
Всё и так работало, просто то что в void setup() было в порт не попадало. Другие ардуины проходили инит при подключении программы к COM порту (или сбрасывались), а эта нет. Так что если нужно увидеть эти сообщения, то нужна задержка в 10 секунд. Там лоадер инится 8 секунд. А по подключению то что выше написал. И ещё на ардуине перемычку запаял чтоб плата CAN питалась напрямую от порта, а не через резистор на плате. Как только всё заработает окончательно питание с USB разъёма вообще уберу. Ща время нету, но попозде попробую с Interupt сделать и скажу пропали задержки или нет. По поводу меню. Само меню реально прошито в дисплее. Дисплей ловит нажатия на кнопки после получение сообщения от магнитолы что мы нажали кнопку меню. Далее обрабатывает нажатия кнопок и в обратку выдаёт в 125 сообщение активна настройка или нет. Скорее всего при изменении значения меню посылается или модифицируется сообщение. И скорее всего это сообщение 1E0. Так что данные об том что в данный момент на дисплее отображает меню в CAN не идёт. Посему это можно реализовать только ловя нажатие кнопок без пропусков и задержек. Если модуль радио покажет себя лутчше чем штатная магнитола, то париться с этим я больше не буду. |
30.10.2015, 19:14 | #103 | |
Старший Пользователь
Регистрация: 17.01.2010
Возраст: 48
Город: Самара
Регион: 63, 163
Машина: Skoda Octavia A5 FL && Skoda Octavia Tour && ̶F̶F̶3̶
Сообщений: 457
|
Цитата:
PHP код:
Последний раз редактировалось lti1; 31.10.2015 в 15:22. |
|
31.10.2015, 15:10 | #104 | |
Старший Пользователь
Регистрация: 03.07.2015
Регион: 77, 97, 99, 177
Сообщений: 372
|
Цитата:
Я наступаю на грабли 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; Получаем несоответствие типов данных. Как это побороть? мне просто нужно чтоб был какой нить разделитель в строке между числами. |
|
31.10.2015, 19:48 | #105 |
Пользователь
Регистрация: 29.07.2015
Регион: 64
Машина: VW Tiguan
Сообщений: 89
|
Наверное так, если я правильно понял задачу:
Код:
void setup() { Serial.begin(115200); } void loop() { char *OUTLINE[] = {"RPM","|","SPD","|","ILPK","|","LPK","|","Trip","|","AVG SPD","|","Themp"}; for(byte i=0; i<13; i++){ Serial.print(OUTLINE[i]); //вывод: RPM|SPD|ILPK|LPK|Trip|AVG SPD|Themp } Serial.println(); String str; str = String(123.456,3); OUTLINE[8]=""; str.toCharArray(OUTLINE[8],str.length()+1); //копируем новые данные в OUTLINE[8] for(byte i=0; i<13; i++){ Serial.print(OUTLINE[i]); //вывод: RPM|SPD|ILPK|LPK|123.456|AVG SPD|Themp } a: goto a; } |
01.11.2015, 10:09 | #106 | |
Старший Пользователь
Регистрация: 03.07.2015
Регион: 77, 97, 99, 177
Сообщений: 372
|
Цитата:
Именно это и нужно. Блин, какой С оказывается не простой язык. Паскаль проще. |
|
01.11.2015, 14:03 | #107 |
Старший Пользователь
Регистрация: 03.07.2015
Регион: 77, 97, 99, 177
Сообщений: 372
|
но поторопился!
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||| Последний раз редактировалось T_r_D; 01.11.2015 в 14:45. |
02.11.2015, 15:17 | #108 |
Старший Пользователь
Регистрация: 03.07.2015
Регион: 77, 97, 99, 177
Сообщений: 372
|
Короче сделал вот так:
#include <SPI.h> #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("<TRIP|"); for(int i = 0; i < 7; i++) { Serial.print(OUTLINES[i]); if (i != 6){Serial.print("|");} } Serial.println(">"); } Это собственно всё что показывает борт комп не считая сообщений информационных. Ну и то что закоменчено, то на верхнем дисплее и скорость с оборотами тоже. Надо ещё поколдовать и сделать что если массив не менялся, то и данные выводить не надо. |
02.11.2015, 21:58 | #109 | |
Старший Пользователь
Регистрация: 17.01.2010
Возраст: 48
Город: Самара
Регион: 63, 163
Машина: Skoda Octavia A5 FL && Skoda Octavia Tour && ̶F̶F̶3̶
Сообщений: 457
|
Цитата:
PHP код:
Какой-то костыль получается, но работает. Ссылка. |
|
02.11.2015, 23:24 | #110 | |
Старший Пользователь
Регистрация: 03.07.2015
Регион: 77, 97, 99, 177
Сообщений: 372
|
Цитата:
Я уже int массив сделал, в принципе и так пойдёт. |
|
Здесь присутствуют: 13 (пользователей: 0 , гостей: 13) | |
|
|