Wire (I2C) и передача более 1 байта.

UtaN
Offline
Зарегистрирован: 23.08.2018

Привет, уважаемые форумчане!

Есть необходимость получать на Arduion Uno (слейв) данные от Arduino Mega 2560 (мастер) без фидбека, но с последующим использованием полученной информации на Uno. Проект сложный, куча шаговых двигателей, коллекторных двигаетелей, экран, sd-карта (считывание) и прочее, прочее. Поэтому любые "левые" ф-ции и операции могут сильно влиять на скорость работы устройства и это не хорошо.

Мастер передает числовые значения на слейв, который управляет колекторным двигателем. Числовые значения передаются через I2C и проблема в том, что я не могу принять на слейве числа больше 255 (то есть 1 байт), а мне нужно получать числа намного больше, чем 255, а именно 10-30к, чтобы указывать конкретное число отсечек на коллекторном двигателе.

Внимание! Вопрос: возможно ли организовать передачу больших чисел без танцев с бубном, сдвигом битов и т.д.? Если нет, то какой алгоритм формирования числа на мастере и прием его на слейве будет максимально лоялен к ресурсам?

Заранее спасибо :)

Всем добра!

Efim
Offline
Зарегистрирован: 04.05.2018

Передавайте больше байт, в чем проблема.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Пиздец. Мы пишем охеренно сложный проект, при этом не знаем, как передать НЕСКОЛЬКО байт по I2C, используя уже любезно написанную обёртку, входящую в комплект поставки Arduino IDE. Ещё мы не знаем, как получить несколько байт. Ну и верхом незнания будет тот факт, как превратить несколько байт в переменную разрядностью в несколько байт.

Вот тут читал? https://www.arduino.cc/en/Reference/Wire

Видел там методы write и read? 

Какие проблемы - вычитать несколько байт, переданных мастером?

uint16_t fuckingNumber;

uint8_t* writePtr = (uint8_t*)&fuckingNumber;

*writePtr++ = Wire.read();
*writePtr = Wire.read();

Название переменной fuckingNumber - обязательно, без такого названия - работать не будет, предупреждаю! 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

DIYMan пишет:

Пиздец. Мы пишем охеренно сложный проект, при этом не знаем, как передать НЕСКОЛЬКО байт по I2C, используя уже любезно написанную обёртку, входящую в комплект поставки Arduino IDE.  

чо ты хочешь, очередная образованщина.  чо мы будем читать и примеры смотреть мы сюда придем, нас научют. 

UtaN
Offline
Зарегистрирован: 23.08.2018

Очень любезно с Вашей стороны указать мне на мое незнание, спасибо. Но как я уже писал, любые дополнительные рассчеты (даже инкремент переменной на стороне слейва) сильно тормозят работу всего проекта (вот так бывает), так как мастер будет ждать окончания манипуляций на слейве. Я прекрасно понимаю то, как нужно работать со сложением более 1-го байта, но суть вопроса, возможно, я описал неверно. 

*fuckingNumber обязателен? Это зарезервированное имя библиотеки Wire? Учту, спасибо.

UtaN
Offline
Зарегистрирован: 23.08.2018

какой алгоритм формирования числа на мастере и прием его на слейве будет максимально лоялен к ресурсам?

Я не пришел сюда, чтобы получить конкретику о том "Как сформировать переменную из нескольких байт", а затем, чтобы мне посоветовали максимально лояльный алгоритм составления итогового числа. 

sadman41
Offline
Зарегистрирован: 19.10.2016

Так, как в вашем МК нет буфера/выделенного контроллера для I2C, то любые операции с этой шиной будут тормозить основной ход программы. Можно выдумывать всякие алгоритмы, которые бы передавали по байту в то время, когда у МК свободная минутка выдалась, но решит ли это проблему гарантированно... Наврядли.

b707
Offline
Зарегистрирован: 26.05.2017

UtaN пишет:

Я не пришел сюда, чтобы получить конкретику о том "Как сформировать переменную из нескольких байт", а затем, чтобы мне посоветовали максимально лояльный алгоритм составления итогового числа. 

Ваша проблема именно в том, что вы не понимаете, что  "Как сформировать переменную из нескольких байт" - это и есть "алгоритм составления итогового числа"

DIY_man написал один из самых быстрых из возможных вариантов.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

UtaN пишет:

какой алгоритм формирования числа на мастере и прием его на слейве будет максимально лоялен к ресурсам?

Я не пришел сюда, чтобы получить конкретику о том "Как сформировать переменную из нескольких байт", а затем, чтобы мне посоветовали максимально лояльный алгоритм составления итогового числа. 

Осталось дело за малым - сформулировать критерий лояльности. Без этого обсуждать нечего.

Bront
Offline
Зарегистрирован: 05.04.2016

Реализация фиговая, раз зависает от инкремента.

По существу. стандартная i2c библиотека передает/принимает блоками? а что есть числа 10-30к? максимум два байта.

по указателю переменной, соответсвующего типа,забрал эти два байта и переслал. принял и так же по указателю разместил.

или я что-то путаю?