что означает постоянный свет RX

vde69
Offline
Зарегистрирован: 10.01.2016

2 комплекта  есть NANO + MAX485 (комплекты собраны каждый на своей макетке) в них залит один и то-же скетч (правда с небольшими изменениями, но в принцепе один) между ними раз в секунду должен идти некий обмен (в котором у меня есть непонятки, судя по всему у меня не проходят пакеты в обратку)

на одном NANO постоянно и ярко горит RX, а TX подмигивает,

на втором NANO RX подмигивает а TX молчит

 

если между платами поменять модуль MAX485 местами, то на первом ярко горящий диод с первого NANO переползает на второй... Скорее всего у меня один модуль 485 выдает на один контакт посоянно высокий уровень сигнал.

 

вопросы

1. как проверить? (я в электрики слабак)

2. чего делать?

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

vde69 пишет:
чего делать?
Скорее всего оба девайса "на приеме", линии интерфейса в неопределенном состоянии. Подтяни одну линию к + питания, другую к GND сопротьями 1К.

vde69
Offline
Зарегистрирован: 10.01.2016

Andy пишет:

vde69 пишет:
чего делать?
Скорее всего оба девайса "на приеме", линии интерфейса в неопределенном состоянии. Подтяни одну линию к + питания, другую к GND сопротьями 1К.

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

про подтяжку - использую готовые модули http://www.ebay.com/itm/381374599127?_trksid=p2060353.m2749.l2649&ssPageName=STRK%3AMEBIDX%3AIT вроде у них с этим должно быть все нормально ?

vde69
Offline
Зарегистрирован: 10.01.2016

может влиять то, что питание у плат не общее ??? только земля соеденина?

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

vde69 пишет:
может влиять то, что питание у плат не общее ??? только земля соеденина?
Так и должно быть. По тем ссылкам, что ты оставил в теме про умный дом есть про "защитное смещение", почитай.

vde69
Offline
Зарегистрирован: 10.01.2016

да вроде в моем модуле все подтяжки уже встроены

vde69
Offline
Зарегистрирован: 10.01.2016

поменял модуль MAX485 на новый - светодиод перестал постоянно гореть, теперь его поведение внешне нормальное...

vde69
Offline
Зарегистрирован: 10.01.2016

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

 

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

vde69 пишет:
да вроде в моем модуле все подтяжки уже встроены
Встроенные подтяжки предназначены только для обрыва линии. Как только ты поставил согласующий сопрот 120 Ом, в режиме все устройства "на приеме", разница между входами А и В в стала меньше 200 мВ. Делай согласование 560/120/560, я думаю это не более чем разброс параметров МАХ485.

vde69
Offline
Зарегистрирован: 10.01.2016

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

 

Идем дальше : собственно я кажется нашел причину моих проблемм, попробую расписать стойкое (стабильно повторяющиеся) возникновение односторонней связи:

1. имеем состояние когда все работает, пакеты ходят в обе стороны, все без проблемм, скорость стоит 19200 (что отличается от скорости заливки скетчей).

2. при заливки новой прошивки в мастер на нем мигают RX и TX (как и положено), но при этом паралельно ничинают мигать и на слейве, то есть заливка скетча как-то передается слейву (хотя в него вроде и не заливается)

3. после этого мастер начинает работать с новой прошивкой, при этом слейвы нормально получают его пакеты, но ответы от слейва до мастера не проходят, при этом терминал нормально работает на скорости 19200 и с мастером и со слейвом.

4. после ресета слейва мастер начинает получать пакеты слейва в нормальном режиме

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

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

vde69 пишет:
при заливки новой прошивки в мастер на нем мигают RX и TX (как и положено), но при этом паралельно ничинают мигать и на слейве, то есть заливка скетча как-то передается слейву
Если я правильно понимаю схему включения: соединены две NANO по RS485, т.е. их UARTы подключены и к USB и к МАХ485. Во время загрузки скетча по USB, данные передаются в RS485, т.е. МАХ485 в это время находится в режиме передачи - это не правильно. Хотелось бы увидеть схему подключения МАХ485 к дуине.

Полистал исходник из темы про умный дом, не нашел ответа на вопрос: "Как слейв узнаёт, что очередной байт в UARTе это первый байт пакета?"

vde69
Offline
Зарегистрирован: 10.01.2016

схема вот, модуль с резисторами расписан выше, здесь показан как "сборка", D4 и D5 99% времени имеют 0, что должно соответствовать режиму "чтение", хотя внутири модуля они имеют подтяжку к +5, значит возможно, что какое-то время они включены.... может питание MAX485 сделать включаемым в процедуре setup? жаль еще одну ногу тратить :)

 

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

Вот смотри, нога D4 дуины управляет входом DE передатчика RS485, лог 1 - передатчик включен. По сбросу дуины все выводы в высокоимпендансном состоянии, в том числе и D4, следовательно передатчик после сброса включен внутренним сопротом в модуле RS485. Пока ты заливаешь скетч - данные транслируются в твою сеть RS485 - все остальные устройства в сети RS485 пытаются понять, что за сообщения приходят и возможно даже пытаются на них отвечать... К тому моменту, как стартует твой залитый скетч, остальные устройства ожидают получения очередного байта сообщения... Произошла рассинхронизация.

Поэтому:
-DE однозначно притягивать к GND сопротом 1К.
-паузу между сообщениями использовать, как идентификатор начала сообщения.

vde69
Offline
Зарегистрирован: 10.01.2016

Andy пишет:

Вот смотри, нога D4 дуины управляет входом DE передатчика RS485, лог 1 - передатчик включен. По сбросу дуины все выводы в высокоимпендансном состоянии, в том числе и D4, следовательно передатчик после сброса включен внутренним сопротом в модуле RS485. Пока ты заливаешь скетч - данные транслируются в твою сеть RS485 - все остальные устройства в сети RS485 пытаются понять, что за сообщения приходят и возможно даже пытаются на них отвечать... К тому моменту, как стартует твой залитый скетч, остальные устройства ожидают получения очередного байта сообщения... Произошла рассинхронизация.

Поэтому:
-DE однозначно притягивать к GND сопротом 1К.
-паузу между сообщениями использовать, как идентификатор начала сообщения.

рассинхронизацию на программном уровне я не боюсь, у меня алгоритмы на это заточены
мусор в сети - тоже нормально фильтруется, ни кто на него не отвечает

если подтягивать DE к земле, то мне надо выпаивать резистор который подтягивает его к плюсу и аналогичную операцию делать с RE (хотя может и нее надо, он ведь инверсивный), короче мне это не нравится я стремлюсь готовые модули оставлять в целостности...

может лучше будет так:
RE соединяю с DE и одним проводом тяну на D4
на RS485 VCC отсоединяю от +5 и тяну на D5
в setup сначала выставляю 0 но D4 делаю паузу 0.1с потом выставляю 1 на D5

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

вроде все должно работать?

остается вопрос с подтяжкой выхода "А" к плюсу, сейчас он сделан на резисторе 20к в каждом модуле, вот тут я не очень понимаю чего будет если модулей например 50шт и в каждом стоит своя подтяжка на свои +5

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

vde69 пишет:
если подтягивать DE к земле, то мне надо выпаивать резистор который подтягивает его к плюсу и аналогичную операцию делать с RE (хотя может и нее надо, он ведь инверсивный), короче мне это не нравится я стремлюсь готовые модули оставлять в целостности...
Нет необходимости выпаивать, там ведь 10К подтяжка 10К/1К делитель даст 0.45В, это заведомо меньше чем Input Low Voltage (max) 0.8В

vde69 пишет:
может лучше будет так: RE соединяю с DE и одним проводом тяну на D4 на RS485 VCC отсоединяю от +5 и тяну на D5 в setup сначала выставляю 0 но D4 делаю паузу 0.1с потом выставляю 1 на D5 тем самым при рестарте шина вообще будет выключена, и включится на чтение только после инициализации управляющих пинов модуля 485, вроде все должно работать?
Есть минус у такого решения: МАХ485 получит паразитное питание с выводов Rx и Tx.

vde69 пишет:
остается вопрос с подтяжкой выхода "А" к плюсу, сейчас он сделан на резисторе 20к в каждом модуле, вот тут я не очень понимаю чего будет если модулей например 50шт и в каждом стоит своя подтяжка на свои +5
Для МАХ485 количество передатчиков на шине ограичено 32 шт. Все будет в пределах нормы.

vde69
Offline
Зарегистрирован: 10.01.2016

подтянул DE к земле, вроде при перепрошивки и ребуте шину не штормит и слейвы не колбасит, но обратный сигнал все равно пропадает до ребута слейва...

 

кроме того заметил такую фигню: есть 2 прошивки для слейва, разница в одном единственном параметре, суть параметра - трансировать в USB все входящие данные, по сколько при этом отправки в шину все равно нет по тому как тригер работает либо на пием либо на передачу...

uint8_t BusRS485::Read(){
  uint8_t a; 
  a = port->read();
  if (this->Echo == 1) { port->write(a); }
  return a; 
}

если эхо 1 - то обратка не идет, если 0 - то все нормально

а для мастера оба параметра работают нормально, короче непонятно в чем дело...

 

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

ps

вот ведь паразит, паразитно питается....

 

pps

с эхом разобрался, проблемма с разной скоростью сома, решилось оператором port->flush();

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

vde69 пишет:
рассинхронизацию на программном уровне я не боюсь, у меня алгоритмы на это заточены
Есть несколько способов надежной идентификации начала сообщения:
-девятый бит в заголовке;
-передача данных в текстовом виде, в заголовке не текстовый символ;
-пауза между сообщениями.

Именно пауза используется в modbus

modbus пишет:
Признаком начала кадра является пауза (тишина) продолжительностью не менее 3,5 шестнадцатеричных символов(14 бит). Кадр должен передаваться непрерывно.

Я полагаю причиной "пропадания обратного сигнала" является именно рассинхронизация.

vde69
Offline
Зарегистрирован: 10.01.2016

Andy пишет:

Я полагаю причиной "пропадания обратного сигнала" является именно рассинхронизация.

у меня алгоритм такой

мастер:

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

2. если время прошло и пакета нет - отправляет пакет другому слейву

слейв:

1. слушает и ждет маркер начала пакета B111001101 (такая последовательность выбрана для избежания эффекта сбора данных при не верной скорости).

2. При получении маркера он ждет когда в буфере будет 7 байт, по ним (не удаляя из буфера) он проверяет CRC всего заголовка, если CRC не сошлось - он переходит к п. 1

3. если CRC сошлось - считываем пакет,

4. в считаном пакете смотрим адресата и необходимость ответа, в случае необходимости ответа отправляем ответ (перед отправкой есть небольшая пауза)

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

 

за счет эха я в терминале вижу 100% трафик (как входящий так и исходящий) как на слейве так и на мастере в реальном времени, так вот слейв нормально парсит входящие данные, никакой рассинхронизации, и шлет ответ в порт, а вот на мастере этого ответа я не вижу, и входящего мусора на мастере я то-же не вижу, вообще ничего...

1. на слейве получение данных по 485 точно работает

2. на мастере отправка данных по 485 точно работает

3. на слейве отправка данных в UART точно работает

Варианты:

1. данные теряются при передачи с TX в порт 485 на слейве, тут или тригер закрыт или микросхема что-то там надумала и данные теряются внутри нее

2. данные доходят до порта 485 на мастере, но порт их не принимает

3. данные принимаются портом 485 на мастере но не попадают на RX (например тригер стоит на передачу)

4. данные теряются внутри мастера уже после передачи на ногу RX

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

1. увеличить паузу между переключением в режим отправки данных с текущей 0,0005с до 0,001с что соответствует 19 битам (сейчас 8 и это может не давать синхронизироватся на физическом уровне), учитывая некоторое время на переключение ответного устройства (в частности например на передачу эхо сигнала, очистку буфера), можно увеличить паузу даже до 0,002с. Тут вообще мне надо какую-то формулу придумать :)

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

vde69
Offline
Зарегистрирован: 10.01.2016

ну и наверно все-же придется выпаивать резисторы с DE и RE и тянуть их к земле, только не очень понятно зачем изначально они тут стоят притянутые к +5?

vde69
Offline
Зарегистрирован: 10.01.2016

Andy - респект :)

1. запоял резисторы по 1к от DE к земле,

2. резистр 10к к +5 выпаивать не стал,

3. увеличил время между подачей HIGH на DE и выводом в порт до 0,002с (при скорости 19200),

4. добавил port->flush(); перед переходом подачей LOW на DE

вроде добился стабильности между двумя модулями, нормально выдерживаю

1. перезаливку скетча без отсоеденении шины как на мастере так и на слейве

2. ребуты, любые, и питанием и кнопкой и через порт

3. отсоединение и включение кабеля соединяющиго модули

остались вопросы по резистору на 120 ом между А и Б,  и максимальным количеством модулей на шине:

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