Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.60/112: Рейтинг темы: голосов - 112, средняя оценка - 4.60
wypuk
0 / 0 / 0
Регистрация: 23.05.2010
Сообщений: 4
1

Обмен данными по UART между несколькими устройствами

02.12.2012, 21:40. Просмотров 20670. Ответов 33
Метки нет (Все метки)

Планирую собрать систему из 2 - 33 устройств обменивающимися данными между собой по UART. В систему входит 1 главное устройство и 1-32 вторичных.
Главное устройство с определенной периодичностью посылает данные на все вторичные устройства. Вторичные устройства при наступлении определенного события посылают данные только для главного устройства, причем неотложно.
Тут вопрос в том, что если одновременно начнут передачу сразу два вторичных устройства или и главное устройство и вторичное. Естественно никто никого не поймет. Как избежать такой ситуации? Например проконтролировать что линия свободна и только после этого передачу начинать.
Казалось бы задачу можно решить установкой мультипроцессорного режима в UART, опрашивая по очереди каждое вторичное устройство, но это может быть довольно долго, тем более если о наступившем событии нужно сообщить немедленно.
Что посоветуете?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.12.2012, 21:40
Ответы с готовыми решениями:

Обмен данными между МК через RS-485 (MAX487)
Доброго времени суток. Сразу к делу: В сообщении прикреплено фото и файл исходного кода...

Обмен данными по SPI между двумя Atemga
Пытаюсь реализовать обмен 5 байт данными между двумя Atmeg(1-Atmega165 ведущий, 2-Atmega16...

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

Обмен данными между устройствами
Всем привет. Требуется совет по поводу реализации обмена данными, между несколькими устройствами....

Обмен данными между двумя устройствами
Доброго времени суток, У меня возник следующий вопрос. У нас в студенческом общежитии, где я...

33
omokost
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 2,753
02.12.2012, 21:45 2
Цитата Сообщение от wypuk
...Что посоветуете?
UART имеет не шинную организация, а точка/точка. Тут надо использовать шинные протоколы (SPI, I2C). Разруливание коллизий в них уже предусмотрено.
0
imbid
0 / 0 / 0
Регистрация: 28.11.2012
Сообщений: 7
02.12.2012, 21:52 3
Ну можно объединить все МК в шину по "монтажному ИЛИ" (типа K-line в автомобилях) и организовать изохронный протокол с паузами, так чтобы ведомый успел передать все что надо ведущему.
0
dikor
0 / 0 / 0
Регистрация: 07.03.2010
Сообщений: 918
02.12.2012, 21:56 4
Шинные протоколы - это modbus
А SPI, USORT и пр- это интерфейсы. И на любом интерфейсе можно реализовать протокол, который обеспечит коллизионную устойчивость.

А если по теме -возьми CAN, MODBUS или что-либо такого рода. Очень удобно.
0
wypuk
0 / 0 / 0
Регистрация: 23.05.2010
Сообщений: 4
02.12.2012, 21:59 5
Цитата Сообщение от omokost
UART имеет не шинную организация, а точка/точка. Тут надо использовать шинные протоколы (SPI, I2C). Разруливание коллизий в них уже предусмотрено.
Насколько я знаю I2C медленный, SPI далеко не передашь (насчет каких нибудь передатчиков для него не знаю если такие есть), а передавать мне надо в пределах 200 м и к линии прицеплять до 32х устройств еще.
0
omokost
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 2,753
02.12.2012, 22:01 6
Мужики, да вы что? Начикающий путается в инклюдах, вы ему "CAN, MODBUS", "изохронный протокол". Насколько вижу, пока и два устройства не может связать.
0
imbid
0 / 0 / 0
Регистрация: 28.11.2012
Сообщений: 7
02.12.2012, 22:13 7
Ну тогда и начать с связки 2-х устройств. А термина "изохронный" пугаться не надо - тут все просто - ведущий передает строго с одинаковым интервалом запросы и ждет от ведомых ответа определенное же время.
Напридумывали тут словов умных всяких, куда бедному крестьянину податься ;)
0
omokost
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 2,753
02.12.2012, 22:19 8
Конечно похвально желание за считанные недели стать ПРОФИ, да говорят что из штанов не выпрыгнешь. Без обид.
0
tokky
0 / 0 / 0
Регистрация: 06.11.2009
Сообщений: 155
02.12.2012, 22:39 9
Цитата Сообщение от imbid
ведущий передает строго с одинаковым интервалом запросы и ждет от ведомых ответа определенное же время.
То, как описал задачу ТС, исключает подобную схему - у него любое устройство в любой момент может начать передачу.

