Есть такое очень простое и очень популярное схемотехническое решение. Но, несмотря на его простоту, для многих начинающих оно незнакомо, а при встрече неочевидно. Что порой вызвает непонимание сути процесса, а порой и выход из строя оборудования.
Что такое соединение в монтажное И.
Представь себе линию, подтянутую резистором к плюсу питания. Так как сопротивление между линией и землей бесконечность, а между питанием и линией равно резистору, то напряжение на линии равно напряжению питания. То есть высокий уровень aka (обычно) логическая единица.
К линии подключаются девайсы. Которые могут замыкать эту линию на землю. Так вот, исходя из этого подключения, на линии будет высокий уровень только тогда, когда все остальные девайсы выставят выставят высокий уровень на своих выходах. Стоит какому-либо одному поганцу придавить линию к земле нулем, как вся шина станет низкого уровня и никто из других девайсов на это повлиять не сможет.
Как это можно использовать? Да по разному. Простеший пример — сигнал готовности. Есть куча блоков единого устройства. Каждый из которых работает по своему алгоритму и, например, требует начальную инициализацию. Чтобы главный понял, что все остальные блоки закончили инициализацию и подготовились он «слушает» линию связи. В качестве сигнала готовности — блок отпускает линию. Когда каждый блок пройдет инициализацию, то линия примет высокий уровень и это будет сигналом полной готовности устройства.
На этом же принципе работает и шина 1-Wire и I2C — там если приемник не успевает прожевать байт, то он просто придавливает тактовую линию, не давая передатчику генерировать импульсы. А передатчик, видя что его обламывают, делает паузу.
Как с этим работать
Очевидно, что при работе на шину с монтажным И нельзя в эту шину подавать сильный высокий уровень. Иначе если какой либо из блоков выдаст свой сильный низкий то один из них выгорит в результате КЗ. Соответственно, если говорить про AVR, то ноль задаем сочетанием DDR=1 PORT=0, а единицу (когда линия отпущена) DDR=0 PORT=0. Вот такая вот инверсная логика.





Я бы в раздел «Как с этим работать» добавил бы упоминание Pull-down транзистора. Мало ли у кого в Slave-устройстве какая-нибудь неинтеллектуальная микросхема с Push-pull-выходом.
Резистор нужен для того, чтобы между питанием и землей не было КЗ?
Да и чтобы можно было опустить уровень. Без него будет просто КЗ.
Вот по такому же принципу устроена линия сигнала RESET на материнских платах. Но на последних как правило установлена куча вот таких вот условных блоков, что приводит к трудностям нахождения неисправного блок, просаживающего уровень; приходится поочередно поднимать ноги RST на всех блоках;)
Даешь ИЛИ Монтажное! Вроде как отдельной статьи не было!
Ура! Я знаю Монтажное И:)!
Поменяйте {+5В на Землю} и {Землю на +5В} на рисунке и будет монтажное ИЛИ 8)
Я про такое слышал, только монтажное И делалось для выходов «открытый коллектор». А с портами AVR интересная идея :) Главное КЗ не сделать случайно.
Для страховки между выходами микросхем и общей точкой можно поставить диоды. Тогда пофигу, ОК или двухтактный выход. Правда, тогда «Монтажное И» превратится в диодную логику… Если критично падение напряжения на диодах, можно использовать германиевые или ВЧ Шоттки.
А разве это не «ИЛИ»?
«И», насколько я помню, означает, что на выходу блока логическая 1 если на всех! входах так же логическая единица. А тут как бы один любой замкнул и усе. Так что это вроде как «ИЛИ» а не «И». Или нет?
Хотя здесь «ИЛИ», если на логическую единицу принять 0 вольт.
Тут изображены нижние ключи ОК. Т.е. ноль это замкнуто. Да, надо бы пояснение внести.
Короче я чего то чуш спорол.
Гыгыгы. И про старуху бывает порнуха :)
Никогда не видел PLC на диодной логике? Адская вещь! Там внутри плат 1 это +10В, снаружи плат 1 это 0В. Все программирование идет напайкой диодов на шины. И таких шин несколько сотен. Но блин как оно фурычит… ЫЫЫ! Я когда впервые с этим монстром столкнулся то прифигел.
осталось рассказать про и-не элементы и как на их основе смастерить триггер :)
Не совсем понял, а как получается, что мы задаем единицу DDR=0,Port=0? этим мы определяем порт как вход, причем без подтягивающего резистора. Так же? Получается мы этим придавливаем линию..
Когда порт как вход без резистора, он имеет очень большое сопротивление, сотни мегаоом. Так что он просто слушает, не вмешиваясь в процесс.
В то же время сочетанием DDR=1 PORT=0 мы определим вывод как выход без сигнала. Тогда в линии установится высокий уровень..
А в этом случае линия порта лежит на земле и в линии ноль.
В смысле, когда мы на выход подаем сигнал, мы просто сажаем ножку на + внутри АVR, а когда 0, то она сидит на земле? Я правильно понял?
Нет ,ты не понял.
Тут единица возникает сама, Т.е. мы ее не устанавливаем. Мы просто включаем порт на вход. А ноль устанавливаем вручную.
А то что ты сказал это нормальаня работа порта AVR при работе не на шину, а напрямую с ведомым устройством.
Я как раз насчет нормальной работы и уточнял. Спасибо за ответ, понятно )
если я не шибаюсь по этому принципу работают датчики пожарной сигнализации
Не ошибаешься. А еще всякие охранные датчики.