Скетч, работающий на Nano, не работает на Mega

Игоряха
Offline
Зарегистрирован: 31.03.2018

Помогите разобраться. Cкетч, читающий CAN-шину для вывода температуры и др. параметров на дисплей. На Ардуине Нано работает, но бывают задержки по несколько секунд. Решил переделать на MEGA 2560 PRO (была в наличии). Не работает, на дисплее – «снег». Похоже, что выполнение останавливается на строке 26. Библиотека mcp_can.h вроде универсальная, или для меги нужна какая-то другая?

#include <mcp_can.h>
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
MCP_CAN CAN(10);
long unsigned int rxId;
unsigned char len = 0;
unsigned char rxBuf[8];
float temp_cvt;
float temp_engine;
float fuel;
float volt;

void setup()
{
  CAN.begin(CAN_500KBPS, MCP_8MHz);
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
}

void loop() {

  CAN.readMsgBuf(&len, rxBuf);
  rxId = CAN.getCanId();

  if (rxId == 0x418)  //температура вариатора
  {
    temp_cvt = (rxBuf[2]);
    temp_cvt = temp_cvt - 50;
  }
  if (rxId == 0x608) //температура двигателя
  {
    temp_engine = (rxBuf[0]);
    temp_engine = temp_engine - 40;
  }
  if (rxId == 0x154)  //топливо
  {
    fuel = (rxBuf[1]);
    if (fuel == 0xff)
    {
      fuel = 0;
    }
    else
    {
      fuel = ((fuel - 62) * 0.6);
    }
  }
  if (rxId == 0x424) //Напряжение бортовой сети
  {
    volt = (rxBuf[1]);
    volt = volt / 10;
  }
  display.clearDisplay();
  display.setTextSize(2);
  display.setTextColor(WHITE);

  display.setCursor(0, 10);
  display.println("C");

  display.setCursor(13, 10);
  display.println(temp_cvt, 0);

  display.setCursor(55, 10);
  display.println("F");

  display.setCursor(68, 10);
  display.println(fuel, 0);

  display.setCursor(0, 35);
  display.println("E");

  display.setCursor(13, 35);
  display.println(temp_engine, 0);

  display.setCursor(55, 35);
  display.println("V");

  display.setCursor(68, 35);
  display.println(volt, 1);
  display.display();
}

 

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Выведи в сериал значение rxId - узнаешь работает ли библиотека CAN. Но! Если на экране «снег», то скорее всего проблема с дисплеем (и выводом на него). А может где-то провод отвалился.

Игоряха
Offline
Зарегистрирован: 31.03.2018

Если закомментировать 26 строку: CAN.readMsgBuf(&len, rxBuf); 

и в сериал, и на экран выводятся нулевые значения.

_Igor_
Offline
Зарегистрирован: 10.01.2022

А CAN модули одинаковые. Есть с разными кварцами.

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Игоряха пишет:

Если закомментировать 26 строку: CAN.readMsgBuf(&len, rxBuf); 

и в сериал, и на экран выводятся нулевые значения.

Тогда выкладывай библиотеку саму. И ещё - в настройках вывод компилятора настроен на вывод всех сообщений? Какие варнинги пишет при компиляции?

sadman41
Offline
Зарегистрирован: 19.10.2016

readMsgBuf() имеет смысл только при available() > 0

Игоряха
Offline
Зарегистрирован: 31.03.2018
_Igor_ пишет:
 
А CAN модули одинаковые. Есть с разными кварцами.
 
 
Модули одинаковые, кварцы 8 мГц
 
BOOM пишет:
 
Тогда выкладывай библиотеку саму. И ещё - в настройках вывод компилятора настроен на вывод всех сообщений? Какие варнинги пишет при компиляции?
 
 
 
варнинги:
D:\Documents\Arduino\libraries\Adafruit-GFX-Library-master\Adafruit_GFX.cpp: In function 'drawBitmap.constprop':
D:\Documents\Arduino\libraries\Adafruit-GFX-Library-master\Adafruit_GFX.cpp:392:22: warning: 'byte' may be used uninitialized in this function [-Wmaybe-uninitialized]
       if(i & 7) byte <<= 1;
                      ^
D:\Documents\Arduino\libraries\Adafruit-GFX-Library-master\Adafruit_GFX.cpp:388:11: note: 'byte' was declared here
   uint8_t byte;
           ^
D:\Documents\Arduino\libraries\Adafruit-GFX-Library-master\Adafruit_GFX.cpp: In member function 'drawChar':
D:\Documents\Arduino\libraries\Adafruit-GFX-Library-master\Adafruit_GFX.cpp:600:23: warning: 'bits' may be used uninitialized in this function [-Wmaybe-uninitialized]
         if(bits & 0x80) {
                       ^
D:\Documents\Arduino\libraries\Adafruit-GFX-Library-master\Adafruit_GFX.cpp:569:22: note: 'bits' was declared here
     uint8_t  xx, yy, bits, bit = 0;
                      ^
D:\Documents\Arduino\libraries\Adafruit-GFX-Library-master\Adafruit_GFX.cpp:570:20: warning: 'yo16' may be used uninitialized in this function [-Wmaybe-uninitialized]
     int16_t  xo16, yo16;
                    ^
D:\Documents\Arduino\libraries\Adafruit-GFX-Library-master\Adafruit_GFX.cpp:570:14: warning: 'xo16' may be used uninitialized in this function [-Wmaybe-uninitialized]
     int16_t  xo16, yo16; 

 

 

Игоряха
Offline
Зарегистрирован: 31.03.2018

sadman41 пишет:
readMsgBuf() имеет смысл только при available() > 0

Не понял, поясни, пожалуйста

_Igor_
Offline
Зарегистрирован: 10.01.2022

Ну CAN.checkReceive() конечно нужен. Но думаю там уже все буфера забиты.

А если температуру в Serial - что покажет?

_Igor_
Offline
Зарегистрирован: 10.01.2022

И ноги I2C у NANO и MEGA разные

Игоряха
Offline
Зарегистрирован: 31.03.2018

_Igor_ пишет:

Ну CAN.checkReceive() конечно нужен. Но думаю там уже все буфера забиты.

А если температуру в Serial - что покажет?

При незакомментированной строке  CAN.readMsgBuf(&len, rxBuf); в сериал ничего не выводится, на дисплее - снег.

Если закомментировать - в сериале и на дисплее - нули

Игоряха
Offline
Зарегистрирован: 31.03.2018

_Igor_ пишет:

И ноги I2C у NANO и MEGA разные

знаю

sadman41
Offline
Зарегистрирован: 19.10.2016

В сериале вообще ничего не может быть, а из буфера скорее всего мусор читается, так как проверки на наличие принятого пакета не производится.

_Igor_
Offline
Зарегистрирован: 10.01.2022

Проверку на наличие поставить надо. Но с любом случае readMsgBuf только читает по SPI. Id все равно не совпадет. Должны быть нули.

Контакт по SPI... !!! Или модуль битый.

Игоряха
Offline
Зарегистрирован: 31.03.2018

Разобрался. У меги CS - пин 53. А в скетче остался как у Нано - 10 (строка 09). Исправил на 53, все заработало. Спасибо всем откликнувшимся!

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Игоряха пишет:

Разобрался. У меги CS - пин 53. А в скетче остался как у Нано - 10 (строка 09). Исправил на 53, все заработало. Спасибо всем откликнувшимся!

У Меги, равно как и у Нано, CS пин может быть любым.