Bascom-AVR и RS-485

Обсуждаем контроллеры компании Atmel.
Ответить
Грызет канифоль
Сообщения: 291
Зарегистрирован: Ср май 26, 2010 20:40:47

Сообщение AlekseyV »

Доброго времени, Коты!
Подскажите пожалуйста коды программ МК (для Bascom-AVR) для связи двух устройств по RS-485, к примеру, ATMega8 <> RS-485 <> ATMega16.
Заранее благодарю.
Реклама
Держит паяльник хвостом
Аватара пользователя
Сообщения: 960
Зарегистрирован: Вс дек 02, 2012 16:58:33
Откуда: от туда

Сообщение GARMIN »

Я вас понимаю, сам пол года назад ничего не понимал в AVR. Если понимаете, или хотите понимать Си, то поставьте CodeVision AVR, он сам вам примеры кода выпишет, мне очень помогло.
Контактная информация:
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3386
Зарегистрирован: Пн окт 11, 2010 19:00:08

Сообщение Мурик »

GARMIN вы не знаете в чем разница между Bascom-AVR и CodeVision? :shock: :facepalm:

По теме. http://bascomavr.3bb.ru/viewtopic.php?id=690
http://bascomavr.3bb.ru/viewtopic.php?id=683
Грызет канифоль
Сообщения: 291
Зарегистрирован: Ср май 26, 2010 20:40:47

Сообщение AlekseyV »

Мурик,
Спасибо за ссылки, полезного нашел не мало - работа с кадрами собственного формата (очень интересно). Но не понял какие команды/операции отвечают конкретно за отправку и прием по RS-485. Если вам известно - пожалуйста, не могли бы вы показать, объяснить?
Реклама
Эиком - электронные компоненты и радиодетали
Собутыльник Кота
Аватара пользователя
Сообщения: 2512
Зарегистрирован: Пн апр 06, 2009 19:33:29
Откуда: Молдова, Кишинев

Сообщение BCluster »

Что за бред? RS-485 это стандарт физического уровня. Причем тут баском или кодвижн вообще неясно. RS-485 не описывает никаких протоколов и прочей требухи. Для работы AVR с RS-485 нужно использовать преобразователь уровней.
http://avrhelp.mcselec.com/index.html?using_rs485.htm
Кстати баском
Контактная информация:
Реклама
Грызет канифоль
Сообщения: 291
Зарегистрирован: Ср май 26, 2010 20:40:47

Сообщение AlekseyV »

BCluster,
Вы не так поняли. Посмотрите: http://members.home.nl/bzijlstra/softwa ... Benbus.htm Человек сам написал свой кадр общения между устройствами формата:
Спойлер' {<dd>#<ss>#<cmd>#<crcl><crch>}

' || || || || |
' || || || || --- End of line
' || || || ||
' || || || | --------------- Checksum (CRC16 CCITT)
' || || || |
' || || || ---------------- Seperator
' || || ||
' || || | --------------------- Cmd
' || || |
' || || ---------------------- Seperator
' || ||
' || | -------------------------- Source address
' || |
' || --------------------------- Seperator
' ||
' | ------------------------------- Destination Address
' |
' -------------------------------- Start Of Line
Реклама
Нашел транзистор. Понюхал.
Сообщения: 190
Зарегистрирован: Пт сен 21, 2007 17:53:23
Откуда: Зарайск

Сообщение mrFox »

RS-485 это физический уровень - электрические характеристики, схема соединения
на уровне подрыгать ножкой это обычно USART
еще выше идет уровень пакетов - проверка на ошибки и передача данных
вот например на основе UNIX SLIP протокол WAKE
Друг Кота
Аватара пользователя
Сообщения: 3386
Зарегистрирован: Пн окт 11, 2010 19:00:08

Сообщение Мурик »

ZN-GAME писал(а):Но не понял какие команды/операции отвечают конкретно за отправку и прием по RS-485.
Те же что и через USART.
Грызет канифоль
Сообщения: 291
Зарегистрирован: Ср май 26, 2010 20:40:47

Сообщение AlekseyV »

Мурик,
Спасибо, разобрался!
Нашел транзистор. Понюхал.
Сообщения: 190
Зарегистрирован: Пт сен 21, 2007 17:53:23
Откуда: Зарайск

Сообщение mrFox »

Мурик писал(а):Те же что и через USART.
не обязательно - можно поставить на выход поставить 2 передатчика и гнать SPI :)
Грызет канифоль
Сообщения: 291
Зарегистрирован: Ср май 26, 2010 20:40:47

Сообщение AlekseyV »

Принимать/отправлять по RS-485 на теории научился.
Подскажите пожалуйста, допустим у меня сообщение содержит 24 символа ASCII. При передаче Print #1, S и приеме Input #1, S оно примется своим объемом или нужно через какую-либо другую операцию извлекать сообщение из буфера именно 24 символа?
Благодарю за помощь!
Нашел транзистор. Понюхал.
Сообщения: 190
Зарегистрирован: Пт сен 21, 2007 17:53:23
Откуда: Зарайск

