i2C надежность

dim3740
dim3740 аватар
Offline
Зарегистрирован: 25.03.2015

Работает ненадежно... проверьте пожалуйста программную часть. Нужно ли настраивать порты для передачи?

//ПЕРЕДАЮЩЕЕ устройство - ардуино Нано
//в 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();
  }

однонаправленная передача. Приемное устройство ждет в цикле, т.к. особых задач там больше нет. 


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

Wire.setClock(10000);  ноликом ашыбся

ну и проверять надо, 

if (Wire.endTransmission()>0) error();

 

rkit
Offline
Зарегистрирован: 23.11.2016

Провода в другую комнату тянутся, да?

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

да, кста, rkit прав, i2c - внутриcхемная шина, далеко на ей не отправишь

dim3740
dim3740 аватар
Offline
Зарегистрирован: 25.03.2015

Благодарствую))) Я все счас попробую.

Длина кабеля упомянута в коде - 20 см.  

Инет пишет про "внешние подтягивающие резисторы". Я понимаю, что протокол на "монтажном" основан.. Но библа разве не включает там внутренную подтяжку? Короче - надо или нет резюки?

Далее. У меня отличная передача по одному любому приемнику. Но когда ОБА... косяки... Может быть 10 мс не хватает, чтоб первое устройство приняло и освободило шины? 

Смысл разнести коды 20 и, скажем, 119 есть? 

 

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

dim3740 пишет:

Инет пишет про "внешние подтягивающие резисторы". Я понимаю, что протокол на "монтажном" основан.. Но библа разве не включает там внутренную подтяжку? Короче - надо или нет резюки?

Обязательно

dim3740
dim3740 аватар
Offline
Зарегистрирован: 25.03.2015

Чем объяснить, что без резисторов по одной паре устройств все работает? Не является ли требование к наличию резисторов только в случае подключения иных периферийных устройств, а не МК?

Почему в случае ведомого устройства, а именно микроконтроллера, нельзя настроить порты SDA SLA  как "входные" и поддтянуть их программно на приемнике? Что, имхо, и могло быть сделано в библе WIRE..

Ведь, если мы читаем, скажем, 2-3 кнопки на входа МК, нам не нужны внешние резюки, т.к. мы подтягиваем программно. И здесь, аналогично, просто "просаживает" ноль на шине мастер-устройство, а не человек.

И пожалуйста подскажите что за "нолик" который я ошибся? Спасибо большое.

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

dim3740 пишет:

И пожалуйста подскажите что за "нолик" который я ошибся? Спасибо большое.

если у тебя нужный "some processor", то нет, не ошибся. 

https://www.arduino.cc/en/Reference/WireSetClock

dim3740
dim3740 аватар
Offline
Зарегистрирован: 25.03.2015

Что по внешним резисторам? Я правильно понимаю, что "делай, как тебе велят". Я не против, мне важнее результат, а не теория.

Но если, и у вас сомнения, и нет возможности уточнять, скажите тут, и я буду продолжать разбираться в вопросе сам или как-то иначе. У меня с внешними резисторами вообще ничего не работает. Даже с одной парой устройств. Я это уже проходил с год назад тут.

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

dim3740 пишет:

Что по внешним резисторам? Я правильно понимаю, что "делай, как тебе велят". Я не против, мне важнее результат, а не теория.

я "делаю как велят" -  ставлю 10К с SDA и SCL на VCC - и у меня работают по 2-3 устройства на шине

Цитата:
Почему в случае ведомого устройства, а именно микроконтроллера, нельзя настроить порты SDA SLA  как "входные" и поддтянуть их программно на приемнике?

потому что для того, чтобы приемник мог отвечать передатчику, шина должна работать не только на вход, но и на выход...

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

я ставлю 4.7 К, если больше 2х устройств.  Поэтому, делай как велят, даже если Wire и включает подтяжку унутре, в чем я глубоко сомневаюсь, то очень уж она слабенькая. 

dim3740
dim3740 аватар
Offline
Зарегистрирован: 25.03.2015

b707 пишет:

и у меня работают по 2-3 устройства на шине

Итак, именно несколько МК? Или, я что-то непонимаю, и не важно: что там слейвом - скажем, индикатор (ведь у него тоже контроллер все принимает) или... именно вторая Арудино?

2) Время конечно 10 мс между посылами РАЗНЫМ устройствам достаточно?

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

dim3740 пишет:

2) Время конечно 10 мс между посылами РАЗНЫМ устройствам достаточно?

на этот вопрос нет и не может быть ознозначного ответа. В библиотеке, думаю, должна быть функция или флаг. позволяющая проверить, свободна ли шина