2ТС - что есть "неотложно"? Есть допустимое время реакции. Например при наступлении события сообщение необходимо передать не позднее 10мс. Или 100мс. Дальше берете скорость передачи и количество устройств - считаете частоту передаваемых сообщений. Потом делите ее надвое, исходя из того, что ведущий посылает сообщение с маркером ведомого, который должен ответить. Если предположить, что событие наступит сразу после того, как ведомый ответил ведущему и надо ждать еще круг - получите максимальное время задержки.
Если приоритет ведомых разный, можно организовать более частый опрос приоритетных ведомых.

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

Кстати, у AVR есть в даташитах на тему организации многопроцессорных систем по UART. Посмотрите, возможно все уже придумано до нас.
0
itysiy
0 / 0 / 0
Регистрация: 18.01.2012
Сообщений: 1,418
03.12.2012, 07:28 10
Цитата Сообщение от wypuk
Цитата Сообщение от omokost
UART имеет не шинную организация, а точка/точка. Тут надо использовать шинные протоколы (SPI, I2C). Разруливание коллизий в них уже предусмотрено.
Насколько я знаю I2C медленный, SPI далеко не передашь (насчет каких нибудь передатчиков для него не знаю если такие есть), а передавать мне надо в пределах 200 м и к линии прицеплять до 32х устройств еще.
прям для CAN задача. И 200 метров на большой скорости, и мультимастер. на STM32 он аппаратно реализован очень хорошо. Если все же нужно на авр, то можно поставить CAN контроллер. Или AVR со встроенным CAN. А вообще, мне кажется, можно обойтись и без мультимастера, это будет намного проще и дешевле. Вы не назвали максимальное время реакции, а значит не считали. Посчитайте его и прикиньте. На 32 устроства оно не будет сильно большое. А если еще и скорость задрать..
0
wypuk
0 / 0 / 0
Регистрация: 23.05.2010
Сообщений: 4
03.12.2012, 08:48 11
Цитата Сообщение от itysiy
прям для CAN задача. И 200 метров на большой скорости, и мультимастер. на STM32 он аппаратно реализован очень хорошо. Если все же нужно на авр, то можно поставить CAN контроллер. Или AVR со встроенным CAN. А вообще, мне кажется, можно обойтись и без мультимастера, это будет намного проще и дешевле. Вы не назвали максимальное время реакции, а значит не считали. Посчитайте его и прикиньте. На 32 устроства оно не будет сильно большое. А если еще и скорость задрать..
Да, я уже прочитал про CAN немного. Действительно очень подходит. С AVR просто более менее разобрался, поэтому мне с ним работать проще будет. Раз уж взялся за UART (с RS485) сначала попробую с ним сделать - добить для образовательных целей, ну а потом и за CAN примусь. Если на AVR строить то какие контроллеры с ним работать могут, или какие CAN контроллеры использовать? А на прошлой неделе заказал PINBOARD II с STM32, будет с чем играться. Как кстати!
Насчет времени реакции. При грубом приближении в мультипроцессорном режиме с поочередным опросом каждого устройства то 3 кадра (13 бит) туда, 3 обратно с 32 устройствами: 13*6*32/250000 = 10 мс в худшем случае получается (это если опрос пошел с 1-гоустройства а передать хочет 32-е). Это многовато! Лучше бы 2мс.
0
dikor
0 / 0 / 0
Регистрация: 07.03.2010
Сообщений: 918
03.12.2012, 10:57 12
Мультимастер - очень тяжело. Даже с аппаратным CANом. Гораздо проще отказаться от идеи немедленной передачи, и передавать по фреймам изохронно.
Время полного опроса шины - 4хN фреймов, где N - количество точек в шине. Если задержки в 128 фреймов, то в худшем случае (для скорости 9600 - около 200мс, дальше-меньше).
0
psw
0 / 0 / 0
Регистрация: 28.12.2010
Сообщений: 3
04.12.2012, 00:43 13
а ведь окажется, что нужно опрашивать 30 датчиков температуры и +- 5Сек ни чего не решают.(шутка) Была у меня как то задача сделать стенд для нигазина
торгующего автозвуком. Комплектация примерно такая: 60 головных устройств, 50 пар фронтальной аккустики, 20 тыловой, 10 аккустических усилителей, 4 усилка для сабов и сабов штук 8. Естественно все это добро должно было коммутироваться между собой в любой комбинации. Тоже хотелось наделать мультимастеров....
но очень быстро запутался в разруливании коллизий и сделал как предлагает ТС, 1 мастер и 18 слейвов, все это летало по RS485 на 38600. Скорость можно было увеличить, но после сборки, когда я довольно быстро провел по ряду кнопок рукой, включающих аккустику и все кнопки отработали, решил оставить как есть. Правда у меня посылка была всего 7 байт ( и на запрос и на ответ )
0
vostomy
0 / 0 / 0
Регистрация: 11.02.2011
Сообщений: 187
04.12.2012, 12:44 14
Цитата Сообщение от wypuk
Планирую собрать систему из 2 - 33 устройств обменивающимися данными между собой по UART. В систему входит 1 главное устройство и 1-32 вторичных.
есть такая хрень попадающая под это описание, называется шина LIN
http://www.chipinfo.ru/literature/chipnews/200102/12.html
реализован в линейке недорогих STM8, например полдолларовый STM8S003 его может юзать как UART правильно проиненный (сам еще не добрался подолбаться с этим)
0
tokky
0 / 0 / 0
Регистрация: 06.11.2009
Сообщений: 155
04.12.2012, 13:43 15
[/quote]есть такая хрень попадающая под это описание, называется шина LIN[/quote]
Это же вроде как урезанный CAN, который тут не рекомендовали.
0
Johmmy0007
1 / 1 / 0
Регистрация: 30.08.2011
Сообщений: 9,944
04.12.2012, 13:47 16
Это не CAN, а фактически K-line
0
wypuk
0 / 0 / 0
Регистрация: 23.05.2010
Сообщений: 4
04.12.2012, 13:49 17
Цитата Сообщение от psw
а ведь окажется, что ... +- 5Сек ни чего не решают.
Как раз быстродействие для моей задачи критично и полное время опроса и получения ответа от всех вторичных устройств в 10 мс должно укладываться точно, и даже это многовато.
0
Woddy
0 / 0 / 0
Регистрация: 13.10.2009
Сообщений: 3
04.12.2012, 13:56 18
покурить мануалы на модбас, реализовать его с небольшими изменениями. зачем изобретать велосипед.
ну или вобще на rs485 всё соединить
0
dork
0 / 0 / 0
Регистрация: 25.03.2017
05.12.2012, 17:40 19
Цитата Сообщение от wypuk
Цитата Сообщение от psw
а ведь окажется, что ... +- 5Сек ни чего не решают.
Как раз быстродействие для моей задачи критично и полное время опроса и получения ответа от всех вторичных устройств в 10 мс должно укладываться точно, и даже это многовато.

