Замените библиотеку проводов на TinyWireM (сделайте библиотеку ATtiny совместимой)

[Я задал этот вопрос на Arduino Stack Exchange и немного подождал. и не получил ответа, поэтому я подумал, что спрошу здесь!]

Я хочу интегрировать датчик Pololu vl53l0x Time of Flight в свой проект. Они создали библиотеку для взаимодействия с vl53l0x через I2C, которая отлично работает на моем Uno. Единственная проблема в том, что Wire.h не работает на ATtiny85.

TinyWireM — это библиотека для замены Wire, которая, по моему мнению, будет совместима. У меня такой вопрос: как я могу заменить Wire на TinyWireM? Это так же просто, как заменить все экземпляры Wire на TinyWireM? Есть ли что-нибудь еще, что мне нужно сделать, чтобы сделать библиотеку ATtiny85 совместимой?

Я попытался просто переопределить «Wire» как TinyWireM, как показано ниже:

#include "TinyWireM.h"
#define Wire   TinyWireM

Все компилируется и загружается на мой ATtiny85 просто отлично. Тем не менее, датчик довольно стабильно выдает значение около 7600 мм.

Спасибо!


person Alex Wulff    schedule 27.01.2017    source источник
comment
почему не работает tinywirem, периферия не на чипе, неправильные имена регистров?   -  person Grady Player    schedule 27.01.2017
comment
@GradyPlayer, ты имеешь в виду, почему Wire не работает?   -  person Alex Wulff    schedule 27.01.2017
comment
да почему не работает?   -  person Grady Player    schedule 27.01.2017
comment
@AlexWulff, вы можете проверить, работает ли связь? Я имею в виду прикрепить осциллограф и увидеть реальную связь. В любом случае, 7600 мм - это немного странно, так как датчик должен сообщать не более 2 м ... Однако документация ИС довольно неясна, поэтому ее исправление может быть затруднено ...   -  person frarugi87    schedule 27.01.2017
comment
@GradyPlayer Я получаю такие ошибки, как необъявленное «TWS4», необъявленное «TWIE», необъявленное «TWEN» и тому подобное.   -  person Alex Wulff    schedule 27.01.2017
comment
@ frarugi87 I2C выглядит так, как будто он работает. Я подключил O Scope к SCL и получил довольно стабильную прямоугольную волну (что, я думаю, звучит правильно). Кроме того, SDA показывает беспорядочную последовательность прямоугольных сигналов, что, я думаю, указывает на то, что данные передаются.   -  person Alex Wulff    schedule 28.01.2017
comment
@AlexWulff Библиотека TinyWireM не выводит ошибок, верно? в любом случае вы пытались декодировать связь I2C? По крайней мере, 16-битное возвращаемое значение...   -  person frarugi87    schedule 28.01.2017


Ответы (1)


Библиотека проводов не работает на ATTiny, потому что она имеет только USI (универсальный последовательный интерфейс), аппаратное обеспечение которого отличается от Arduino Uno. Библиотека TinyWireM показывает почти то же поведение, что и библиотека Wire в Uno, но это не та же библиотека, перенесенная на ATTiny. Я не совсем понимаю, почему вы хотите переименовать библиотеку TinyWireM в Wire. Если вы просто хотите сделать вид, что это действительно библиотека Wire, это может быть не очень хорошей практикой кодирования, так как это несколько скрывает в вашем коде тот факт, что вы используете не библиотеку Wire, а другую библиотеку. Если вы хотите создать код, который можно использовать повторно как в Uno, так и в ATTiny, я бы посоветовал использовать комбинацию директив #define и #ifdef, #ifndef и #endif, чтобы в зависимости от определенного флага компилировался только соответствующий код. Насколько я знаю, ArduinoIDE также использует их для включения правильных файлов заголовков для каждой цели. Если вы можете найти соответствующее определение в файлах заголовков, вы можете использовать это. Но проще использовать собственное определение в начале файла.

В качестве подсказки: если вы когда-либо пытаетесь установить мультимастерную связь через I2C с TinyWireM (что отлично работает для меня), вы должны освободить шину после вашей передачи, чтобы другой мастер мог ее использовать. Я сделал это, отключив аппаратное обеспечение USI с помощью USICR&= 0b11001111; pinMode(0,INPUT); pinMode(2,INPUT);. Библиотека не сделает этого за вас. (Если вы этого не сделаете, шина останется занятой, и никакой другой мастер не сможет взаимодействовать). должен #include <USI_TWI_Master.h>

person chrisl    schedule 16.03.2017
comment
Я попробую это в ближайшее время - спасибо. Однако проблема, с которой я сталкиваюсь, заключается просто в том, что библиотека TinyWireM не может правильно взаимодействовать с устройством. Я попробую настроить регистры, как вы предложили. - person Alex Wulff; 20.03.2017
comment
У вас есть прогресс в вашей проблеме? Может быть, если у вас есть запасная ардуино, вы можете проверить, какие данные на самом деле отправляются на датчик. - person chrisl; 02.04.2017
comment
Я все еще работаю над этим, но я все еще не добился никакого успеха. С Uno все работает отлично, что странно. Тем не менее, я собираюсь продолжить расследование, поэтому спасибо за ваш ответ. - person Alex Wulff; 04.04.2017