PCCar.ru - Ваш автомобильный компьютер

PCCar.ru - Ваш автомобильный компьютер (http://pccar.ru/index.php)
-   Общение с машиной (http://pccar.ru/forumdisplay.php?f=14)
-   -   CITROEN-ARDUINO (http://pccar.ru/showthread.php?t=23275)

xmetal 28.10.2015 13:23

Цитата:

Сообщение от T_r_D (Сообщение 341766)
Будет в итоге штук 30 если см менню разбирусь, а если нет, то штук 15.

Вообще странно, что при перехвате сообщений подряд, как ты говоришь, есть пропуски...
Цитата:

Сообщение от T_r_D (Сообщение 341766)
И настиг чисто технический вопрос использования arduino pro micro.
Значит так, кан шилд использует пин 2 (видимо как int 0).
А модулю радио нужен это пин как SDA.
Как это подружить или переназначить пин SDA или INT0?
Или может это будет работать и так?

Судя по скетчу из 4 страницы пин 2 не используется вообще. Так что можно его не соединять с кан шилдом.

T_r_D 28.10.2015 13:25

Цитата:

Сообщение от xmetal (Сообщение 341814)
Вообще странно, что при перехвате сообщений подряд, как ты говоришь, есть пропуски...
Судя по скетчу из 4 страницы пин 2 не используется вообще. Так что можно его не соединять с кан шилдом.

Он внутри библиотеки скорее всего используется.
Но я попробую его отпаять :)

Пин 2 законнекчен с выводом 12 (INT) MCP2515

И повторюсь- как вот это повторить на ардуино

125 6 01110000 TTTTTTTT AAAAAAAA 0SXEBBBB MMMMMMMM 00000000 [[JJJJJJJJ x20] [HHHHHHHH x20] x0-4]
6 Показать меню списка треков.
TTTTTTTT - количество треков,
AAAAAAAA - offset экрана списка треков,
S - флаг "покажи список треков"
E - флаг "список треков сдвинулся" на 1 позицию выше или ниже за пределы 4х видимых в данный момент. Направление сдвига определяется по BBBB
BBBB - offset выбранного трека внутри экрана списка треков
MMMMMMMM - дескриптор текстовых данных, идущих далее.
каждая пара бит соответствует наличию исполнителя и названия трека, идущих далее пакетами по 20 байт в соответствующем порядке.
Позиции соответствуют позициям на экране, кроме ситуации наличия флага E
[JJJJJJJJ x20] - 20 байт имени исполнителя
[HHHHHHHH x20] - 20 байт названия трека

125 1 00000000 Спрятать меню списка треков. (Нажатие на OK после выбора трека в LIST, нажатие на ESC, по таймаут)

lti1 28.10.2015 13:51

А может быть пропуски потому, что не используется пин 2?
Попробуйте этот скетч:
PHP код:

#include <mcp_can.h>
#include <SPI.h>

long unsigned int rxId;
unsigned char len 0;
unsigned char rxBuf[8];

MCP_CAN CAN0(10);

void setup()
{
  
Serial.begin (115200);
  
CAN0.begin(CAN_500KBPS); // скорость CAN
  
pinMode(2INPUT); // пин 2 можно переназначить
}

void loop()
{
    if(!
digitalRead(2)) // пин 2 можно переназначить                         
    
{
      
CAN0.readMsgBuf(&lenrxBuf);              
      
rxId CAN0.getCanId();                    
 
      if (
rxId == 0x306// фильтр по ID, в данном случае по ID 0x306
       
{

       }
    }



T_r_D 28.10.2015 14:07

Цитата:

Сообщение от lti1 (Сообщение 341821)
А может быть пропуски потому, что не используется пин 2?
Попробуйте этот скетч:
PHP код:

#include <mcp_can.h>
#include <SPI.h>

long unsigned int rxId;
unsigned char len 0;
unsigned char rxBuf[8];

MCP_CAN CAN0(10);

void setup()
{
  
Serial.begin (115200);
  
CAN0.begin(CAN_500KBPS); // скорость CAN
  
pinMode(2INPUT); // пин 2 можно переназначить
}

void loop()
{
    if(!
digitalRead(2)) // пин 2 можно переназначить                         
    
{
      
CAN0.readMsgBuf(&lenrxBuf);              
      
rxId CAN0.getCanId();                    
 
      if (
rxId == 0x306// фильтр по ID, в данном случае по ID 0x306
       
{

       }
    }



if(!digitalRead(2)) что тут означает восклицательный знак?

Если я правильно понимаю, то проверяется возникновение чего-то на пине 2, и если оно появилось, то читаем данные из буфера.
У меня написано тоже самое, только проверка делается
if(CAN_MSGAVAIL == CAN.checkReceive())

в библиотеке
INT8U MCP_CAN::checkReceive(void)
{
INT8U res;
res = mcp2515_readStatus(); /* RXnIF in Bit 1 and 0 */
if (res & MCP_STAT_RXIF_MASK)
{
return CAN_MSGAVAIL;
}
else
{
return CAN_NOMSG;
}
}

.....................................
INT8U MCP_CAN::mcp2515_readStatus(void)
{
INT8U i;
MCP2515_SELECT();
spi_readwrite(MCP_READ_STATUS);
i = spi_read();
MCP2515_UNSELECT();

return i;
}

Тоесть я проверяю и так наличие единицы.

xmetal 28.10.2015 14:12

lti1, вот только подумал тоже самое :smile2:

lti1 28.10.2015 14:15

Цитата:

Сообщение от T_r_D (Сообщение 341823)
if(!digitalRead(2)) что тут означает восклицательный знак?

Если я правильно понимаю, то проверяется возникновение чего-то на пине 2, и если оно появилось, то читаем данные из буфера.
У меня написано тоже самое, только проверка делается
if(CAN_MSGAVAIL == CAN.checkReceive())

в библиотеке
INT8U MCP_CAN::checkReceive(void)
{
INT8U res;
res = mcp2515_readStatus(); /* RXnIF in Bit 1 and 0 */
if (res & MCP_STAT_RXIF_MASK)
{
return CAN_MSGAVAIL;
}
else
{
return CAN_NOMSG;
}
}

.....................................
INT8U MCP_CAN::mcp2515_readStatus(void)
{
INT8U i;
MCP2515_SELECT();
spi_readwrite(MCP_READ_STATUS);
i = spi_read();
MCP2515_UNSELECT();

return i;
}

Тоесть я проверяю и так наличие единицы.

Что тут рассуждать, попробуйте и будет понятно. У меня пропусков нет, скорость CAN 500 kbps.

T_r_D 28.10.2015 14:22

Цитата:

Сообщение от lti1 (Сообщение 341825)
Что тут рассуждать, попробуйте и будет понятно. У меня пропусков нет, скорость CAN 500 kbps.

А строка-то что означает?
if(!digitalRead(2))
Я блин не как не въеду в синтаксис!
Что делает "!"

xmetal 28.10.2015 15:05

! - логический оператор. Пример !1=0 (false), !0=1 (true). Если на ножке 0 то условие выполняется

Можно немного ускорить работу, чтобы было поменьше лишних проверок:
Код:

if(!digitalRead(2)) // check if data coming
{
CAN.readMsgBuf(&len, buf);
canId = CAN.getCanId();

if(canId == 246) //0F6
{
...
goto output; // пропускаем остальные ID
}

if(canId == 182) //0B6
{
...
goto output; // пропускаем остальные ID
}

if(canId == 545) //221
{
...
goto output; // пропускаем остальные ID
}

if(canId == 543) //21F
{
...
goto output; // пропускаем остальные ID
}

if(canId == 997) //3E5
{
...
goto output; // пропускаем остальные ID
}

if(canId == 357) //165
{
...
goto output; // пропускаем остальные ID
}

if(canId == 549) //225
{
...
goto output; // пропускаем остальные ID
}

if(canId == 421) //1A5
{
VOL = buf[0];
}

output: //прыгаем сразу сюда
//Выводим данные.
if (incomingByte == 98){;Serial.print("Speed: "); Serial.println(Speed);}
if (incomingByte == 99){Serial.print("RPM: "); Serial.println(RPM);}
if (incomingByte == 100){Serial.print("Instant fuel consumption /100Km: "); Serial.println(ILPK);}
if (incomingByte == 101){Serial.print("Run on current fuel level: "); Serial.println(ARCFL);}
if (incomingByte == 102){Serial.print("Themperature: "); Serial.println(Themperature);}
...
}


T_r_D 28.10.2015 18:55

Цитата:

Сообщение от xmetal (Сообщение 341837)
! - логический оператор. Пример !1=0 (false), !0=1 (true). Если на ножке 0 то условие выполняется
[/CODE]

Спасибо.
А про 125 сообщение ни кто не знает как его отобразить?

И всётаки как загнать все данные в одну строку?
Хочу вообще уменьшить скорость выдачи данных в порт.
Если ни чего не поменялось в группе данных, то их и не выводить в порт.
Тогда скорость порта станет вообще не особо критичной.

xmetal 28.10.2015 22:36

Цитата:

Сообщение от T_r_D (Сообщение 341866)
И всётаки как загнать все данные в одну строку?

Может так?
Код:

void setup() {
Serial.begin(115200);
}

void loop() {
String str= "string ";
byte data1[8] = {1,2,3,4,5,6,7,8};
byte data2[8] = {8,7,6,5,4,3,2,1};

for(byte i=0; i<8; i++){
str += data1[i];
str += " ";
}

for(byte i=0; i<8; i++){
str += data2[i];
str += " ";
}

Serial.println(str);
delay(5000);
}



Часовой пояс GMT +4, время: 19:28.

Работает на vBulletin® версия 3.8.4.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot