ошибка компиляции проекта из нескольких файлов.
- Войдите на сайт для отправки комментариев
Чт, 21/04/2022 - 15:58
Добрый день,
столкнулся, хотя уже и не первый раз, с тем, что если код разбит на несколько файлов - компилит не правильно и не работает.
сливаю все в один файл - все ок, все работает.
есть идею как все-таки заставить компилить единообразно правильно и то и то?
спасибо
У меня такой проблемы нет, в любом моем проекте много файлов - это просто для удобства (чтобы не листать простыню "километровую"). А если так, значит именно ты что-то делаешь "не то" или "не так".
Покажи код и как ты его "разбиваешь".
Вот код по файлам. в некоторый момент lcd перестает выводить на экран, при этом в сериал все выводится, т.е. код дальше исполняется.
//головной #include "config.h" #include "sensor.h" #include "traverse.h" SensorClass sensLimit1(LIMIT1_PIN); #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x27, 16, 2); TraverseClass tr(TR_SPR, TR_DIRECTION_PIN, TR_STEP_PIN); // the setup function runs once when you press reset or power the board void setup() { uint8_t profileName; Serial.begin(115200); lcd.begin(); lcd.backlight(); lcd.print(F("Rewinder apr2022")); delay(2000); tr.init(); tr.calibrate(); Serial.println(F("All done in setup")); } // the loop function runs over and over again until power down or reset void loop() { } //config.h #ifndef _CONFIG_h #define _CONFIG_h #if defined(ARDUINO) && ARDUINO >= 100 #include "arduino.h" #else #include "WProgram.h" #endif //sensors #define LIMIT1_PIN A1 //stepper #define TR_DIRECTION_PIN 5 #define TR_STEP_PIN 6 #define TR_SPR 200 #define GS_NO_ACCEL #endif // sensor.h #ifndef _SENSOR_h #define _SENSOR_h #if defined(ARDUINO) && ARDUINO >= 100 #include "arduino.h" #else #include "WProgram.h" #endif class SensorClass { public: SensorClass(uint8_t pin); boolean get(); uint8_t getPin(); private: uint8_t _pin; void init(uint8_t pin); }; #endif //sensor.cpp #include "sensor.h" SensorClass::SensorClass(uint8_t pin) { init(pin); } void SensorClass::init(uint8_t pin) { _pin = pin; pinMode(_pin, INPUT_PULLUP); } boolean SensorClass::get() { return !digitalRead(_pin); } uint8_t SensorClass::getPin() { return _pin; } // traverse.h #ifndef _TRAVERSE_h #define _TRAVERSE_h #if defined(ARDUINO) && ARDUINO >= 100 #include "arduino.h" #else #include "WProgram.h" #endif #include <GyverStepper2.h> const int8_t _trLeft = -1; const int8_t _trRight = 1; const uint8_t _trMicroStep[] = { 1, 2, 4, 8, 16, 32 }; class TraverseClass : public GStepper2<STEPPER2WIRE> { public: TraverseClass(uint16_t steps, uint8_t pin1 = 255, uint8_t pin2 = 255, uint8_t pin3 = 255, uint8_t pin4 = 255, uint8_t pin5 = 255) : GStepper2(steps, pin1 = 255, pin2 = 255, pin3 = 255, pin4 = 255, pin5 = 255) {} void init(); boolean calibrate(); void setCalibrated(boolean flag); boolean getCalibrated(); boolean _calibrated = false; //Traverse int16_t _trSetMaxSpeed; boolean _trSetDirection; uint8_t _trSetMSMode; uint16_t _trSetStepLength; uint16_t _trSetSPR; int32_t _trMaxSpeedMS; uint16_t _trStepLengthMS; //Spools uint16_t _spoolSetStartPosition; uint16_t _spoolSetEndPosition; uint16_t _spoolSetSpoolWidth; uint8_t _spoolSetNumberOfSpools; uint8_t _currentSpool; uint16_t _spoolSetStartPositionMS; uint16_t _spoolSetEndPositionMS; uint16_t _spoolSetSpoolWidthMS; }; #endif //traverse.cpp #include "traverse.h" #include <LiquidCrystal_I2C.h> class LiquidCrystal_I2C; extern LiquidCrystal_I2C lcd; #include "sensor.h" class SensorClass; extern SensorClass sensLimit1; void TraverseClass::init() { //Traverse _trSetMaxSpeed = 800; _trSetDirection = false; _trSetMSMode = 2; _trSetStepLength = 400; _trSetSPR = 200; _trMaxSpeedMS = _trSetMaxSpeed * _trMicroStep[_trSetMSMode]; _trStepLengthMS = _trSetStepLength / _trMicroStep[_trSetMSMode]; reverse(_trSetDirection); setMaxSpeed(_trMaxSpeedMS); setAcceleration(_trMaxSpeedMS); //Spools _spoolSetStartPosition = 500; _spoolSetEndPosition = 1000; _spoolSetSpoolWidth = 1050; _spoolSetNumberOfSpools = 3; _currentSpool = 0; _spoolSetStartPositionMS = _trMicroStep[_trSetMSMode] * _spoolSetStartPosition; _spoolSetEndPositionMS = _trMicroStep[_trSetMSMode] * _spoolSetEndPosition; _spoolSetSpoolWidthMS = _trMicroStep[_trSetMSMode] * _spoolSetSpoolWidth; } boolean TraverseClass::calibrate() { lcd.home(); lcd.print(F("Moving to 0 pos.")); lcd.setCursor(0, 1); lcd.print(F("Please wait... ")); Serial.println(F("Moving to 0 pos....")); //delay(2000); //just to see printed on lcd setSpeed(_trMaxSpeedMS); dir = _trLeft; do { tick(); } while (!sensLimit1.get()); brake(); reset(); lcd.home(); lcd.print(F("Moving 2 the end")); lcd.setCursor(0, 1); lcd.print(F("Please wait... ")); Serial.println(F("Moving to 2nd pos....")); dir = _trRight; setTarget(_spoolSetEndPositionMS); do { tick(); } while (!ready()); lcd.home(); //THIS CODE DOESN'T WORK!!! lcd.print(F("Done ")); //THIS CODE DOESN'T WORK!!! lcd.setCursor(0, 1); //THIS CODE DOESN'T WORK!!! lcd.print(F(" ")); //THIS CODE DOESN'T WORK!!! Serial.println(F("done in method")); setCalibrated(true); return true; } void TraverseClass::setCalibrated(boolean flag) { _calibrated = flag; } boolean TraverseClass::getCalibrated() { return _calibrated; } //TraverseClass Traverse;не все
LiquidCrystal_I2C.hодинаковыСейчас лень разбираться (устал, очки уже нос натирают), но заметил множественное подключение одних и тех же библиотек. Я думаю тебе нужно пересмотреть логику.
Смотри, деректика #include это как «вставка». То есть все то, что находится в файле после детективы #include «имя файла» будет подставлено именно в это самое место. Если это знать и понимать, то разбивать на файлы код не сложно. Попробуй ещё раз имея эти знания.