Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

 
Опции темы
Непрочитано 14.09.2015, 21:51  
NewWriter
Заблокирован
 
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,486
Сказал спасибо: 396
Сказали Спасибо 2,220 раз(а) в 1,319 сообщении(ях)
NewWriter на пути к лучшему
По умолчанию Re: Неправильная работа Proton с RS485

Нуу во-первых, нужно сначала разобраться с тем, что и как посылается. Это важно. Без этого как бы и бессмысленно пытаться наладить связь - будут затыки.
От главного МК к подчиненному запрос (команда) сейчас в проекте автора посылается беспрерывно, и не останавливается даже тогда, когда пошел ответ от подчиненного МК. Отсюда и конфликт на линии выходит, когда два трансивера (MAX487) в один момент времени оказываются оба в передаче.
Поэтому, вначале желательно отладить протокол обмена без трансиверов RS485 (чтобы не париться), ориентируясь по графикам в симуляции, таким образом, чтобы не было одновременной передачи с обеих МК. Одновременная передача может здорово нагружать в железе трансиверы по току драйверов, а МК не распознает, что идет одновременная передача, а не обрыв линии и будет дальше пытаться передавать. Сейчас в проекте главный МК вообще зависает, если нет ответа.

Протокол обмена в простейшем случае можно придумать самому. Допустим, на линии есть всего два устройства - главный МК пульта и подчиненный МК датчиков (или че там такое).
Определяемся, сколько байт нужно для передачи запроса (команды) от главного МК к подчиненному. Допустим, 1 байт, в него заложено всего несколько вариантов команд. Вот его то и будем передавать в запросе всего один раз. Не надо его постоянно слать до посинения, а то не сможем обратно принять. Один раз отправили - и ждем ответа от подчиненного МК в течение некоторого интервала времени, переключившись на прием и не пытаясь ничего передавать. Этот интервал должен быть таким, чтобы при самых худших условиях по загрузке, подчиненный МК успел сформировать байты ответа и начать передачу. Как только пришел ответ в заданный интервал времени, получаем ответ и обрабатываем его.
Если ответ не пришел в интервале времени, только тогда можно попробовать повторную передачу запроса. Допустим, будет всего три попытки добиться ответа от подчиненного МК. Если ответа так и нет - пишем на дисплее, что связь оборвалась или подчиненный МК завис (выключился).
Теперь определяемся с тем, сколько байт нужно получить в ответе от подчиненного МК. Например, пакет в 4 байта - 3 байта информации и 1 байт контрольной суммы (типа защищаемся от помех, для разнообразия кодописательства). И пока главный МК не примет все 4 байта, он не должен начинать передачу сам. Опять же, эти байты ответа должны прийти в течение некоторого интервала времени, определяемого наихудшими условиями по длительности формирования ответа подчиненным МК. Если этот интервал времени истек, а все 4 байта не приняты, значит, что-то случилось на линии или с МК.
Вооот, это будет основной обмен информацией.
Теперь, для разнообразия придумываем контроль исправности линии RS485 в простое и вообще, контроль исправности (нормальной работы) подчиненного МК.
Для этого, периодически, например, каждые 2-5 секунд посылаем от главного МК специальный байт контроля. Он должен быть уникальным, то есть, не использоваться в командах и однозначно распознаваться как контрольный. Например, 0х55 (0101 0101) - чередующаяся последовательность 0 и 1. Подчиненный МК должен ответить либо таким же байтом 0х55, либо прислать обычный многобайтный ответ с информацией о состоянии устройства.

Далее, что касается физической части RS485.
Если на концах линии не используются согласующие резисторы (на низкой скорости и на маленьком расстоянии можно и без них - работает, проверял), то при разомкнутой линии на выходе RO будет 1. А вот в Протеусе - наоборот, 0 будет, а это помешает нормальной работе UART. Чтобы заработало в Протеусе, надо пойти на небольшую хитрость, вот так:



В железе работает почти такая же схема, только вместо отрицательного -5V подсоединяем к общему GND. Да, Протеус малость своеобразен.
Если в железе поставить согласующий резистор, но не подтянуть линии к + и общ, то получим тоже ерунду, поскольку на линии будет неопределенность и ложные срабатывания.

----
А что касается того, откуда брать инфу для выключения направления передачи, то сигналом для нее может быть бит TRMT в регистре TXSTA. Он сигнализирует о том, что буфер передачи пуст после передачи последнего байта в посылке:



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

Короче говоря, до тех пор, пока не будет нормально сделан протокол обмена, нифига с полудуплексным RS485 не получится. Либо уж тогда делать в полном дуплексе с двумя сигнальными витыми парами.
Реклама:
NewWriter вне форума  
Сказали "Спасибо" NewWriter
vladh (16.09.2015)
Непрочитано 15.09.2015, 07:52  
vladh
Почётный гражданин KAZUS.RU
 
Регистрация: 03.12.2004
Сообщений: 1,306
Сказал спасибо: 337
Сказали Спасибо 76 раз(а) в 33 сообщении(ях)
vladh на пути к лучшему
По умолчанию Re: Неправильная работа Proton с RS485