Тогда курите CAN, голый RS-485 с протоколом ModBus вам скорее всего не поможет.
...Правдо это значит что придется сразу сеть за штурвал болида вместо проверенного тазика.
...но если не умеешь водить раница не велика, без обид )).
0
wypuk
0 / 0 / 0
Регистрация: 23.05.2010
Сообщений: 4
08.12.2012, 20:34 20
Пробую сейчас пока организовать передачу по RS-485 в мультипроцессорном режиме.
С самим процессом приема передачи впринципе разобрался, но вопросик один повис.

Передатчик передает сначала байт адреса с 9-ым битом = 1 (говорит что это байт адреса), а потом байт или несколько байтов данных с 9-ым битом = 0. Приемник принимает 1-й байт, распознает что это адресс и если адресс "свой", то разрешает прием 2-го и последующих байт данных, устанавливая в регистре "UCSRA" бит "MPCM" = 0. После завершения приема данных приемник настраивается на передачу и посылает ответ передатчику, а передатчик в это время наоборот настраивается на прием и ждет ответа от приемника.

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

Ну так вот, в чем вопрос! А если с ошибкой принимается байт адресса? Приемник узнает, что в адрессе ошибка (это если 9-й бит установлен) или вообще посылка игнорируется если вдруг каким-то образом 9-й бит принялся как 0. Что приемнику делать в этом случае? Ведь послать запрос на повторную передачу он не может, т.к. в сети несколько приемников и все они получили байт адресса с ошибкой и начнут посылать запросы на повторную передачу... сеть в этом случае загнется!

Посоветуйте, как обойти эту проблемму. Может кто сталкивался и знает как ее обрулить?

Самому пока только одна мысль в голову приходит: приемником игнорировать неверный адресс, а передатчиком ждать ответа определенное время по окончании которого повторять передачу еще пару раз по этому адрессу (и обьявить ошибку если ответа нет). Но это так сказать решение "в лоб", может найдутся люди знающие более элегантный подход?
0
08.12.2012, 20:34
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.12.2012, 20:34

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

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

Связь между несколькими устройствами через интернет
Всем привет! Как создать "связь" между ПК? Например, есть "Хост" в нем можно регулировать значение...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru