Страница 1 из 1
как бы реализовать протокол?
Добавлено: Сб фев 27, 2016 10:02:46
Nikitka
Хочу придумать протокол. Но никак не могу найти решение.
Задача: Есть 8 датчиков, которые ловят вспышки. Каждый из датчиков основан на контроллере Atmega8. Т.е. там фото приёмник, ацп, который регистрирует яркость вспышки. Есть центральная "база" которая должна собирать информацию и передавать последовательно её в пункт управления. Все датчики и база, подключены между собой витой парой RJ-45 (4 пары) т.е. восемь проводов. По этим проводам должно посылаться питание +12 вольт, Земля, и остальные 6 проводов получается выделяются на передачу данных. Каждый датчик может послать 8+8+8 бит информации. Задача придумать протокол общения с базой. В плане. вспышки могут быть одновременно быть на датчиках. Тогда считанные доли микросекунд которые микроконтроллер успеет обработать информацию играют роль, т.е. первым по каналу данных должен послать тот датчик который и на доли миллисекунд зарегистрировал вспышку быстрее, а тот который опоздал, должен ждать пока канал связи не освободится, что бы не мешать передачи информации. Но что если вдруг датчиков которые зарегистрировали вспышку три, то получается один посылает, информацию два ждут пока линия связи освободится, и как только освободилась они моментально посылают информацию и получается мешают друг друга, ведь они не могут понять кто должен быть первым, а кто вторым. Максимальное количество датчиков которые могут практически одновременно принять световой сигнал, это четыре из восьми. Но надо именно порядок соблюдать. но как это сделать...(
Re: как бы реализовать протокол?
Добавлено: Сб фев 27, 2016 10:14:16
smacorp
Nikitka, как-то синхронизировать датчики между собой. И маловато вводных - хорошо бы знать насколько большое расстояние между датчиками, а также между датчиками и центральной базой. И периодичность самих вспышек, а также их характер - должны быть через равные промежутки времени или случайны?
Re: как бы реализовать протокол?
Добавлено: Сб фев 27, 2016 10:31:03
Андрей СШ
Надо одну пару выделить под сигналы точного времени.
Другую под RS485.
Головной контроллер регулярно посылает импульсы точного времени.
Датчики по ним синхронизируются.
При появлении вспышки каждый датчик запоминает время.
Головной контроллер по кругу опрашивает датчики. Тут можно ModBus или похожий велосипед использовать.
Re: как бы реализовать протокол?
Добавлено: Сб фев 27, 2016 10:39:19
Vov123
Я может мало что понял, но ,вероятно, надо сделать типа modbus, чтобы периферийное устройство вместе с массивом данных, в первой переменной передавал адрес устройства. А "база" сама отсортирует.
Re: как бы реализовать протокол?
Добавлено: Сб фев 27, 2016 11:36:27
Z_h_e
Почитайте про шину CAN. Я сам ей не пользовался, но когда-то для ознакомления читал, сильно не углубляясь.
Помнится мне смысл протокола такой. Пускай сигнал передается по проводу. Тогда линия по умолчанию подтянута к питанию. У каждого устройства свой уникальный адрес. Приоритет адресов обратный, т.е. самое "блатное" устройство с номером 0. Когда устройство хочет что-то передать, слушает шину и начинает передавать когда шина свободна, выход типа открытый коллектор. Пакет начинается с адреса устройства. Передавая адрес, устройство одновременно проверяет что передается по факту и если вдруг вместо лог.1 адреса на шине по факту лог.0, то это означает что передача началась одновременно с другим устройством, с более приоритетным адресом. Устройство с "лошарским" адресом тут же затыкается на стадии передачи адреса.
Re: как бы реализовать протокол?
Добавлено: Сб фев 27, 2016 11:46:31
L.O.D
Или как в езернете - передающий (убедившись, что канал свободен) начинает передачу и одновременно слушает среду передачи, при обнаружении коллизии (данные в физике не соответствуют переданным) замолкает на случайное время. Алгоритм выбора случайной паузы должен обеспечивать разные паузы у разных передатчиков, например, рандомайзом с номером/идентификатором передатчика.
Re: как бы реализовать протокол?
Добавлено: Сб фев 27, 2016 12:27:33
НАПАЛМ
Очевидно, 1 провод земля, другой питание, 3 тактирование, все остальные - линия данных. Каждому устройству по имени. Высылаете номер устройства - ждете ответа, опрос по порядку.
Re: как бы реализовать протокол?
Добавлено: Сб фев 27, 2016 12:42:07
Nikitka
вспышки хаотично, у них порядка, их регистрируют датчики, сразу регистрация и сразу посыл информации. Если делать опрос датчиков то это время. И опять же может случится так, опрашиваем по очерёдности, первый, второй, третий и т.д. вспышка произошла на первом и на шестом, но на первом раньше, а опрос идет на третьем, т.е. получается что пошлет информацию сначала шестой, а потом первый датчик, а это будет не верно ибо первый получил первый вспышку. Я тоже думал про опрос.
Расстояние между датчиками маленькое, едва метр накопится, даже меньше.
Re: как бы реализовать протокол?
Добавлено: Сб фев 27, 2016 13:40:45
Андрей СШ
У вас какое то выборочное чтение чужих сообщений.
Если прочитать полностью, то ответ там есть. Если не читать, то зачем вообще было спрашивать.
Re: как бы реализовать протокол?
Добавлено: Сб фев 27, 2016 14:26:49
Nikitka
я читал, буду пытаться реализовывать, просто я отвечаю тем, кто не совсем понял видимо задачу.
Re: как бы реализовать протокол?
Добавлено: Сб фев 27, 2016 17:32:06
ARV
если вы не ограничены в проводах, то предлагаю совсем иначе поступить, чем вам тут советуют. не критикуя чужие советы, вот что я скажу: каждый "датчик" соединяете с базой 4 проводами: 2 питание, один информационный, один сигнальный.
Датчик сработал - сразу же выдает на "сигнальный" провод импульс заданного уровня, например, 0.
База все сигнальные линии принимает на один порт, по изменению уровня на любом пине которого срабатывает прерывание. Т.е. любой датчик сработал - база тут же получает прерывание и узнает, какой первый, какой второй и т.д. Затем база на сигнальный провод того датчика, который ей нужен (первый сработавший или любой, как у вас надо по логике работы) выдает сама импульс, по которому датчик понимает, что ему пора передавать данные. Пока такой импульс он не получил - он молчит и не передает ничего. Ну а передача идет обычным USART-ом: линии TX всех датчиков соединены в один провод и попадают на RX базы.
Пока датчик не получил сигнал разрешения передачи, он держит TX в высокоимпедансном состоянии, т.е. никак не мешает другим датчикам. Когда передачу он провел, снова переводит в Z-состояние TX, а база к тому моменту даст разрешение другому.
Таким образом, у вас 100% не может быть никаких коллизий, протокол получается очень простой. при этом база всегда сможет засечь "доли миллисекунд" между срабатываниями датчиков, если то необходимо, конечно.
Минусов у моей идеи два: много проводов и при длинных линиях придется чуток усложнять схему, чтобы застраховаться от всяких наводок и помех. Зато никаких мучений в программной реализации, и никакого CAN не надо, можно чуть ли не на attiny13 сделать датчик, а базу - на atmega88.
Re: как бы реализовать протокол?
Добавлено: Сб фев 27, 2016 18:36:06
oleg110592
еще предложу идею - можно использовать базовый микроконтроллер с необходимым количеством UART. Раз раздел AVR, например ATxmega64A1 с 8 UART
http://www.atmel.com/devices/ATXMEGA64A ... parameters
Re: как бы реализовать протокол?
Добавлено: Сб фев 27, 2016 19:41:42
Z_h_e
Nikitka писал(а):Все датчики и база, подключены между собой витой парой RJ-45 (4 пары) т.е. восемь проводов.
================
6 проводов. Все подтянуты к плюсу.
1. Старт кадра от базы (провод 0). Все датчики в положение "нуль".
2. Строб от базы (провод 1) - запрос состояния датчиков.
3 Все датчики с наличием вспышки отвечают своим адресом(провод 2-4) плюс строб (провод 1). Если датчик увидел свой выставленный адрес, то передает данные (по проводу 5) и молчит до п.1. Если не увидел, то передаст его еще раз после п.2.
4 Если кто то ответил, то база в п.2.
5. в п1.
Если нет вспышек, то опрос будет происходить быстро.
Re: как бы реализовать протокол?
Добавлено: Сб фев 27, 2016 20:17:41
oleg110592
не я первый предположил, что 8 проводов маловато будет - надо будет 4*8=32 провода, всего то 4 дешевых кабеля витая пара.
Z_h_e писал(а):6 проводов. Все подтянуты к плюсу...
вполне неплохо, а если помеха - может быть ложный старт кадра, ложный строб, ложный адрес, искаженные данные и т.д.. Имхо база должна подтверждать правильный прием - типа если CRC не сошлось, давай еще раз.
Re: как бы реализовать протокол?
Добавлено: Ср мар 02, 2016 08:24:53
VAT
синхронизировать периодически все датчики широковещательной командой и потом опрашивать их по кругу в спокойном режиме. Либо 8компортов на базе , либо каждому датчику уникальный адрес. и никаких конфликтов.
Либо опрашивать их по кругу четко повремени - тогда синхрокоманда не потребуется.
Re: как бы реализовать протокол?
Добавлено: Ср мар 02, 2016 08:33:57
kaetzchen
FIFO готовое решение
Re: как бы реализовать протокол?
Добавлено: Ср мар 02, 2016 11:33:03
Z_h_e
Можно попробовать соединить датчики последовательно. Самый дальний датчик передает данные соседнему, который передает данные следующему и если надо добавляет свои и так до базы. А хотя лучше наверное не добавлять в один пакет доп.данные.
Есть существенный минус при простоте реализации, данные от дальнего датчика придут с наибольшим запаздыванием. Опять же все датчики можно тактировать от одного генератора, и в пакете указывать условное время возникновения вспышки.
Пропускная способность такого конвеера должна быть соответствовать максимальной частоте вспышек умножить на количество датчиков.
Re: как бы реализовать протокол?
Добавлено: Ср мар 02, 2016 12:05:45
OKF
Nikitka, вы скажите что нужно мастеру?
Собрать инфо со всех датчиков? Собрали.
Определить очерёдность срабатывания? Определили.
Дальше что?
Нормально опишите задачу.
Re: как бы реализовать протокол?
Добавлено: Ср мар 02, 2016 21:41:17
OKF
Может логичнее так.
Датчики фиксируют время вспышки, которое выдают мастеру по запросу.
А тот уже сортирует как хочет. Не?