К сожалению вчера больше половины дня потратил в поликлинике. Успел только на работе испытать непричесанный вариант в живую. МК начали наконец общаться, правда иногда команды проходят только со второго раза. Сегодня, к сожалению, также придется "нарисоваться" на работе только во второй половине дня. Но в Протеусе пока связь плохая.
vladh вне форума  
Непрочитано 15.09.2015, 22:16  
vladh
Почётный гражданин KAZUS.RU
 
Регистрация: 03.12.2004
Сообщений: 1,306
Сказал спасибо: 337
Сказали Спасибо 76 раз(а) в 33 сообщении(ях)
vladh на пути к лучшему
По умолчанию Re: Неправильная работа Proton с RS485

Сообщение от NewWriter Посмотреть сообщение
Нуу во-первых, нужно сначала разобраться с тем, что и как посылается. Это важно. Без этого как бы и бессмысленно пытаться наладить связь - будут затыки.
.
Уважаемый. NW, позвольте здесь с Вами несколько не согласиться. Я считаю, что по началу надо хотя бы просто по 2 байта научится надежно посылать туда-сюда, и уже только потом переходить к созданию необходимого и надежного протокола. Сейчас я организую протокол таким образом. Пульт я считаю условно главным(ведущим). Вначале ведущий посылает два байта с указаниями режима работы и началом работы. Ведомый получив это сообщение должен сразу ответить. Сообщив, что он получил сообщение, включился в работу и передает сообщение о положении движка пер. резистора. Правда после этого он начинает регулярно(каждые 0,5 с) передавать значения положения движка резистора. В любой момент времени ведущий может послать сообщение об отключении работы. Ведомый получив это сообщение выключает светодиод и отпраляет посылку о том, что он все отключил. После этого регулярные посылки ведомого прекращаются. Я прилагаю здесь свой последний вариант. Вживую он работает. Правда пока я только работаю на 10 см линии. Завтра могу попробовать на 40 м. Но в Протеусе не идет. Причем команды ведомому проходят(сетодиод переключается при каждом нажатии на "5"), а возвратных нет(экран не переходит в режим работы).
Вложения:
Тип файла: rar 01.rar (108.8 Кб, 16 просмотров)

Последний раз редактировалось vladh; 15.09.2015 в 22:18.
vladh вне форума  
Непрочитано 15.09.2015, 23:40  
NewWriter
Заблокирован
 
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,486
Сказал спасибо: 396
Сказали Спасибо 2,220 раз(а) в 1,319 сообщении(ях)
NewWriter на пути к лучшему
По умолчанию Re: Неправильная работа Proton с RS485

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


------

NewWriter вне форума  
Сказали "Спасибо" NewWriter
vladh (16.09.2015)
Непрочитано 16.09.2015, 01:04  
makakus
Почётный гражданин KAZUS.RU
 
Регистрация: 08.10.2007
Сообщений: 2,760
Сказал спасибо: 1,105
Сказали Спасибо 1,037 раз(а) в 569 сообщении(ях)
makakus на пути к лучшему
По умолчанию Re: Неправильная работа Proton с RS485

Десятая страница, а ТС всё кормит народ буквами да "так идёт - так не идёт". Бывают такие осциллографы, логические анализаторы, программные снифферы и т.д. В общем, средства отладки Что-нибудь из этого есть?
makakus вне форума  
Непрочитано 16.09.2015, 07:25  
vladh
Почётный гражданин KAZUS.RU
 
Регистрация: 03.12.2004
Сообщений: 1,306
Сказал спасибо: 337
Сказали Спасибо 76 раз(а) в 33 сообщении(ях)
vladh на пути к лучшему
По умолчанию Re: Неправильная работа Proton с RS485

Сообщение от NewWriter Посмотреть сообщение
Ну а вот так если, то работает в протеусе, так ведь? Я ж показал, как надо сделать, чтоб в протеусе появилась связь
У вас я вижу работает. А у меня нет.
vladh вне форума  
Непрочитано 16.09.2015, 07:56  
NewWriter
Заблокирован
 
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,486
Сказал спасибо: 396
Сказали Спасибо 2,220 раз(а) в 1,319 сообщении(ях)
NewWriter на пути к лучшему
По умолчанию Re: Неправильная работа Proton с RS485

Работающий в протеусе прожект с кучей инструментов анализа во вложении:
...
Сообщение от vladh Посмотреть сообщение
по началу надо хотя бы просто по 2 байта научится надежно посылать туда-сюда.... пока я только работаю на 10 см линии. Завтра могу попробовать на 40 м
А вот тут и могут уже вылезти недоработки протокола обмена.
Вообще, для помехозащищенности желательно ввести в протокол какой-либо контроль целостности данных. Например, хотябы контроль четности в каждый передаваемый байт. 8 битов данных и девятый бит четности. Бит четности - это четное (бит четности=0) или нечетное (бит четности=1) кол-во лог.единиц в байте. Вычисляется побитной лог.операцией XOR при формировании байта для передачи и после приема. Позволяет обнаружить одну ошибку в байте и забраковать принятый пакет. USART в ПИКе позволяет аппаратно передать бит четности, включив 9-разрядную передачу/прием без детектирования адреса.
Действия при несоответствии принятого и рассчитанного бита четности: весь пакет считать ошибочным и либо дождаться другого пакета, либо (для передачи команд особенно) отправить запрос на повторную передачу того же самого пакета. Если после нескольких попыток (например, 10) все равно приходят пакеты с ошибками - остановить запросы и выдать сообщение о неисправности линии.
Вложения:
Тип файла: zip Uresano2.zip (202.9 Кб, 14 просмотров)

