Я построил этот идентификационный датчик для гусеничной тележки Scalextric на основе PIC12F629. Датчик идентификации отправляет идентификатор обнаруженного автомобиля в виде сигнала RS232 на один контакт (уровень TTL).
Мой вопрос в том, как я могу получать данные с четырех таких микроконтроллеров на USART другого микроконтроллера (PIC18F2550)?
Я придумал эти возможности:
Каждый чип датчика ID будет закодирован идентификатором, который отправляется как часть данных, чтобы их можно было разделить на принимающей стороне.
Обновление: добавлена дополнительная информация об оборудовании датчика.
Если вы настроите свой протокол так, чтобы автомобили отвечали только на запросы контроллера, то вы можете просто связать (по крайней мере, на логическом уровне) всех вместе.
Хитрость заключается в том, есть ли у вас настоящий RS-232 (с 1 = от -6 до -12 В и 0 = от 6 до 12 В) или просто стандартная логическая линия (1 = VCC, 0 = GND). Либо техпаспорт, либо область применения должны ответить на этот вопрос.
Если это стандартная логика, это может быть очень просто. Если ваши датчики могут управлять своими выходными драйверами, запрограммируйте их так, чтобы они не управляли выходом, если сообщение не выходит. Если вам приходится постоянно оставлять выходной драйвер включенным, пусть он управляет одним или двумя транзисторами, чтобы создать конфигурацию «открытый коллектор», соедините коллекторы всех датчиков вместе и подтяните подключенную линию к VCC и подключите ее к контакт RX вашего основного контроллера. Это работает, потому что протокол RS-232 бездействует в состоянии логической 1. Если используются уровни сигнала RS-232, то вам придется немного изменить конфигурацию транзистора, но в основе он все равно будет с открытым коллектором.
Главный контроллер просто последовательно запрашивает данные каждого датчика. Каждый датчик отвечает на запрос. Таким образом, у вас не будет больше одного управляющего линией RX одновременно, что является главной целью.
Теперь, если вы не можете заставить свои датчики говорить только тогда, когда с ними разговаривают... тогда ваша проблема сильно усложнилась. Настолько, что простой ответ состоит в том, чтобы дать каждому датчику свой собственный последовательный порт, возможно, используя 8-контактные контроллеры в качестве менеджеров датчиков, которые затем можно подключить к совместной последовательной шине. Другие методы, такие как обнаружение коллизий с повторной передачей сообщений (например, 10base-T Ethernet), намного сложнее.
Если ваш датчик может разместить «готовую» линию и отложить любые события, которые приходят, когда он не подтвержден, и передать их, когда он есть, лучше всего послать отдельный провод «занято» к каждому датчику и использовать логический элемент «И» для объединить сигналы со всех датчиков. Я бы посоветовал, если у вас есть четыре датчика, вы должны циклически переключать «готовые» провода с некоторым «мертвым» временем между ними (когда никто не «готов»); если байт поступает в течение «мертвого» времени, предположим, что он был отправлен последним активным датчиком. Установите достаточное время «готовности», чтобы датчик мог среагировать, и время простоя, достаточное для того, чтобы у датчика было время завершить передачу события, которое происходит непосредственно перед тем, как его линия «готовности» была отменена.
Редактировать
Основываясь на дальнейших описаниях, учитывая, что, по-видимому, каждый датчик имеет отдельный известный идентификационный номер, я думаю, что лучшим подходом может быть наличие одной последовательной линии, которая подключена к выходу ШИМ через параллельный резистор и диод, так что он вытягивается поднимается на 1900 мкс каждые 2 мс, но снижается на 200 мкс (если бы можно было переключать ШИМ между активным-низким и плавающим, это было бы еще лучше). Как только машина будет замечена, датчик должен запустить следующий конечный автомат, отслеживая, сколько десятков микросекунд прошло с момента начала его выполнения.
Используя UART, этот подход должен позволять обрабатывать автомобили, поступающие на любой датчик в любом порядке, и разрешать их тайминги в пределах 10 мкс, при условии, что автомобили будут обрабатываться последовательно со скоростью один каждые 2 мс, а датчики будут «слепые» в промежутке между моментом, когда они видят машину, и временем, когда основной процессор начинает ее обрабатывать. Если нет действительно огромного количества датчиков, это не должно создавать проблемы. Обратите внимание, что основной ЦП не должен иметь точной синхронизации ни для чего, кроме ШИМ-выхода. Все остальное можно вывести из потока последовательных данных (включая «длинные перерывы», возникающие из-за «низких» импульсов ШИМ).
Вы можете реализовать протокол MODBUS в режиме RTU с интерфейсом RS485, который отлично работает на PIC (не уверен насчет вашего PIC).
У вас может быть многоточечная линия для размещения ваших различных микроконтроллерных устройств и хорошая связь между ними через последовательный UART.
Вы можете сделать свой PIC18F2550 мастером, который будет инициировать транзакцию с любых других 4 контроллеров.
Используйте мультиплексирование с временным разделением. Мастер посылает синхроимпульс по отдельной линии, которую ведомые используют для сброса таймера. Когда подчиненное устройство имеет данные для отправки, оно ждет, пока таймер не сравняется (номер подчиненного устройства * ширина временного интервала) перед отправкой. Временной интервал должен быть достаточно длинным для отправки пакета и учета неточности часов между датчиками.
Электрически вы можете захотеть подтянуть общую линию TX и переключаться между 0 и тройным состоянием для передачи вместо источника тока для утверждения 1.
Я нашел этот сайт с решением под названием BlackNet. Он основан на довольно простом протоколе, идея которого заключается в том, что каждый узел в сети имеет собственный временной интервал. Т.е. это какая-то круговая логика. Последнее изображение на странице показывает схему с наименьшим количеством компонентов, необходимых для ее работы.
Я воспользовался этой идеей и просто подключил два встроенных датчика непосредственно к контакту RX на PIC18F2550. Однако я не реализовал протокол циклического перебора, а просто передавал данные по битам в линию (и надеюсь, что только один передает за раз). До сих пор это действительно работало довольно хорошо...
Для будущих читателей: если важно, чтобы ваши данные всегда проходили, решение, которое я использовал, вероятно, не очень хорошая идея. Однако, если вы редко отправляете данные и можете смириться с возможностью их коллизий, и вам нужно самое простое решение, я думаю, что этого достаточно.
Олин Латроп
Майк Дезимоун
Анту
Анту