Приветствую
Есть ведущий МК и несколько ведомых. Адреса ведомых изначально задать нет возможности. Поэтому необходимо при включении производить автоприсвоение адресов. Что-то подобное есть в SMBus, но информация об этом крайне скудна...
Поделитесь, пожалуйста, своими соображениями по решению вопроса =)
P.S. Первая мысль это присвоить всем ведомым начальный адрес. Мастер отправляет на него запрос и те, которые не имеют личного адреса, откликаются. Проблема в том, что они откликнутся одновременно
Alkul писал(а): Программы ведомых совсем не отличаются?
Да, абсолютно идентичные. Единственное, в них, возможно будет прописываться серийный номер уже после прошивки.
igor-x писал(а): как мне представляется решение = если slave, при включении программы имеет начальный адрес, он обращается к мастеру - выделить ему
очередной номер. но это мультимастерная схема (если не ошибаюсь,может быть реализована на AVR, так как протокол TWI позволяет легко переключаться в режимы Master-Slave).
Получается, каждый бездомный slave по очереди становится мастером. Но что это дает? По-моему это породит ещё больше проблем
Psych писал(а):Подключать ведомые по очереди нельзя??
Не желательно. Это сильно усложнит процесс наладки.
У меня есть масса разработок с одним мастером и несколькими слугами. Но всегда нужно однозначно идентифицировать подчиненного. Те автоприсвоение как-то не вяжется. Как Вы потом будете определять кто из них физически получил адрес, скажем 8?
Я понимаю Вашк проблему - не хочется делать различные прошивки для подчиненных МК, хочется, чтоб они были одинаковыми. Я пошел простым путем - перемычки. При включении опрашивается порт, проверяется состояние перемычек (0-резисторов) и определяется собственный адрес. Это самый надежный способ, который исключает путаницу.
Есть еще один метод - передача "эстафетной палочки" или маркера. Для этого потребуется 2 свободных порта на каждом МК. Если интересует - могу нарисовать схемку и алгоритм, только вечером...
Похожую задачу приходится решать в сетях с протоколом Wake. Присвоение адреса делаю по ходу монтажа сети. Изначально во все слэйвы записан технологический адрес. Монтирую и подключаю первый слэйв. По технологическому адресу задаю ему нужный адрес, согласно месту и функциям в системе. Затем добавляю слэйвы по одному, прописывая в каждый новый слэйв по технологическому адресу его адрес. В каждый момент времени будет откликаться только одно устройство, коллизий не возникает.
P.S. Но пользователям больше по душе DIP-переключатели адреса.
igor-x писал(а):мастер создает таблицу выданных адресов и соответствия их серийных номеров
igor-x писал(а):в МК есть EEPROM - его можно вместо перемычек использовать
T-Xen писал(а):Адреса ведомых изначально задать нет возможности
Мне кажется это распознать среди близнецов у кого какое имя. Тут TWI на мой взгляд не проканает. Здесь бы интерфейс ввиде замкнутого кольца очень подошел.
Psych писал(а):Мне кажется это распознать среди близнецов у кого какое имя. Тут TWI на мой взгляд не проканает. Здесь бы интерфейс ввиде замкнутого кольца очень подошел.
здесь не близнецы - автор сказал что у них есть серийные номера. но и в случае с близнецами протокол получения номеров реализуется (чуть больше строчек в программе получится). даже можно сделать обратную процедуру - получиить адреса, а потом по ним серийники раздать с записью в еепром
И в результате имеем случайную раздачу адресов. Такое нафиг не надо. Как определить к каому физическому устройству идет обращение? Если нужно их однозначно идентифицировать при абсолютно идентичных прошивках - только передача маркера через доп. линию связи может помочь
[master]---[slave]--[slave]--[slave]---
Алгоритм такой.
Изначально на выходах лог.1 Устанавливаем первый свободный адрес (например 2)
1. Мастер ставит доп порт в 0 и начинает слать на бродкастовый адрес текущий свободный адрес.
2. Slave слушает бродкастовый адрес, видит, что на доп. входе у него 0, значит маркер у него, значит адрес сообщают ему.
3. Мастер проверяет доступность устройства по адресу (текущему), если все хорошо, ставит порт в 1 (снимает маркер), если никто не ответил - идем к п1.
4. Slave получил адрес (2) устанавливает 0 на своем доп. выходе - передает маркер следующему
5. Мастер увеличивает текущий адрес и посылает его бродкастом, и теперь уже след Slave отрабатывает процедуру получения адреса (п2).
автор исходного вопроса и не ставил задачу однозначно чтото идентифицировать - просто раздать адреса автоматически.
тем более разговор шел про охапку близнецов - которые и не надо более точно идентифицировать.
это типа нейронов в башке - все одинаковые, но в зависимости от того раньше или позже они родились , имеют разные случайные идентификаторы, невидимые постороннему наблюдателю
coredumped писал(а):
Малость косноязычно получилось, но идея понятна?
в случае наличия такой цепочки входов-выходов, для получения адресов никаких действий(бродкастов) по шине twi делать не надо - просто как на входе первого чтото появилось он забирает себе первый адрес- потом машет ногой второму... и так до крайнего.
гадать мы можем сколько угодно: как обычно, топикстартер самое интересное умолчал. но самый тривиальный способ получается при наличии кнопки:
1. все ведомые имеют адрес 127.
2. алгоритм работы ведомого таков, что если его адрес 127, то принимает он только при нажатой кнопке.
3. мастер пиытается послать новый адрес ведомому с адресом 127, игнорируя ошибки приема путем повтора передачи через какое-то время. настройщик нажимает кнопку на ведомом - вуаля! через долю секунды у этого ведомого уже другой адрес и он перестает отвечать на 127. мастер же, добившись успешной передачи, начинает повторять попытки достучаться до очередного непроинициализированного ведомого, посылая 127-ому новый адрес.
вот и все.
битва с дураками проиграна, победители торжествуют. слава победителям!
igor-x писал(а):
в случае наличия такой цепочки входов-выходов, для получения адресов никаких действий(бродкастов) по шине twi делать не надо - просто как на входе первого чтото появилось он забирает себе первый адрес- потом машет ногой второму... и так до крайнего.
ммм... тока как он узнает адрес предыдущего? Можно, конечно, передавать в последовательном коде (программный или аппаратный UART).
coredumped писал(а):
ммм... тока как он узнает адрес предыдущего? Можно, конечно, передавать в последовательном коде (программный или аппаратный UART).