Последний раз редактировалось NewWriter; 16.09.2015 в 09:28.
NewWriter вне форума  
Сказали "Спасибо" NewWriter
vladh (16.09.2015)
Непрочитано 16.09.2015, 09:42  
vladh
Почётный гражданин KAZUS.RU
 
Регистрация: 03.12.2004
Сообщений: 1,306
Сказал спасибо: 337
Сказали Спасибо 76 раз(а) в 33 сообщении(ях)
vladh на пути к лучшему
По умолчанию Re: Неправильная работа Proton с RS485

Сообщение от NewWriter Посмотреть сообщение
Работающий в протеусе прожект с кучей инструментов анализа во вложении:
Да, Ваш проект работает и у меня. Посмотрите пж. на мой проект сделанный на основе Вашего, но не работающий. Чего капризничает не пойму. Код переделал. Вроде как ошибок нет.
И еще вопрос. Почему Ваш Symulatin.log не такой как у меня. У Вас гораздо больше сообщений.
Вложения:
Тип файла: rar Uresano3.rar (131.5 Кб, 15 просмотров)

Последний раз редактировалось vladh; 16.09.2015 в 10:00.
vladh вне форума  
Непрочитано 16.09.2015, 10:01  
NewWriter
Заблокирован
 
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,486
Сказал спасибо: 396
Сказали Спасибо 2,220 раз(а) в 1,319 сообщении(ях)
NewWriter на пути к лучшему
По умолчанию Re: Неправильная работа Proton с RS485

Резистор R1 нужно перевести в digital режим. А все потому, что в коде есть ошибка! Ну не должен выход RC5 переключаться на вход, вместо того, чтобы выдать высокий уровень на выход. Программа из-за ошибки в выборе банков работает с регистром направления TRIS, а не с регистром выхода PORT. У этих регистров одинаковые адреса в разных банках. Для работы с выходом, должен быть выбран банк 0. STATUS.3=0 (или как там в бейсике указывается команда то).
Такая же беда и с другим МК (U1). И когда это будет исправлено, можно обойтись без R1 и R3.
Ну а в железе, вообще в момент подачи питания, когда МК еще не стартовал, нужно защититься от возможного включения режима передачи трансивера. Для этого, наоборот, нужен резистор поддяжки к GND (общему), чтобы по умолчанию там был лог.0 и трансивер находился в режиме приема.
...
И еще. Соединив вместе |RE и DE трансивера, получаем, что в момент передачи выход RO находится в Hi-Z состоянии и поэтому вход RX МК висит в воздухе и на него могут навестись помехи и сработает ложный старт приемника UART. Поэтому, либо запрещаем работу ресивера UART в МК в момент передачи, либо реистором подтягиваем RX к питанию - это и делает резистор R6 в проекте. В протеусе помех и наводок нету, поэтому в нем ложных срабатываний не возникает. А вот в железе на месте применения - может и появиться


Последний раз редактировалось NewWriter; 16.09.2015 в 10:14.
NewWriter вне форума  
Сказали "Спасибо" NewWriter
vladh (16.09.2015)
Непрочитано 16.09.2015, 10:42  
NewWriter
Заблокирован
 
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,486
Сказал спасибо: 396
Сказали Спасибо 2,220 раз(а) в 1,319 сообщении(ях)
NewWriter на пути к лучшему
По умолчанию Re: Неправильная работа Proton с RS485

Кстати говоря...
В МК порт PORTB (который в проекте работает на дисплей) имеет встроенные резисторы подтяжки для работы клавиатуры. Их только надо включить. (OPTION_REG.7=0). А дисплей поставить на другой свободный порт. И тогда получится совершенно бесплатно сэкономить на внешних резисторах.

Сообщение от vladh Посмотреть сообщение
И еще вопрос. Почему Ваш Symulatin.log не такой как у меня. У Вас гораздо больше сообщений.
Правой кнопкой на МК - › Configure Diagnostics -› USART -› Debug или Full Trace


Последний раз редактировалось NewWriter; 16.09.2015 в 10:48.
NewWriter вне форума  
Сказали "Спасибо" NewWriter
vladh (16.09.2015)
 

Закладки
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
PROSTAR PR6000 по RS485 volk_perm Производственное оборудование 14 09.01.2017 18:18
PIC18F242 неправильная работа LCD 16x2 Kpomobm PIC 17 02.09.2014 03:13
Напряжённая работа Roshens Отвлекитесь, эмбеддеры! 8 01.09.2010 23:08
Работа с RS485 okt03 Микроконтроллеры, АЦП, память и т.д 13 13.02.2008 10:59


Часовой пояс GMT +4, время: 21:51.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot