что означает постоянный свет RX
- Войдите на сайт для отправки комментариев
Ср, 25/05/2016 - 10:45
2 комплекта есть NANO + MAX485 (комплекты собраны каждый на своей макетке) в них залит один и то-же скетч (правда с небольшими изменениями, но в принцепе один) между ними раз в секунду должен идти некий обмен (в котором у меня есть непонятки, судя по всему у меня не проходят пакеты в обратку)
на одном NANO постоянно и ярко горит RX, а TX подмигивает,
на втором NANO RX подмигивает а TX молчит
если между платами поменять модуль MAX485 местами, то на первом ярко горящий диод с первого NANO переползает на второй... Скорее всего у меня один модуль 485 выдает на один контакт посоянно высокий уровень сигнал.
вопросы
1. как проверить? (я в электрики слабак)
2. чего делать?
действительно большую часть времени оба интерфейса "на приеме", но в одну сторону пакеты ходят совершенно нормально...
про подтяжку - использую готовые модули http://www.ebay.com/itm/381374599127?_trksid=p2060353.m2749.l2649&ssPageName=STRK%3AMEBIDX%3AIT вроде у них с этим должно быть все нормально ?
может влиять то, что питание у плат не общее ??? только земля соеденина?
да вроде в моем модуле все подтяжки уже встроены
поменял модуль MAX485 на новый - светодиод перестал постоянно гореть, теперь его поведение внешне нормальное...
короче с новым модулем все заработало как надо, как можно проверить "подозрительный" модуль? тестером померил сопротивления между всеми ногами - вроде все совпадает с хорошим... или плюнуть и выкинуть?
про согласующие резисторы я понял, с ними я буду разбиратся чуть позже... мне не нравится, то что резисторы придется подбирать под физические параметры системы в целом.
Идем дальше : собственно я кажется нашел причину моих проблемм, попробую расписать стойкое (стабильно повторяющиеся) возникновение односторонней связи:
1. имеем состояние когда все работает, пакеты ходят в обе стороны, все без проблемм, скорость стоит 19200 (что отличается от скорости заливки скетчей).
2. при заливки новой прошивки в мастер на нем мигают RX и TX (как и положено), но при этом паралельно ничинают мигать и на слейве, то есть заливка скетча как-то передается слейву (хотя в него вроде и не заливается)
3. после этого мастер начинает работать с новой прошивкой, при этом слейвы нормально получают его пакеты, но ответы от слейва до мастера не проходят, при этом терминал нормально работает на скорости 19200 и с мастером и со слейвом.
4. после ресета слейва мастер начинает получать пакеты слейва в нормальном режиме
что-бы это могло быть? предположим, что у нас что-то не то с уровнями сигнала, но тогда как работает передача от мастера к слейву? почему перезагрузка слейва наводит порядок а перезагрузка мастера нет?
Полистал исходник из темы про умный дом, не нашел ответа на вопрос: "Как слейв узнаёт, что очередной байт в UARTе это первый байт пакета?"
схема вот, модуль с резисторами расписан выше, здесь показан как "сборка", D4 и D5 99% времени имеют 0, что должно соответствовать режиму "чтение", хотя внутири модуля они имеют подтяжку к +5, значит возможно, что какое-то время они включены.... может питание MAX485 сделать включаемым в процедуре setup? жаль еще одну ногу тратить :)
Вот смотри, нога D4 дуины управляет входом DE передатчика RS485, лог 1 - передатчик включен. По сбросу дуины все выводы в высокоимпендансном состоянии, в том числе и D4, следовательно передатчик после сброса включен внутренним сопротом в модуле RS485. Пока ты заливаешь скетч - данные транслируются в твою сеть RS485 - все остальные устройства в сети RS485 пытаются понять, что за сообщения приходят и возможно даже пытаются на них отвечать... К тому моменту, как стартует твой залитый скетч, остальные устройства ожидают получения очередного байта сообщения... Произошла рассинхронизация.
Поэтому:
-DE однозначно притягивать к GND сопротом 1К.
-паузу между сообщениями использовать, как идентификатор начала сообщения.
Вот смотри, нога 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
подтянул DE к земле, вроде при перепрошивки и ребуте шину не штормит и слейвы не колбасит, но обратный сигнал все равно пропадает до ребута слейва...
кроме того заметил такую фигню: есть 2 прошивки для слейва, разница в одном единственном параметре, суть параметра - трансировать в USB все входящие данные, по сколько при этом отправки в шину все равно нет по тому как тригер работает либо на пием либо на передачу...
если эхо 1 - то обратка не идет, если 0 - то все нормально
а для мастера оба параметра работают нормально, короче непонятно в чем дело...
сейчас буду пробовать вариант с питанием модуля от пина ардуинки
ps
вот ведь паразит, паразитно питается....
pps
с эхом разобрался, проблемма с разной скоростью сома, решилось оператором port->flush();
-девятый бит в заголовке;
-передача данных в текстовом виде, в заголовке не текстовый символ;
-пауза между сообщениями.
Именно пауза используется в modbus
Я полагаю причиной "пропадания обратного сигнала" является именно рассинхронизация.
Я полагаю причиной "пропадания обратного сигнала" является именно рассинхронизация.
у меня алгоритм такой
мастер:
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 раза подрят - он делает реинициализацию, если после трех реинициализаций ничего не помогло - он пищит и моргает :)
ну и наверно все-же придется выпаивать резисторы с DE и RE и тянуть их к земле, только не очень понятно зачем изначально они тут стоят притянутые к +5?
Andy - респект :)
1. запоял резисторы по 1к от DE к земле,
2. резистр 10к к +5 выпаивать не стал,
3. увеличил время между подачей HIGH на DE и выводом в порт до 0,002с (при скорости 19200),
4. добавил port->flush(); перед переходом подачей LOW на DE
вроде добился стабильности между двумя модулями, нормально выдерживаю
1. перезаливку скетча без отсоеденении шины как на мастере так и на слейве
2. ребуты, любые, и питанием и кнопкой и через порт
3. отсоединение и включение кабеля соединяющиго модули
остались вопросы по резистору на 120 ом между А и Б, и максимальным количеством модулей на шине:
На сколько я понимаю ограничение в 32 юнита связано именно с мощностью которая потребляет сама шина, то есть если убрать этот резистр то модулей можно ставить больше, но тогда будут проблеммы с помехами... и вообще думается мне, что этот резистр нужно ставить в принцепе не на каждом модуле а как-то согласно длинне линии, видимо когда дойдет до мантажа я еще наступлю на эти грабли...