dim3740
dim3740 аватар
Offline
Зарегистрирован: 25.03.2015

DetSimen пишет:

я ставлю 4.7 К, если больше 2х устройств.  

Я хочу прочитать "не устройств", а именно "арудино". Отличия в том, что теоретически можно написать неверный код на приемнике, который будет, скажем, не только читать, но и посылать запросы. Т.е. приемник, может САМ просаживать линию, и мещать передаче второму приемнику. В этом отличие от простого "индикатора", скажем..

dim3740
dim3740 аватар
Offline
Зарегистрирован: 25.03.2015

b707 пишет:

[...свободна ли шина

понятно))) Спасибо. Уповаю, на то, что передается 1 байт за 2-3 сек (время человеческого нажатия кнопки) и приемник в это время ничего не делает, а только лупится. Что может "завесить" шину? Наводки?

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

dim3740 пишет:

Я хочу прочитать "не устройств", а именно "арудино". Отличия в том, что теоретически можно написать неверный код на приемнике, который будет, скажем, не только читать, но и посылать запросы. Т.е. приемник, может САМ просаживать линию, и мещать передаче второму приемнику. В этом отличие от простого "индикатора", скажем..

вы не замечаете логического противоречия в своих словах? Конечно, можно написать такой код, который все испортит. Только как это связано с выбором резистора? Или вы полагаете, что правильный выбор резистора исправит кривой код в приемнике? :)))

dim3740
dim3740 аватар
Offline
Зарегистрирован: 25.03.2015

Конечно, я прошу в совокупности оценить где у меня косяк - софтово или аппаратно. Только гуру могут комплексно оценивать проблему. Я к ним не принадлежу, особенно, что wire почти не знаю. Мне срочно (как всегда(()  нужен результат, а не теория. Прошу помощи.

Основные функции кода я выложил. Они верные? Иначе бы мне сказали? 

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

dim3740 пишет:

Основные функции кода я выложил. Они верные?

сорри, я их даже не читал

dim3740
dim3740 аватар
Offline
Зарегистрирован: 25.03.2015

И дело, ведь, не просто в "коде", а в алгоритме библиотек. Это вообще темнота... Скажем, есть режим "запроса ведомого к мастеру". Понятно, что это функция, и я ее не включаю. Но работа на линии ТРЕХ ардуин, с ДВУМЯ библами, и неопытного юзера, имхо, требует все же более тщательного анализа. Или нет? 

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

не успел дописать, вы ответили, пишу снова.

onReceiveEvent - это что, прерывание? А вызывающая функция знает, что у него есть параметр? И еще - как обьявлено b ? - если это прерывание, не забывайте volatile

Вообще, если приемник "в основном ничего не делает", я бы начал с обычного опроса while available()  в лупе, без всяких колбеков

dim3740
dim3740 аватар
Offline
Зарегистрирован: 25.03.2015

onReceiveEvent - не отношу к прерываниям, но по приходу нужно "фронта"/команды и идентификации адреса, она ... должна вызываться. А она вообще не срабатывает. И пока неважно тип переменной b.

Что за параметр HowMany - для меня загадка)

Проблемы начались после того как успешно работала одна пара ардуин (мастер и слейв1), а я повесил еще один слейв2. Давайте, смотреть в корень проблемы. Что могло измениться? Кроме, что было 20, а стало еще и 21.

причем, 20 принимает, а 21 нет. Если отпаять 20, то принимает 21.

и нет резисторов!

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

аппаратная реализация I2C не включает подтяжку, так как при нескольких устройствах подтяжка окажется включена параллельно и может привести к недопустимо низкому значению, как следствие - к большому току и сгоревшему пину. ;)

Внешняя подтяжка в 10К и в 4К7 - смотрятся нормально. все, что выше 1К - уже подходит. Чем длиннее линия - тем больше её ёмкость, следовательно для сохранения формы импульсов нужно уменьшать сопротивление подтяжки.

В условиях ТС от 1К 10К - должны нормально работать. 4К7 - выглядит разумным компромисом.

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

dim3740 пишет:

onReceiveEvent - не отношу к прерываниям, но по приходу нужно "фронта"/команды и идентификации адреса, она ... должна вызываться. А она вообще не срабатывает. И пока неважно тип переменной b.

Что за параметр HowMany - для меня загадка)

простите, а вы код закрыв глаза набрасываете? Что мешает открыть библиотеку и посмотреть, как вызывается ReceiveEvent. есть ли у него параметры и для чего они? какой смысл тогда обсуждать что-то дальше, если вы не понимаете даже своего кода?

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

dim3740 пишет:

