Скетч, работающий на Nano, не работает на Mega
- Войдите на сайт для отправки комментариев
Вс, 03/04/2022 - 17:13
Помогите разобраться. 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();
}
Выведи в сериал значение rxId - узнаешь работает ли библиотека CAN. Но! Если на экране «снег», то скорее всего проблема с дисплеем (и выводом на него). А может где-то провод отвалился.
Если закомментировать 26 строку:
CAN.readMsgBuf(&len, rxBuf);и в сериал, и на экран выводятся нулевые значения.
А CAN модули одинаковые. Есть с разными кварцами.
Если закомментировать 26 строку:
CAN.readMsgBuf(&len, rxBuf);и в сериал, и на экран выводятся нулевые значения.
Тогда выкладывай библиотеку саму. И ещё - в настройках вывод компилятора настроен на вывод всех сообщений? Какие варнинги пишет при компиляции?
readMsgBuf() имеет смысл только при available() > 0
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;Не понял, поясни, пожалуйста
Ну CAN.checkReceive() конечно нужен. Но думаю там уже все буфера забиты.
А если температуру в Serial - что покажет?
И ноги I2C у NANO и MEGA разные
Ну CAN.checkReceive() конечно нужен. Но думаю там уже все буфера забиты.
А если температуру в Serial - что покажет?
При незакомментированной строке CAN.readMsgBuf(&len, rxBuf); в сериал ничего не выводится, на дисплее - снег.
Если закомментировать - в сериале и на дисплее - нули
И ноги I2C у NANO и MEGA разные
знаю
В сериале вообще ничего не может быть, а из буфера скорее всего мусор читается, так как проверки на наличие принятого пакета не производится.
Проверку на наличие поставить надо. Но с любом случае readMsgBuf только читает по SPI. Id все равно не совпадет. Должны быть нули.
Контакт по SPI... !!! Или модуль битый.
Разобрался. У меги CS - пин 53. А в скетче остался как у Нано - 10 (строка 09). Исправил на 53, все заработало. Спасибо всем откликнувшимся!
Разобрался. У меги CS - пин 53. А в скетче остался как у Нано - 10 (строка 09). Исправил на 53, все заработало. Спасибо всем откликнувшимся!
У Меги, равно как и у Нано, CS пин может быть любым.