Автоматическое назначение адресов в RS485
Есть несколько устройств объединеных сетью RS485 с организацией ведущий-ведомые. Как можно автоматически назначить адреса ведомых устройств ? Есть ли у ATMEG заводские номера зашитые в память ? И если есть можно ли их прочитать из программы?
- Реклама
Заводских номеров у атмег нет, есть сигнатура, но одинаковая для одинаковых контроллеров, так что назначать нужно на этапе прошивки МК. Можно сделать так, что изначально у всех будет например 0-й адрес, при соединении нового устройства в сеть ведущий берет незанятый номер и выдает его в сеть, если у устройства 0-й номер, то оно присваивает себе новый и отвечает ведущему. Тогда нужно просто добавлять в сеть устройства по одному и давать ведущему команду на выделение нового адреса. Ну или что-то в этом роде...
Поставьте на устройстве кнопку. При её нажатии, устройство начинает отвечать по фиксированному служебному адресу, и ждать команды присвоения постоянного адреса для работы. Задача ведущего - присвоить этот адрес.
Ещё можно поставить какую-либо чипулину с уникальным номером, например - термометр DS18B20.
Ещё можно поставить какую-либо чипулину с уникальным номером, например - термометр DS18B20.
Спасибо за советы. Возникли проблемы с протеусом. При имитации при прямом подключении выводов МК связка ведущи-1 ведомый обмен идет нормально, при ведущий - 2 ведомых команды от ведущего приходят, но ответ от ведомых ведущему не приходят. Причины в принципе понятны: отвечаеющему мешает 2 молчащий ведомый. Если же ставить драйвер RS-485(MAX487) то программа виснет, даже если помещен один ведущий который шлет информацию просто "в воздух", причем по наблюдению зависание происходит в момент когда контроллер переключает драйвер на прием. В чем может быть проблема или как можно сделать сеть RS-232 с несколькими ведомыми (чтобы отладить обмен) ?
В таких случаях лучше выкладывать проект и прошивку, со слов все косяки не угадаешь.
- Реклама
В исходник сильно не вглядывался, т.к. в Си не спец, возможно проблема в задержках между приемом-передачей и переключением MAX487. На сколько я понял там стоит задержка в 2мс, возможно ее стоит изменить. Симулятор похоже не зависает, дело в том, что при использовании MAX487 возникает куча ошибок кадров со стороны обоих контроллеров, отображение лога при этом может сильно тормозить программу (например отображение окна SPI отладчика при постоянном обмене по SPI вешает протеус наглухо
). Проблему симуляции можно решить, поставив вместо MAX487 - буфер, например 74125 на цепи TX слейвов, но это не отвечает на вопрос почему с 487 возникают ошибки кадра. Если поставить 2 терминала (в HEX режиме), то видно что после преобразования UART-485-UART в конце вылезает лишний 0, вот с этим и нужно бороться.
Грабли могут быть, когда на линии нет активных передатчиков. Приёмники, при этом могут ловить 50 Гц, или постоянный "0", что может вызвать ложные прерывания от UART, вешающие систему. Поставьте на мастере 2 резистора, подтягивающие линию к неактивному состоянию (когда на входах RxD UARTов будет лог.1, в перерывах передачи данных)
P.S. по поводу "Си" ничего не скажу, мне проще вручную перетранслировать этот си на асм, или паскаль (хоть бейсик) а затем только понимать алгоритм
.
P.S. по поводу "Си" ничего не скажу, мне проще вручную перетранслировать этот си на асм, или паскаль (хоть бейсик) а затем только понимать алгоритм
Пока попробую поставлю буферы. А как в протеусе поставить терминалы в HEX-режим?
Да, подтяжка линий это все правильно, но до этих граблей еще надо дойти, тут в симуляторе (где нет никаких наводок) как следует не работает...Microtech писал(а):Грабли могут быть, когда на линии нет активных передатчиков. Приёмники, при этом могут ловить 50 Гц, или постоянный "0", что может вызвать ложные прерывания от UART, вешающие систему. Поставьте на мастере 2 резистора, подтягивающие линию к неактивному состоянию
Симуляцию на паузу, на терминале правой кнопкой щелкнуть, там в меню будет такой пункт.Demon писал(а):А как в протеусе поставить терминалы в HEX-режим?
Спасибо за совет идея с буферами прошла, сейчас в симуляции 12 ведомых отвечают на запросы ведущего. С MAX487 попробую разобратся попозже на заключительной стадии.
У МК51-х у UARTa есть режим с адресацией устройств..
Насколько знаю, у АВР-ок - он тоже есть..
Это когда каждому МК прописывается его адрес на шине, а при передаче именно с этим байтом у конкретного МК возникает прерывание..
Насколько знаю, у АВР-ок - он тоже есть..
Это когда каждому МК прописывается его адрес на шине, а при передаче именно с этим байтом у конкретного МК возникает прерывание..
[img]http://radiokot.ru/forum/download/file.php?id=93376[/img][i][color=#000080][size=85]Между людьми возникает напряжение, если у них разный потенциал...[/size][/color][/i]
Да у AVR есть такое, но проблема стоит как автоматически назначить каждому устройству в сети свой уникальный адрес. Wake взят т.к. есть готовые процедуры для МК и .dll-ки для ПК
13 контроллеров симулируется! ЖестьDemon писал(а):12 ведомых отвечают на запросы ведущего