Сообщение mrFox »

на самом низком уровне прием/передача по 1 байту
передавать лучше пакетами см. протокол WAKE (UNIX SLIP)
в пакете сколько хошь стока байт и отправляй
Грызет канифоль
Сообщения: 291
Зарегистрирован: Ср май 26, 2010 20:40:47

Сообщение AlekseyV »

Доброго времени, котаны!
Размышляю над способом реализации общения между устройствами, соединенными между собой по RS-485 - как согласовать временные интервалы отправки пакетов? К примеру, кол-во подключаемых устройств периодически меняется, сегодня 5 устройств, завтра 30. Мастер отправил пакет (бродкаст) и чтобы все одновременно не начали отправлять обратный ответ, а поочередно. Можно было бы прописать в каждом отдельном устройстве ожидание по определенному времени, а на главном самое большое время ожидания ответа от всех, но нет, сеть должна быть динамическая.
Благодарю за любые мысли и советы!
Держит паяльник хвостом
Сообщения: 933
Зарегистрирован: Ср апр 13, 2011 11:09:20
Откуда: Екатеринбург

Сообщение Alkul »

AlekseyV писал(а):Размышляю над способом реализации общения между устройствами, соединенными между собой по RS-485 - как согласовать временные интервалы отправки пакетов?
Как правило, по технологии RS-485 строят сети, в которых есть одно ведущее устройство (master) и несколько ведомых (slave), и обмен выглядит так - master послал запрос конкретному slave, обращаясь к нему по уникальному адресу. Этот запрос получают все slave сети, но отвечает только тот, чей адрес совпадет с адресом, указанным в пакете запроса. Только при такой реализации сети не встает проблема арбитража.
На физическом уровне в сетях RS-485 арбитраж не реализован вообще, поэтому при наличии в сети нескольких master'ов (устройств, могущих инициировать обмен данными) проблему арбитража придется решать средствами протокола. На аппаратном уровне при этом передающему master'у придется "слушать сеть", то есть, принимать свой собственный пакет и сравнивать его с тем, что передавалось. Если пакет принялся с искажениями, значит, имела место коллизия - одновременная передача в сеть несколькими устройствами. В этом случае, например, устройство должно прекратить передачу и начать её снова после временнОго интервала случайной длительности.
В общем, все это сложно для новичка, поэтому лучше строить сеть с одним master'ом и несколькими slave'ми.
AlekseyV писал(а):К примеру, кол-во подключаемых устройств периодически меняется, сегодня 5 устройств, завтра 30.
В этом случае master последовательным опросом всех возможных адресов должен определить наличие устройств в сети. Ввести в протокол обмена короткую команду инициализации или что-то в этом роде, которую посылает master, и на которую slave должен дать короткий ответ.
Master создает в своей памяти таблицу занятых адресов из всего адресного пространства, можно тут же указать идентификаторы устройств, если они есть. И периодически проверять "свободные" адреса на предмет появления новых устройств с такими адресами.
Или можно сделать так, чтобы после подключения или отключения новых устройств давать master'у команду на обновление таблицы адресов.
AlekseyV писал(а):Мастер отправил пакет (бродкаст) и чтобы все одновременно не начали отправлять обратный ответ, а поочередно.
Бродкастовыми пакетами лучше делать те, на которые не нужно отвечать. Например, команда установки времени. Её можно сделать бродкастовой, ответ на неё не требуется. Или какая-нибудь команда начала измерения.
А для подтверждения того, что ведомые приняли команду, можно после посылки бродкастовой команды последовательно опросить всех ведомых и проверить, выполняют ли они полученную команду.
Вообще, в такой сети лучше не злоупотреблять бродкастовыми командами. Только необходимый минимум. А самое лучшее - вообще обойтись без них.

Как-то так. Найдите описание протокола ModBus, он как раз и реализует такую логику обмена. Никто не мешает также "допилить" этот протокол под свои требования.
Последний раз редактировалось Alkul Вт май 20, 2014 21:24:08, всего редактировалось 1 раз.
Друг Кота
Аватара пользователя
Сообщения: 4779
Зарегистрирован: Сб апр 02, 2011 12:40:46
Откуда: Минск

Сообщение Леонид Иванович »

Более свежая реализация Wake с исходниками здесь: http://digit-el.com/files/open/wake/wake.html
Контактная информация:
Грызет канифоль
Сообщения: 291
Зарегистрирован: Ср май 26, 2010 20:40:47

Сообщение AlekseyV »

Alkul писал(а):Ввести в протокол обмена короткую команду инициализации или что-то в этом роде, которую посылает master, и на которую slave должен дать короткий ответ.
Master создает в своей памяти таблицу занятых адресов из всего адресного пространства, можно тут же указать идентификаторы устройств, если они есть. И периодически проверять "свободные" адреса на предмет появления новых устройств с такими адресами.
Пожалуй, то, что мне и нужно.
Благодарю за помощь!
Ответить

Вернуться в «AVR»