После некоторого опыта работы с контроллерами AVR встала задача объединять эти контроллеры в группы, т.к. зачастую несколько блоков устройства собраны на разных контроллерах.
Было принято решение объединять контроллеры через интерфейс UART.
Итак, задача:
1. Выработать методику объединения нескольких контроллеров одну систему, при этом разработав некое универсальное типовое решение.
2. Обеспечить по возможности максимальную нагрузку на контроллеры, с целью повышения быстродействия.
Первое, что приходит в голову - это общая шина. Тоже вариант...
Принцип работы очень прост, например мы с главного компьютера передаем команду в которой содержится идентификатор устройства назначения. Все контроллеры приняв команду смотрят, если команда адресована ему, то выполняет и посылает ответ. Схема выглядит действительно просто.
Приведем некоторые недостатки этой схемы:
1. В решении задачи задействован только один контроллер. Это происходит из-за невозможности делить линию передачи данных от контроллеров - к управляющей ЭВМ.
2. Даже при введении некой системы избежания коллизий в лини передачи данных, то мы никуда не деваемся от необходимости каждым контроллером анализировать _все_ принятые команды, в т.ч. адресованные к другому контроллеру.
Таким образом я делаю вывод о необходимости устройства коммутации и распределения команд.
Могу предложить следующую схему (я не уверен в правомерности установки диодов).
Кратко опишу как это должно работать. Рассморим пару Блок Управления (БУ) и Периферийное Устройство (ПУ).
Как видно из схемы, БУ может воздействовать на ПУ внешним прерыванием INT0, а также переключать свою линию передачи данных между внутренним, и внешним "сегментом сети" (для этого стоят транзисторы).
Теперь рассмотрим, как это должно работать....
Работа БУ:
1. Получить команду (или группу команд) от Главной ЭВМ (ГЭВМ)
2. Разбирая команду(ы) определить адресата(ов) и составить их список.
3. Переключиться во внутренний сегмент.
4. Установить INT0 ПУ адресата в 1. (Реакцию ПУ смотри ниже)
5. Передать команду для ПУ.
6. Проделать п.4 и п.5 со всеми адресатами, если их несколько.
7 Переключиться во внешний сегмент.
8. Установить INT0 ПУ адресата в 0. (Реакцию ПУ смотри ниже)
9. Получить ответ, или сигнал "не готов".
10. Если "не готов", то тогда установить INT0 ПУ адресата в 1(Реакцию ПУ смотри ниже) и переходим к п.8 сменив адресата на следующего из списка если их несколько.
11. Если "готов", то тогда вычеркнуть этого адресата из списка, запомнить ответ и перейти к п.8 сменив адресата на следующего из списка если их несколько, а если адресатов больше нет, то тогда сформировать ответ(ы).
12. Отправить ответы на ГЭВМ.
Работа ПУ (реакция на INT0):
-при появлении 1:
1. Если "не готов", то выйти.
2. Включить UART.
3. Считать команду.
4. Выключить UART.
5. Отправить команду на выполнение.
-при появлении 0:
1. Включить UART.
2. Если "не готов", то тогда сообщить об этом.
3. Если "готов" то отправить ответ.
4. Выключть UART.
Вот те достоинства которые увидел я:
1. Мы по возможности решаем нашу задачку, дав возможность контроллерам работать больше времени, чем принимать команды..
2. На основе этого блока можно сделать систему индикации робота, состояния его устройств.
Ну и недостаток - повторное отправление команд, что безусловно занимает некоторое время.
В ближайшее время предоставлю таблицу трассировки алгоритма + если получится решение новой проблемы, повторного отправления команд.
В файлике - схемка + текст.
ВНИМАНИЕ! В схеме ошибка, у двух самых правх транзисторов нужно коллектор и эмиттер поменять местами.