i2C надежность
- Войдите на сайт для отправки комментариев
Ср, 29/01/2020 - 12:48
Работает ненадежно... проверьте пожалуйста программную часть. Нужно ли настраивать порты для передачи?
//ПЕРЕДАЮЩЕЕ устройство - ардуино Нано //в Setup() Wire.begin(); // тут нет же адресов? Wire.setClock(10000); // нужно ли ?? ...длина кабеля 20 см // фрагмент кода { Wire.beginTransmission(20); // Wire.write(data1); // одиночный байт по нажатию кнопки Wire.endTransmission(); delay(10); // нужно ли и сколько? Wire.beginTransmission(21); // Wire.write(data1); // отправляем тот же байт на 2-е уст. Wire.endTransmission(); } ПРИЕМНЫЕ уст -ва - тоже Ардуино Нано в setupe Wire.begin(20); // для 2- го будет 21 Wire.onReceive(receiveEvent); в коде void receiveEvent(int howMany) { // тут прерывание по приходу данных while (Wire.available()) { b = Wire.read(); }
однонаправленная передача. Приемное устройство ждет в цикле, т.к. особых задач там больше нет.
Wire.setClock(10000); ноликом ашыбся
ну и проверять надо,
Провода в другую комнату тянутся, да?
да, кста, rkit прав, i2c - внутриcхемная шина, далеко на ей не отправишь
Благодарствую))) Я все счас попробую.
Длина кабеля упомянута в коде - 20 см.
Инет пишет про "внешние подтягивающие резисторы". Я понимаю, что протокол на "монтажном" основан.. Но библа разве не включает там внутренную подтяжку? Короче - надо или нет резюки?
Далее. У меня отличная передача по одному любому приемнику. Но когда ОБА... косяки... Может быть 10 мс не хватает, чтоб первое устройство приняло и освободило шины?
Смысл разнести коды 20 и, скажем, 119 есть?
Инет пишет про "внешние подтягивающие резисторы". Я понимаю, что протокол на "монтажном" основан.. Но библа разве не включает там внутренную подтяжку? Короче - надо или нет резюки?
Обязательно
Чем объяснить, что без резисторов по одной паре устройств все работает? Не является ли требование к наличию резисторов только в случае подключения иных периферийных устройств, а не МК?
Почему в случае ведомого устройства, а именно микроконтроллера, нельзя настроить порты SDA SLA как "входные" и поддтянуть их программно на приемнике? Что, имхо, и могло быть сделано в библе WIRE..
Ведь, если мы читаем, скажем, 2-3 кнопки на входа МК, нам не нужны внешние резюки, т.к. мы подтягиваем программно. И здесь, аналогично, просто "просаживает" ноль на шине мастер-устройство, а не человек.
И пожалуйста подскажите что за "нолик" который я ошибся? Спасибо большое.
И пожалуйста подскажите что за "нолик" который я ошибся? Спасибо большое.
если у тебя нужный "some processor", то нет, не ошибся.
https://www.arduino.cc/en/Reference/WireSetClock
Что по внешним резисторам? Я правильно понимаю, что "делай, как тебе велят". Я не против, мне важнее результат, а не теория.
Но если, и у вас сомнения, и нет возможности уточнять, скажите тут, и я буду продолжать разбираться в вопросе сам или как-то иначе. У меня с внешними резисторами вообще ничего не работает. Даже с одной парой устройств. Я это уже проходил с год назад тут.
Что по внешним резисторам? Я правильно понимаю, что "делай, как тебе велят". Я не против, мне важнее результат, а не теория.
я "делаю как велят" - ставлю 10К с SDA и SCL на VCC - и у меня работают по 2-3 устройства на шине
потому что для того, чтобы приемник мог отвечать передатчику, шина должна работать не только на вход, но и на выход...
я ставлю 4.7 К, если больше 2х устройств. Поэтому, делай как велят, даже если Wire и включает подтяжку унутре, в чем я глубоко сомневаюсь, то очень уж она слабенькая.
и у меня работают по 2-3 устройства на шине
Итак, именно несколько МК? Или, я что-то непонимаю, и не важно: что там слейвом - скажем, индикатор (ведь у него тоже контроллер все принимает) или... именно вторая Арудино?
2) Время конечно 10 мс между посылами РАЗНЫМ устройствам достаточно?
2) Время конечно 10 мс между посылами РАЗНЫМ устройствам достаточно?
на этот вопрос нет и не может быть ознозначного ответа. В библиотеке, думаю, должна быть функция или флаг. позволяющая проверить, свободна ли шина
я ставлю 4.7 К, если больше 2х устройств.
Я хочу прочитать "не устройств", а именно "арудино". Отличия в том, что теоретически можно написать неверный код на приемнике, который будет, скажем, не только читать, но и посылать запросы. Т.е. приемник, может САМ просаживать линию, и мещать передаче второму приемнику. В этом отличие от простого "индикатора", скажем..
[...свободна ли шина
понятно))) Спасибо. Уповаю, на то, что передается 1 байт за 2-3 сек (время человеческого нажатия кнопки) и приемник в это время ничего не делает, а только лупится. Что может "завесить" шину? Наводки?
Я хочу прочитать "не устройств", а именно "арудино". Отличия в том, что теоретически можно написать неверный код на приемнике, который будет, скажем, не только читать, но и посылать запросы. Т.е. приемник, может САМ просаживать линию, и мещать передаче второму приемнику. В этом отличие от простого "индикатора", скажем..
вы не замечаете логического противоречия в своих словах? Конечно, можно написать такой код, который все испортит. Только как это связано с выбором резистора? Или вы полагаете, что правильный выбор резистора исправит кривой код в приемнике? :)))
Конечно, я прошу в совокупности оценить где у меня косяк - софтово или аппаратно. Только гуру могут комплексно оценивать проблему. Я к ним не принадлежу, особенно, что wire почти не знаю. Мне срочно (как всегда(() нужен результат, а не теория. Прошу помощи.
Основные функции кода я выложил. Они верные? Иначе бы мне сказали?
Основные функции кода я выложил. Они верные?
сорри, я их даже не читал
И дело, ведь, не просто в "коде", а в алгоритме библиотек. Это вообще темнота... Скажем, есть режим "запроса ведомого к мастеру". Понятно, что это функция, и я ее не включаю. Но работа на линии ТРЕХ ардуин, с ДВУМЯ библами, и неопытного юзера, имхо, требует все же более тщательного анализа. Или нет?
не успел дописать, вы ответили, пишу снова.
onReceiveEvent - это что, прерывание? А вызывающая функция знает, что у него есть параметр? И еще - как обьявлено b ? - если это прерывание, не забывайте volatile
Вообще, если приемник "в основном ничего не делает", я бы начал с обычного опроса while available() в лупе, без всяких колбеков
onReceiveEvent - не отношу к прерываниям, но по приходу нужно "фронта"/команды и идентификации адреса, она ... должна вызываться. А она вообще не срабатывает. И пока неважно тип переменной b.
Что за параметр HowMany - для меня загадка)
Проблемы начались после того как успешно работала одна пара ардуин (мастер и слейв1), а я повесил еще один слейв2. Давайте, смотреть в корень проблемы. Что могло измениться? Кроме, что было 20, а стало еще и 21.
причем, 20 принимает, а 21 нет. Если отпаять 20, то принимает 21.
и нет резисторов!
аппаратная реализация I2C не включает подтяжку, так как при нескольких устройствах подтяжка окажется включена параллельно и может привести к недопустимо низкому значению, как следствие - к большому току и сгоревшему пину. ;)
Внешняя подтяжка в 10К и в 4К7 - смотрятся нормально. все, что выше 1К - уже подходит. Чем длиннее линия - тем больше её ёмкость, следовательно для сохранения формы импульсов нужно уменьшать сопротивление подтяжки.
В условиях ТС от 1К 10К - должны нормально работать. 4К7 - выглядит разумным компромисом.
onReceiveEvent - не отношу к прерываниям, но по приходу нужно "фронта"/команды и идентификации адреса, она ... должна вызываться. А она вообще не срабатывает. И пока неважно тип переменной b.
Что за параметр HowMany - для меня загадка)
простите, а вы код закрыв глаза набрасываете? Что мешает открыть библиотеку и посмотреть, как вызывается ReceiveEvent. есть ли у него параметры и для чего они? какой смысл тогда обсуждать что-то дальше, если вы не понимаете даже своего кода?
причем, 20 принимает, а 21 нет. Если отпаять 20, то принимает 21.
разнеси адреса подальше, чем на 1. Мошт одна у тебя пишет, а вторая читает
аппаратная реализация I2C не включает подтяжку, так как при нескольких устройствах подтяжка окажется включена параллельно и может привести к недопустимо низкому значению, как следствие - к большому току и сгоревшему пину. ;)
Да, это логично. Т.е. это снятие рисков неизвестного заранее количества устройств. Опишу не претендуя на профессионализм с чем я столкнулся когда макетировал внешние резисторы на шине с 2-3 МК.
"Входные порты" МК, имеют свои внутренние резисторы, входное сопротивление ... Они могут подтягиваться программно. Далее, имеется и остаточное сопротивление открытого порта на землю. В итоге, у меня логический уровень единицы мог быть и 1,5 в, и 2,0 вольта... Образовывалось много "делителей напряжения" от всех этих резюков, и потенциал изменялся... короче было взаимовлияние на потенциал. Если бы были "кнопки" с нулевым сопротивлением, а тут реальные МК...
"Входные порты" МК, имеют свои внутренние резисторы, входное сопротивление ... Они могут подтягиваться программно. Далее, имеется и остаточное сопротивление открытого порта на землю. В итоге, у меня логический уровень единицы мог быть и 1,5 в, и 2,0 вольта...
И тут, как и в коде - какое-то гадание на кофейной гуще...
Откройте любое описание шины I2C и увидите подтягивающие резисторы. Поставьте их безусловно, поскольку встроенные подтяжки не гарантируют почти ничего. А вот после этого уже можно и вопросы задавать, если они останутся.
Судя по всему, ТС "некогда разбираться, надо срочно", вот он и ждет, что кто-то вдруг даст ему волшебниый совет, который сразу решит все проблемы
dim3740 - никто за вас вашу задачу не решит. Делайте все последовательно, вдумчиво, без спешки. Поставьте требующиеся по прописи резисторы. Разберитесь с функциями библиотеки, с которыми вы пытаетесь работать.
А провода случаем не силовые, срезанные со старого обогревателя? И не на макетке беспаечной какой?
dim3740 - никто за вас вашу задачу не решит. Делайте все последовательно, вдумчиво, без спешки.
Что же... типовой "воспитательный" совет, когда уже больше не о чем говорить.... Я такой своей внучке тоже часто говорю))))
Что же... типовой "воспитательный" совет, когда уже больше не о чем говорить.... Я такой своей внучке тоже часто говорю))))
и разве не помогает? :)
На самом деле, о чем тут говорить, ваша схема у вас в руках, а не у нас... не вижу толку теоретизировать.
Да, это логично. Т.е. это снятие рисков неизвестного заранее количества устройств. Опишу не претендуя на профессионализм с чем я столкнулся когда макетировал внешние резисторы на шине с 2-3 МК.
"Входные порты" МК, имеют свои внутренние резисторы, входное сопротивление ... Они могут подтягиваться программно. Далее, имеется и остаточное сопротивление открытого порта на землю. В итоге, у меня логический уровень единицы мог быть и 1,5 в, и 2,0 вольта... Образовывалось много "делителей напряжения" от всех этих резюков, и потенциал изменялся... короче было взаимовлияние на потенциал. Если бы были "кнопки" с нулевым сопротивлением, а тут реальные МК...
Из описания неясно, вы к каждому устройству свою подтяжку лепили? Если да, то это бред.
С внутренними, теоретически включенными, резисторами МК, которые >20кОм и подтяжкой 4к7, у вас получится минимум ~2к7, что для шины вполне допустимо. Ищите косяки в монтаже. ИМХО.
Из описания неясно, вы к каждому устройству свою подтяжку лепили?
Ой! А я ответ от ТС не прочел! Какая прелесть!!!
Если это так, то ТС, дорогой! Пока дом не поджег - купи парусник для склейки. Я - пробовал - очень успокаивает и безопасно!
У тебя на фото синт вроде хороший? Разучи что-то сложное, типа Бранденбургского концерта. Без обид.