Общение 2-х Arduino по I2C в Proteus

Тема в разделе "Arduino & Shields", создана пользователем Роман Петровский, 5 фев 2019.

  1. Приветствую всех участников форума. Хочу поделиться следующей проблемой и по-возможности получить совет в её решении. Выполняя один проект, в котором две Ардуино общаются по шине i2c, столкнулся с глюками при симуляции в среде Proteus, а именно. Одна Ардуино выступает в роли мастера, другая в роли ведомого, так вот от мастера к ведомому проходят команды отлично и обрабатываются ведомым тоже отлично в событии onReceive(). Но когда пытаюсь запросить от ведомого несколько байт данных методом requestFrom(), то получаю какой-то бред. Причём даже стандартные примеры к библиотеке wire неправильно работают. Может кто сталкивался с подобной проблемой и смог её решить, подскажите... Проект очень сложный и искать другую среду для симуляции не вариант. Отлаживать в реальном железе очень тяжело, так как постоянно нужны поправки. Заранее благодарен!!!
     
  2. Asper Daffy

    Asper Daffy Иксперд

    Именно с I2C не сталкивался, но с рядом других вещей у меня странная вещь в протеусе - ардуина не работала, а микросхема ATmega328P работала отлично. Как такое может быть, если у них по идее одна слайс-модель - не спрашивайте, не знаю. Но факт такой был. Попробуйте Ваши дела на голой микросхеме, может прокатит.
     
    DetSimen нравится это.
  3. parovoZZ

    parovoZZ Гуру

    А придется. И лучше всего для этого использовать внутрисхемный отладчик, ну или ЛА. Всё остальное - это фуфел.
    а это что? Что-то абдуриновское? I2C сложен, да, но прекрасно выкуривается. Все необходимые апноуты лежат на микрочипе.
     
  4. Пробовал, к сожалению, не прокатило. Заметил несколько странностей: если в скетче мастера не писать Wire.begin(), то данные читаются с ведомого правильно, за исключением 1-го бита. В него всегда лезет число 255 при любых раскладах. Если же сделать всё по инструкции и инициализировать шину командой Wire.begin(), то при запросе байтов от ведомого получим вообще бред. Видимо всё-таки придётся отказаться от Протеуса. Честно говоря очень разочарован тем, что такой мощный симулятор лагает на такой ерунде, как i2c.
     
  5. Solari

    Solari Нерд

    Сталкивался с такой проблемой при работе с Wire .
    Все дело в том, что буффер передачи ограничен в данной библиотеке.
    Решением было переписать пару строк внутри.
    В частности в WIre.h - #define BUFFER_LENGTH 32 -> #define BUFFER_LENGTH 96
    В этой-же библиотеке внутри папки Utility внутри twi.h - #define TWI_BUFFER_LENGTH 32 - #define TWI_BUFFER_LENGTH 96.
    Так же расширил буффер в самой библиотеке I2C аналогичным образом.
    Надеюсь поможет, попробуй.
     
    arkadyf нравится это.
  6. Спасибо за совет, но дело не в буфере. Проблема наблюдается даже при передаче одного байта. Более-менее корректно отрабатывает tinkercad, не его минус в том, что нельзя добавлять свои библиотеки.