РЕШЕНО Не компилируется скетч для arduino due troykai2chub

Тема в разделе "Arduino & Shields", создана пользователем Bolcman, 23 янв 2021.

  1. Bolcman

    Bolcman Нуб

    Здравствуйте, столкнулся с проблемой.
    IDE отказывается компилировать стандартный скетч для модуля Troyka i2c Hub на Arduino Duo на базе ARM.
    Скетч из примера спокойно работает на Уно.
    Очень нужно завести на Дуо, помогите пожалуйста.
    Код (C++):
    // библиотека для работы с I²C хабом
    #include <TroykaI2CHub.h>

    // создаём объект для работы с хабом
    // адрес по умолчанию 0x70
    TroykaI2CHub splitter;

    // можно создавать несколько объектов с разными адресами
    // подробнее читайте на:
    // http://wiki.amperka.ru/продукты:troyka-i2c-hub

    void setup() {
      // открываем последовательный порт
      Serial.begin(115200);
      // ждём открытия порта
      while(!Serial) {
      }
      // печатаем сообщение об успешной инициализации Serial-порта
      Serial.println("Serial init OK");
      // начало работы с I²C хабом
      splitter.begin();
      Serial.println("Splitter init OK");
      // ждём одну секунду
      delay(1000);
    }

    void loop() {
      // счётчик цикла
      for (int i = 0; i < 8; i++) {
        // переключаем по очереди каналы
        splitter.setBusChannel(i);
        // выводим номер канала
        Serial.print("Set channel ");
        Serial.print(i);
        Serial.println(":");
        // запускаем I²C сканер
        startScanerI2C();
        // ждём одну секунду
        delay(1000);
      }
    }

    void startScanerI2C()
    {
      // переменная состояние ответа
      byte state;
      // переменная хранения текущего адреса
      byte address;
      // переменная для хранения количества найденых I²C устройств
      int countDevices = 0;
      // печатем о начале поиска
      Serial.println("Scanning...");
      // перебираем по очереди все адреса от 0 до 127
      for (address = 1; address < 127; address++ ) {
        // начинаем передачу данных по текущем адресу
        Wire.beginTransmission(address);
        // завершаем передачу данных
        state = Wire.endTransmission();
        // если пришедший байт равен нулю
        if (state == 0) {
          // на адресе есть устройство
          // печатаем об этом
          Serial.print("I2C device found at address 0x");
          // если адрес меньше 16, печатем ноль
          if (address < 16) {
            Serial.print("0");
          }
          // печатаем текущий адрес в 16 разрядной системе исчесления
          Serial.print(address, HEX);
          Serial.println("  !");
          // инкрементируем кол-во найденых устройств
          countDevices++;
        }    
      }
      // если не найдено ни одного I²C устройства
      // печатаем об этом
      if (countDevices == 0) {
        Serial.println("No I²C devices found");
      } else {
        // печатаем о завершении процесса
        Serial.println("Done");
      }
    }
     
    Выдает следующую ошибку:

    Код (C++):
    Compiling .pio\build\due\FrameworkArduino\USB\CDC.cpp.o
    Compiling .pio\build\due\FrameworkArduino\USB\PluggableUSB.cpp.o
    Compiling .pio\build\due\FrameworkArduino\USB\USBCore.cpp.o
    Compiling .pio\build\due\FrameworkArduino\WInterrupts.c.o
    *** [.pio\build\due\lib227\TroykaI2CHub\TroykaI2CHub.cpp.o] Error 1
    C:\Users\Pavel\.platformio\packages\framework-arduino-sam\cores\arduino\USB\USBCore.cpp: In function 'void USB_ISR()':
    C:\Users\Pavel\.platformio\packages\framework-arduino-sam\cores\arduino\USB\USBCore.cpp:688:21: warning: this 'else' clause does not guard... [-Wmisleading-indentatio
    n]
                         else
                         ^~~~
    C:\Users\Pavel\.platformio\packages\framework-arduino-sam\cores\arduino\USB\USBCore.cpp:690:9: note: ...this statement, but the latter is misleadingly indented as if
    it were guarded by the 'else'
             UDD_Send8(EP0, 0);
             ^~~~~~~~~
    ========================== [FAILED] Took 1.31 seconds ==========================
    Я так понимаю проблема скомпилировать этот файл библиотеки TroykaI2CHub.cpp

    Код (C++):
    #include "TroykaI2CHub.h"

    TroykaI2CHub::TroykaI2CHub(uint8_t i2cHubAddr) {
        _i2cHubAddr = i2cHubAddr;
    }

    TroykaI2CHub::~TroykaI2CHub() {
    }

    void TroykaI2CHub::begin() {
        Wire.begin();
        setBusChannel(DEFAULT_CHANNEL);
    }

    void TroykaI2CHub::setBusChannel(uint8_t channel) {
        if (channel >= COUNT_CHANNEL) {
            return false;
        }

        Wire.beginTransmission(_i2cHubAddr);
        Wire.write(channel | ENABLE_MASK);
        Wire.endTransmission();
    }
     
  2. ZAZ-965

    ZAZ-965 Гуру

  3. AlexU

    AlexU Гуру

    То, что Вы привели, к ошибке компилирования TroykaI2CHub.cpp не имеет ни какого отношения. Смотрите выше в выводе компиляции.
    Но на приведённое предупреждение тоже стоит обратить внимание.
     
  4. Bolcman

    Bolcman Нуб

    Вот это в обычном Arduino IDE выдает:
    Код (C++):
    In file included from C:\Users\Pavel\AppData\Local\Arduino15\packages\arduino\hardware\sam\1.6.12\cores\arduino/Arduino.h:44:0,
                     from C:\Users\Pavel\Documents\Arduino\libraries\TroykaI2CHub\src\TroykaI2CHub.h:14,
                     from C:\Users\Pavel\Documents\Arduino\libraries\TroykaI2CHub\src\TroykaI2CHub.cpp:11:
    C:\Users\Pavel\Documents\Arduino\libraries\TroykaI2CHub\src\TroykaI2CHub.cpp: In member function 'void TroykaI2CHub::setBusChannel(uint8_t)':
    C:\Users\Pavel\AppData\Local\Arduino15\packages\arduino\hardware\sam\1.6.12\cores\arduino/wiring_constants.h:34:15: error: return-statement with a value, in function returning 'void' [-fpermissive]
    #define false 0x0
                   ^
    C:\Users\Pavel\Documents\Arduino\libraries\TroykaI2CHub\src\TroykaI2CHub.cpp:27:16: note: in expansion of macro 'false'
             return false;
                    ^
    exit status 1
    Ошибка компиляции для платы Arduino Due (Programming Port).
     
     
  5. ZAZ-965

    ZAZ-965 Гуру

    Хм... слона я не заметил. Попробуйте исправить тип возвращаемого значения в setBusChannel в TroykaI2CHub.cpp
    Код (C++):
    bool TroykaI2CHub::setBusChannel(uint8_t channel) {
        if (channel >= COUNT_CHANNEL) {
            return false;
        }

        Wire.beginTransmission(_i2cHubAddr);
        Wire.write(channel | ENABLE_MASK);
        Wire.endTransmission();
        return true;
    }
    и в TroykaI2CHub.h
    Код (C++):
        bool setBusChannel(uint8_t channel);
     
    Bolcman нравится это.
  6. Bolcman

    Bolcman Нуб

    Отлично!
    Теперь это работает, спасибо огромное!