как бы реализовать протокол?
как бы реализовать протокол?
Хочу придумать протокол. Но никак не могу найти решение.
Задача: Есть 8 датчиков, которые ловят вспышки. Каждый из датчиков основан на контроллере Atmega8. Т.е. там фото приёмник, ацп, который регистрирует яркость вспышки. Есть центральная "база" которая должна собирать информацию и передавать последовательно её в пункт управления. Все датчики и база, подключены между собой витой парой RJ-45 (4 пары) т.е. восемь проводов. По этим проводам должно посылаться питание +12 вольт, Земля, и остальные 6 проводов получается выделяются на передачу данных. Каждый датчик может послать 8+8+8 бит информации. Задача придумать протокол общения с базой. В плане. вспышки могут быть одновременно быть на датчиках. Тогда считанные доли микросекунд которые микроконтроллер успеет обработать информацию играют роль, т.е. первым по каналу данных должен послать тот датчик который и на доли миллисекунд зарегистрировал вспышку быстрее, а тот который опоздал, должен ждать пока канал связи не освободится, что бы не мешать передачи информации. Но что если вдруг датчиков которые зарегистрировали вспышку три, то получается один посылает, информацию два ждут пока линия связи освободится, и как только освободилась они моментально посылают информацию и получается мешают друг друга, ведь они не могут понять кто должен быть первым, а кто вторым. Максимальное количество датчиков которые могут практически одновременно принять световой сигнал, это четыре из восьми. Но надо именно порядок соблюдать. но как это сделать...(
Задача: Есть 8 датчиков, которые ловят вспышки. Каждый из датчиков основан на контроллере Atmega8. Т.е. там фото приёмник, ацп, который регистрирует яркость вспышки. Есть центральная "база" которая должна собирать информацию и передавать последовательно её в пункт управления. Все датчики и база, подключены между собой витой парой RJ-45 (4 пары) т.е. восемь проводов. По этим проводам должно посылаться питание +12 вольт, Земля, и остальные 6 проводов получается выделяются на передачу данных. Каждый датчик может послать 8+8+8 бит информации. Задача придумать протокол общения с базой. В плане. вспышки могут быть одновременно быть на датчиках. Тогда считанные доли микросекунд которые микроконтроллер успеет обработать информацию играют роль, т.е. первым по каналу данных должен послать тот датчик который и на доли миллисекунд зарегистрировал вспышку быстрее, а тот который опоздал, должен ждать пока канал связи не освободится, что бы не мешать передачи информации. Но что если вдруг датчиков которые зарегистрировали вспышку три, то получается один посылает, информацию два ждут пока линия связи освободится, и как только освободилась они моментально посылают информацию и получается мешают друг друга, ведь они не могут понять кто должен быть первым, а кто вторым. Максимальное количество датчиков которые могут практически одновременно принять световой сигнал, это четыре из восьми. Но надо именно порядок соблюдать. но как это сделать...(
Re: как бы реализовать протокол?
Nikitka, как-то синхронизировать датчики между собой. И маловато вводных - хорошо бы знать насколько большое расстояние между датчиками, а также между датчиками и центральной базой. И периодичность самих вспышек, а также их характер - должны быть через равные промежутки времени или случайны?
Платы для HLDI - установки лазерной засветки фоторезиста.
Фоторезист Ordyl Alpha 350
Жидкое олово для лужения плат (видео) - самое лучшее и только у меня.
Паяльные маски XV501T-4 и KSM-S6189 (5 цветов).
Заказ печатных плат - pcbsmac@gmail.com
Фоторезист Ordyl Alpha 350
Жидкое олово для лужения плат (видео) - самое лучшее и только у меня.
Паяльные маски XV501T-4 и KSM-S6189 (5 цветов).
Заказ печатных плат - pcbsmac@gmail.com
Re: как бы реализовать протокол?
Надо одну пару выделить под сигналы точного времени.
Другую под RS485.
Головной контроллер регулярно посылает импульсы точного времени.
Датчики по ним синхронизируются.
При появлении вспышки каждый датчик запоминает время.
Головной контроллер по кругу опрашивает датчики. Тут можно ModBus или похожий велосипед использовать.
Другую под RS485.
Головной контроллер регулярно посылает импульсы точного времени.
Датчики по ним синхронизируются.
При появлении вспышки каждый датчик запоминает время.
Головной контроллер по кругу опрашивает датчики. Тут можно ModBus или похожий велосипед использовать.
Re: как бы реализовать протокол?
Я может мало что понял, но ,вероятно, надо сделать типа modbus, чтобы периферийное устройство вместе с массивом данных, в первой переменной передавал адрес устройства. А "база" сама отсортирует.
- Z_h_e
- Собутыльник Кота
- Сообщения: 2708
- Зарегистрирован: Сб май 14, 2011 21:16:04
- Откуда: г. Чайковский
Re: как бы реализовать протокол?
Почитайте про шину CAN. Я сам ей не пользовался, но когда-то для ознакомления читал, сильно не углубляясь.
Помнится мне смысл протокола такой. Пускай сигнал передается по проводу. Тогда линия по умолчанию подтянута к питанию. У каждого устройства свой уникальный адрес. Приоритет адресов обратный, т.е. самое "блатное" устройство с номером 0. Когда устройство хочет что-то передать, слушает шину и начинает передавать когда шина свободна, выход типа открытый коллектор. Пакет начинается с адреса устройства. Передавая адрес, устройство одновременно проверяет что передается по факту и если вдруг вместо лог.1 адреса на шине по факту лог.0, то это означает что передача началась одновременно с другим устройством, с более приоритетным адресом. Устройство с "лошарским" адресом тут же затыкается на стадии передачи адреса.
Помнится мне смысл протокола такой. Пускай сигнал передается по проводу. Тогда линия по умолчанию подтянута к питанию. У каждого устройства свой уникальный адрес. Приоритет адресов обратный, т.е. самое "блатное" устройство с номером 0. Когда устройство хочет что-то передать, слушает шину и начинает передавать когда шина свободна, выход типа открытый коллектор. Пакет начинается с адреса устройства. Передавая адрес, устройство одновременно проверяет что передается по факту и если вдруг вместо лог.1 адреса на шине по факту лог.0, то это означает что передача началась одновременно с другим устройством, с более приоритетным адресом. Устройство с "лошарским" адресом тут же затыкается на стадии передачи адреса.
Re: как бы реализовать протокол?
Или как в езернете - передающий (убедившись, что канал свободен) начинает передачу и одновременно слушает среду передачи, при обнаружении коллизии (данные в физике не соответствуют переданным) замолкает на случайное время. Алгоритм выбора случайной паузы должен обеспечивать разные паузы у разных передатчиков, например, рандомайзом с номером/идентификатором передатчика.
- Из овощей я больше всего люблю пельмени... © Соседский Мальчик
- НАПАЛМ
- Это не хвост, это антенна
- Сообщения: 1314
- Зарегистрирован: Пт ноя 27, 2009 19:47:13
- Откуда: Казань
Re: как бы реализовать протокол?
Очевидно, 1 провод земля, другой питание, 3 тактирование, все остальные - линия данных. Каждому устройству по имени. Высылаете номер устройства - ждете ответа, опрос по порядку.
Re: как бы реализовать протокол?
вспышки хаотично, у них порядка, их регистрируют датчики, сразу регистрация и сразу посыл информации. Если делать опрос датчиков то это время. И опять же может случится так, опрашиваем по очерёдности, первый, второй, третий и т.д. вспышка произошла на первом и на шестом, но на первом раньше, а опрос идет на третьем, т.е. получается что пошлет информацию сначала шестой, а потом первый датчик, а это будет не верно ибо первый получил первый вспышку. Я тоже думал про опрос.
Расстояние между датчиками маленькое, едва метр накопится, даже меньше.
Расстояние между датчиками маленькое, едва метр накопится, даже меньше.
Re: как бы реализовать протокол?
У вас какое то выборочное чтение чужих сообщений.
Если прочитать полностью, то ответ там есть. Если не читать, то зачем вообще было спрашивать.
Если прочитать полностью, то ответ там есть. Если не читать, то зачем вообще было спрашивать.
Re: как бы реализовать протокол?
я читал, буду пытаться реализовывать, просто я отвечаю тем, кто не совсем понял видимо задачу.
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: как бы реализовать протокол?
если вы не ограничены в проводах, то предлагаю совсем иначе поступить, чем вам тут советуют. не критикуя чужие советы, вот что я скажу: каждый "датчик" соединяете с базой 4 проводами: 2 питание, один информационный, один сигнальный.
Датчик сработал - сразу же выдает на "сигнальный" провод импульс заданного уровня, например, 0.
База все сигнальные линии принимает на один порт, по изменению уровня на любом пине которого срабатывает прерывание. Т.е. любой датчик сработал - база тут же получает прерывание и узнает, какой первый, какой второй и т.д. Затем база на сигнальный провод того датчика, который ей нужен (первый сработавший или любой, как у вас надо по логике работы) выдает сама импульс, по которому датчик понимает, что ему пора передавать данные. Пока такой импульс он не получил - он молчит и не передает ничего. Ну а передача идет обычным USART-ом: линии TX всех датчиков соединены в один провод и попадают на RX базы.
Пока датчик не получил сигнал разрешения передачи, он держит TX в высокоимпедансном состоянии, т.е. никак не мешает другим датчикам. Когда передачу он провел, снова переводит в Z-состояние TX, а база к тому моменту даст разрешение другому.
Таким образом, у вас 100% не может быть никаких коллизий, протокол получается очень простой. при этом база всегда сможет засечь "доли миллисекунд" между срабатываниями датчиков, если то необходимо, конечно.
Минусов у моей идеи два: много проводов и при длинных линиях придется чуток усложнять схему, чтобы застраховаться от всяких наводок и помех. Зато никаких мучений в программной реализации, и никакого CAN не надо, можно чуть ли не на attiny13 сделать датчик, а базу - на atmega88.
Датчик сработал - сразу же выдает на "сигнальный" провод импульс заданного уровня, например, 0.
База все сигнальные линии принимает на один порт, по изменению уровня на любом пине которого срабатывает прерывание. Т.е. любой датчик сработал - база тут же получает прерывание и узнает, какой первый, какой второй и т.д. Затем база на сигнальный провод того датчика, который ей нужен (первый сработавший или любой, как у вас надо по логике работы) выдает сама импульс, по которому датчик понимает, что ему пора передавать данные. Пока такой импульс он не получил - он молчит и не передает ничего. Ну а передача идет обычным USART-ом: линии TX всех датчиков соединены в один провод и попадают на RX базы.
Пока датчик не получил сигнал разрешения передачи, он держит TX в высокоимпедансном состоянии, т.е. никак не мешает другим датчикам. Когда передачу он провел, снова переводит в Z-состояние TX, а база к тому моменту даст разрешение другому.
Таким образом, у вас 100% не может быть никаких коллизий, протокол получается очень простой. при этом база всегда сможет засечь "доли миллисекунд" между срабатываниями датчиков, если то необходимо, конечно.
Минусов у моей идеи два: много проводов и при длинных линиях придется чуток усложнять схему, чтобы застраховаться от всяких наводок и помех. Зато никаких мучений в программной реализации, и никакого CAN не надо, можно чуть ли не на attiny13 сделать датчик, а базу - на atmega88.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- oleg110592
- Друг Кота
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
Re: как бы реализовать протокол?
еще предложу идею - можно использовать базовый микроконтроллер с необходимым количеством UART. Раз раздел AVR, например ATxmega64A1 с 8 UART http://www.atmel.com/devices/ATXMEGA64A ... parameters
- Z_h_e
- Собутыльник Кота
- Сообщения: 2708
- Зарегистрирован: Сб май 14, 2011 21:16:04
- Откуда: г. Чайковский
Re: как бы реализовать протокол?
Nikitka писал(а):Все датчики и база, подключены между собой витой парой RJ-45 (4 пары) т.е. восемь проводов.
================
6 проводов. Все подтянуты к плюсу.
1. Старт кадра от базы (провод 0). Все датчики в положение "нуль".
2. Строб от базы (провод 1) - запрос состояния датчиков.
3 Все датчики с наличием вспышки отвечают своим адресом(провод 2-4) плюс строб (провод 1). Если датчик увидел свой выставленный адрес, то передает данные (по проводу 5) и молчит до п.1. Если не увидел, то передаст его еще раз после п.2.
4 Если кто то ответил, то база в п.2.
5. в п1.
Если нет вспышек, то опрос будет происходить быстро.
Последний раз редактировалось Z_h_e Сб фев 27, 2016 20:38:06, всего редактировалось 1 раз.
- oleg110592
- Друг Кота
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
Re: как бы реализовать протокол?
не я первый предположил, что 8 проводов маловато будет - надо будет 4*8=32 провода, всего то 4 дешевых кабеля витая пара.
вполне неплохо, а если помеха - может быть ложный старт кадра, ложный строб, ложный адрес, искаженные данные и т.д.. Имхо база должна подтверждать правильный прием - типа если CRC не сошлось, давай еще раз.
Z_h_e писал(а):6 проводов. Все подтянуты к плюсу...
вполне неплохо, а если помеха - может быть ложный старт кадра, ложный строб, ложный адрес, искаженные данные и т.д.. Имхо база должна подтверждать правильный прием - типа если CRC не сошлось, давай еще раз.
Re: как бы реализовать протокол?
синхронизировать периодически все датчики широковещательной командой и потом опрашивать их по кругу в спокойном режиме. Либо 8компортов на базе , либо каждому датчику уникальный адрес. и никаких конфликтов.
Либо опрашивать их по кругу четко повремени - тогда синхрокоманда не потребуется.
Либо опрашивать их по кругу четко повремени - тогда синхрокоманда не потребуется.
Re: как бы реализовать протокол?
FIFO готовое решение
- Z_h_e
- Собутыльник Кота
- Сообщения: 2708
- Зарегистрирован: Сб май 14, 2011 21:16:04
- Откуда: г. Чайковский
Re: как бы реализовать протокол?
Можно попробовать соединить датчики последовательно. Самый дальний датчик передает данные соседнему, который передает данные следующему и если надо добавляет свои и так до базы. А хотя лучше наверное не добавлять в один пакет доп.данные.
Есть существенный минус при простоте реализации, данные от дальнего датчика придут с наибольшим запаздыванием. Опять же все датчики можно тактировать от одного генератора, и в пакете указывать условное время возникновения вспышки.
Пропускная способность такого конвеера должна быть соответствовать максимальной частоте вспышек умножить на количество датчиков.
Есть существенный минус при простоте реализации, данные от дальнего датчика придут с наибольшим запаздыванием. Опять же все датчики можно тактировать от одного генератора, и в пакете указывать условное время возникновения вспышки.
Пропускная способность такого конвеера должна быть соответствовать максимальной частоте вспышек умножить на количество датчиков.
Re: как бы реализовать протокол?
Nikitka, вы скажите что нужно мастеру?
Собрать инфо со всех датчиков? Собрали.
Определить очерёдность срабатывания? Определили.
Дальше что?
Нормально опишите задачу.
Собрать инфо со всех датчиков? Собрали.
Определить очерёдность срабатывания? Определили.
Дальше что?
Нормально опишите задачу.
Re: как бы реализовать протокол?
Может логичнее так.
Датчики фиксируют время вспышки, которое выдают мастеру по запросу.
А тот уже сортирует как хочет. Не?
Датчики фиксируют время вспышки, которое выдают мастеру по запросу.
А тот уже сортирует как хочет. Не?
