Скетч, работающий на 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
Не понял, поясни, пожалуйста
Ну 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 пин может быть любым.