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

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

Farman 21.02.2015 22:52

У меня все это нормально работает. Срежте дорожку которая терминирует резистор на 120 ом. Гже он есть на вики у сиидсьудио.

Jiraffa 21.02.2015 23:21

На этом шилде (sparkfun, а не seedstudio, я указал в первом сообщении) нет этого резистора в принципе. Эти два шилда не совсем идентичны

Вроде нано ещё где-то валялась ... И сама Мега32 ... Не покупать же ещё одну плату.
Попробую наваять из меги32
Хотя не верю, что причина в этом

Farman 21.02.2015 23:43

Тогда сорри, у меня от сиидстудио

Jiraffa 21.02.2015 23:48

А работает с мегой?

cherkasoff 22.02.2015 12:58

Цитата:

Сообщение от Farman (Сообщение 321357)
У меня все это нормально работает. Срежте дорожку которая терминирует резистор на 120 ом. Гже он есть на вики у сиидсьудио.

У меня с терминирующим резистором вообще ничего не работало, а тут сначала работает, а потом нет.

Farman 22.02.2015 21:39

Цитата:

Сообщение от Jiraffa (Сообщение 321366)
А работает с мегой?

С мегой и нано нормально работает. Но я щас перешел на элдуино. Там и лин есть, правда поеа не достучались до него.

Glouck 23.02.2015 07:05

Цитата:

Сообщение от Jiraffa (Сообщение 321270)
Вставляю ключ зажигания, приходят две посылки и ..... всё. После этого, чтобы ещё что-то получить необходимо сбросить питание с ардуины и шилда и вытащить ключ.

Т.е. шина продолжает работать (периферия в машине, которая сидит на этой шине), но шилд не видит данные? Или вся шина ложится после этого?
Осциллографом смотрел?

Jiraffa 23.02.2015 09:23

Шина продолжает работать, шилд не видит данные. Чтобы увидел, нужно его обесточить и вытащить ключ зажигания. Потом включить шилд и вставить ключ. Если сначала вставить ключ, а потом включить шилд - ничего не примет. Можно ещё вместо ключа нажать на кнопки ключа, тогда шилд тоже принимает пакеты (6 штук). Причём для кнопок открытия и закрытия - разные

Осцилом (USB) посмотрел, как смог. Данные бегают

Glouck 23.02.2015 23:33

А можно взглянуть на код прошивки?

Jiraffa 24.02.2015 11:45

Вложений: 2
Библиотека почти стандартная - я добавил только скорость 83.333 для мерса (там несколько таких скоростей - экспериментировал, на 3м варианте приём стабильный)
Скетч содержит элементы для вывода информации на I2C дисплей и использование джойстика, но я их почти сразу заремил и оставил только консоль.

Попробовал сейчас на столе ещё с elm327 его скрестить. От elm'a пакеты приходят. Но тоже только один раз. т.е. запускаю elm на автоопределение протокола и шилд принимает пару пакетов (на соот-ей текущей выбранной скорости). elm ничего не находит, что и понятно, и отключается. Запускаю сканирование ещё раз - и шилд уже ничего не принимает. Помогает reset.

Код скетча (он же есть и в архиве)
Код:

// demo: CAN-BUS Shield, receive data
#include "mcp_can.h"
#include
#include
//#include
//#include

#define INT8U unsigned char

/*"Joystick" Init*/
#define UP    A1    /*Analog Pin 1*/
#define DOWN  A3    /*Analog Pin 3*/
#define LEFT  A5    /*Analog Pin 5*/
#define RIGHT  A2    /*Analog Pin 2*/
#define CLICK  A4    /*Analog Pin 4*/
#define JSP    0  /*Joystick Pressed*/
#define JSNP  1  /*Joystick Not Pressed*/

/*Status LED's*/
#ifndef LED_2
int LED_2 = 8;
#endif
#ifndef LED_3
int LED_3 = 7;
#endif

//LiquidCrystal_I2C lcd(0x27,20,4);  // set address of lcd to 0x27 and count of char to 20, of rows to 4 (20х4)

INT8U Flag_Recv = 0;
INT8U len = 0;
INT8U buf[16];
char str[20];
INT8U speedCAN;
int speedCANtext;
int countPckg = 0;
//char speedInput;

//Timer 2 - blinking LED
unsigned int toggle = 0;  //used to keep the state of the LED
unsigned int count = 0;  //used to keep count of how many interrupts were fired

//Timer2 Overflow Interrupt Vector, called every 1ms
ISR(TIMER2_OVF_vect) {
  count++;              //Increments the interrupt counter
  if(count > 999){
    toggle = !toggle;    //toggles the LED state
    count = 0;          //Resets the interrupt counter
  }
  digitalWrite(LED_3,toggle);
  TCNT2 = 130;          //Reset Timer to 130 out of 255
  TIFR2 = 0x00;          //Timer2 INT Flag Reg: Clear Timer Overflow Flag
}; 

/*
void init_LCD (void)
{
  lcd.init();                    // инициализация LCD
  lcd.backlight();                // включаем подсветку
  lcd.clear();                    // очистка дисплея
  lcd.setCursor(0, 0);
}
*/
void init_JoyStick(void)
{
  pinMode(UP,INPUT);
  pinMode(DOWN,INPUT);
  pinMode(LEFT,INPUT);
  pinMode(RIGHT,INPUT);
  pinMode(CLICK,INPUT);
  digitalWrite(UP, HIGH);  //enabled input pull-up resistor
  digitalWrite(DOWN, HIGH);  //enabled input pull-up resistor
  digitalWrite(LEFT, HIGH);  //enabled input pull-up resistor
  digitalWrite(RIGHT, HIGH);  //enabled input pull-up resistor
  digitalWrite(CLICK, HIGH);  //enabled input pull-up resistor
}

void init_Status_LED(void)
{
  pinMode(LED_2, OUTPUT);//communication LED
  pinMode(LED_3, OUTPUT); //Status LED
  digitalWrite(LED_2,LOW);
  digitalWrite(LED_3,LOW);
}

void init_CAN(void)
{
  if (CAN.begin(speedCAN) == 0)                // init can bus at baudrate
  {
/*    lcd.clear();
    lcd.print ("CAN init on ");
    lcd.print (speedCANtext);
    lcd.print ("KBPS");
*/    Serial.print("CAN init on ");
    Serial.print(speedCANtext);
    Serial.println("KBPS");
  } else
  {
/*    lcd.clear();
    lcd.print ("CAN init FAIL");
*/    Serial.println("CAN init FAIL");
  }
}

void select_CAN_speed(void)
{
      int speedInput = Serial.read ();
      switch (speedInput)
      {
        case '1':   
          speedCAN = CAN_83_1KBPS;
          speedCANtext = 831;
          break;
        case '2':   
          speedCAN = CAN_83_2KBPS;
          speedCANtext = 832;
          break;
        case '3':   
          speedCAN = CAN_83_3KBPS;
          speedCANtext = 833;
          break;
        case '4':   
          speedCAN = CAN_83_4KBPS;
          speedCANtext = 834;
          break;
        case '5':   
          speedCAN = CAN_83_5KBPS;
          speedCANtext = 835;
          break;
        case '6':   
          speedCAN = CAN_500KBPS;
          speedCANtext = 500;
          break;
        case '7':   
          speedCAN = CAN_100KBPS;
          speedCANtext = 100;
          break;
        case '8':   
          speedCAN = CAN_125KBPS;
          speedCANtext = 125;
          break;
        default:
          Serial.println ("Speed error");
          speedCANtext = -1;
      }
}

void setup()
{
  Serial.begin(115200);
//  init_LCD();
//  init_JoyStick();
  init_Status_LED();

  //Setup Timer2 to fire every 1ms
  TCCR2B = 0x00;        //Disbale Timer2 while we set it up
  TCNT2  = 130;        //Reset Timer Count to 130 out of 255
  TIFR2  = 0x00;        //Timer2 INT Flag Reg: Clear Timer Overflow Flag
  TIMSK2 = 0x01;        //Timer2 INT Reg: Timer2 Overflow Interrupt Enable
  TCCR2A = 0x00;        //Timer2 Control Reg A: Normal port operation, Wave Gen Mode normal
  TCCR2B = 0x05;        //Timer2 Control Reg B: Timer Prescaler set to 128

//for use with mega2560
  pinMode(10, OUTPUT);   
  digitalWrite(10, HIGH);
  pinMode(11, INPUT);   
  digitalWrite(11, LOW);
  pinMode(12, INPUT);   
  digitalWrite(12, LOW);
  pinMode(13, INPUT);   
  digitalWrite(13, LOW);

//  lcd.print ("Press Joy to start");
//  Serial.println("Press Joy to start...");

  Serial.println("Enter CAN-BUS speed:");
  Serial.println("1 - 83.333 (1)");
  Serial.println("2 - 83.333 (2)");
  Serial.println("3 - 83.333 (3)");
  Serial.println("4 - 83.333 (4)");
  Serial.println("5 - 83.333 (5)");
  Serial.println("6 - 500");
  Serial.println("7 - 100");
  Serial.println("8 - 125");
  speedCANtext = -1;
  while (speedCANtext < 0)
  {
    if (Serial.available() > 0)
    {
      select_CAN_speed();
    }
  }

/* 
//  while (digitalRead(CLICK));
  while (1)
  {
    if(!digitalRead(DOWN))
    {
      speedCAN = CAN_83_1KBPS;
      speedCANtext = 831;
      break;
    }  else if(!digitalRead(UP))
    {
      speedCAN = CAN_83_2KBPS;
      speedCANtext = 832;
      break;
    } else if(!digitalRead(LEFT))
    {
      speedCAN = CAN_500KBPS;
      speedCANtext = 500;
      break;
    } else if(!digitalRead(RIGHT))
    {
      speedCAN = CAN_100KBPS;
      speedCANtext = 100;
      break;
    }
   
  }
*/ 
  init_CAN ();
  attachInterrupt(0, MCP2515_ISR, FALLING); // start interrupt
}

void MCP2515_ISR()
{
    Flag_Recv = 1;
      digitalWrite(LED_2,HIGH);
}

void loop()
{
//    digitalWrite(LED_3,HIGH);
    if(Flag_Recv)                  // check if get data
    {
      Flag_Recv = 0;                // clear flag
      ++countPckg;                  // count of packages
      CAN.readMsgBuf(&len, buf);    // read data,  len: data length, buf: data buf
      Serial.print(countPckg);
//      Serial.println(": CAN_BUS GET DATA!");
/*      lcd.setCursor(0, 1);
      lcd.print (countPckg);
      lcd.print (": CANBUS GET DATA");
*/      Serial.print(": data len = ");
      Serial.print(len, HEX);
      Serial.print("\t");
      for(int i = 0; i       {
        Serial.print(buf[i], HEX);
        Serial.print("\t");
      }
      Serial.println();
      digitalWrite(LED_2,LOW);
    }

}



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

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