причем, 20 принимает, а 21 нет. Если отпаять 20, то принимает 21.

разнеси адреса подальше, чем на 1.  Мошт одна у тебя пишет, а вторая читает

dim3740
dim3740 аватар
Offline
Зарегистрирован: 25.03.2015

wdrakula пишет:

аппаратная реализация I2C не включает подтяжку, так как при нескольких устройствах подтяжка окажется включена параллельно и может привести к недопустимо низкому значению, как следствие - к большому току и сгоревшему пину. ;)

Да, это логично. Т.е. это снятие рисков неизвестного заранее количества устройств. Опишу не претендуя на профессионализм с чем я столкнулся когда макетировал внешние резисторы на шине с 2-3 МК.

"Входные порты" МК, имеют свои внутренние резисторы, входное сопротивление ... Они могут подтягиваться программно. Далее, имеется и остаточное сопротивление открытого порта на землю. В итоге, у меня логический уровень единицы мог быть и 1,5 в, и 2,0 вольта... Образовывалось много "делителей напряжения" от всех этих резюков, и потенциал изменялся... короче было взаимовлияние на потенциал. Если бы были "кнопки" с нулевым сопротивлением, а тут реальные МК... 

 

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

dim3740 пишет:

"Входные порты" МК, имеют свои внутренние резисторы, входное сопротивление ... Они могут подтягиваться программно. Далее, имеется и остаточное сопротивление открытого порта на землю. В итоге, у меня логический уровень единицы мог быть и 1,5 в, и 2,0 вольта...

И тут, как и в коде - какое-то гадание на кофейной гуще...

GarryC
Offline
Зарегистрирован: 08.08.2016

Откройте любое описание шины I2C  и увидите подтягивающие резисторы. Поставьте их безусловно, поскольку встроенные подтяжки не гарантируют почти ничего. А вот после этого уже можно и вопросы задавать, если они останутся.

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

Судя по всему, ТС "некогда разбираться, надо срочно", вот он и ждет, что кто-то вдруг даст ему волшебниый совет, который сразу решит все проблемы

dim3740 - никто за вас вашу задачу не решит. Делайте все последовательно, вдумчиво, без спешки. Поставьте требующиеся по прописи резисторы. Разберитесь с функциями библиотеки, с которыми вы пытаетесь работать.

 

rkit
Offline
Зарегистрирован: 23.11.2016

А провода случаем не силовые, срезанные со старого обогревателя? И не на макетке беспаечной какой?

dim3740
dim3740 аватар
Offline
Зарегистрирован: 25.03.2015

b707 пишет:

dim3740 - никто за вас вашу задачу не решит. Делайте все последовательно, вдумчиво, без спешки.

Что же... типовой "воспитательный" совет, когда уже больше не о чем говорить.... Я такой своей внучке тоже часто говорю))))

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

dim3740 пишет:

Что же... типовой "воспитательный" совет, когда уже больше не о чем говорить.... Я такой своей внучке тоже часто говорю))))

и разве не помогает? :)

На самом деле, о чем тут говорить, ваша схема у вас в руках, а не у нас... не вижу толку теоретизировать.

bwn
Offline
Зарегистрирован: 25.08.2014

dim3740 пишет:

Да, это логично. Т.е. это снятие рисков неизвестного заранее количества устройств. Опишу не претендуя на профессионализм с чем я столкнулся когда макетировал внешние резисторы на шине с 2-3 МК.

"Входные порты" МК, имеют свои внутренние резисторы, входное сопротивление ... Они могут подтягиваться программно. Далее, имеется и остаточное сопротивление открытого порта на землю. В итоге, у меня логический уровень единицы мог быть и 1,5 в, и 2,0 вольта... Образовывалось много "делителей напряжения" от всех этих резюков, и потенциал изменялся... короче было взаимовлияние на потенциал. Если бы были "кнопки" с нулевым сопротивлением, а тут реальные МК... 

Из описания неясно, вы к каждому устройству свою подтяжку лепили? Если да, то это бред.
С внутренними, теоретически включенными, резисторами МК, которые >20кОм и подтяжкой 4к7, у вас получится минимум ~2к7, что для шины вполне допустимо. Ищите косяки в монтаже. ИМХО.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

bwn пишет:

Из описания неясно, вы к каждому устройству свою подтяжку лепили?

Ой! А я ответ от ТС не прочел! Какая прелесть!!!

Если это так, то ТС, дорогой! Пока дом не поджег - купи парусник для склейки. Я - пробовал - очень успокаивает и безопасно!

У тебя на фото синт вроде хороший? Разучи что-то сложное, типа Бранденбургского концерта. Без обид.