Высокое программное обеспечение

Я портировал мышь ps/2 из библиотеки Arduino на pic, и мне было интересно, почему при объявлении вывода в качестве входа, а затем при повышении его значения работает high, и это работало как для pic, так и для Arduino, но когда я объявляю пин как выход, тогда пишите высокий, я не получил подтверждение правильно.

Почему для получения высоких значений требуется ввод данных? И почему программное обеспечение, записывающее входные данные, работает?

Ответы (1)

Вход, который «высокий», как вы его называете, или также обычно «подтягивается», относится к сигналу, который подключен к положительной шине через резистор среднего значения (обычно несколько десятков кОм). Таким образом, его уровень напряжения определяется положительной шиной при условии, что через подтягивающий резистор не протекает значительный ток. Внутри PIC или AVR это выглядит примерно так:

схематический

смоделируйте эту схему - схема, созданная с помощью CircuitLab

Если мы получим значительный ток от этого вывода ввода-вывода, например, подключив его к земле через низкоомный провод, будь то провод, переключатель или транзистор с открытым коллектором, напряжение на выводе ввода-вывода упадет. Звучит как что-то плохое, но это может быть действительно полезно. Это позволяет нам определить напряжение по умолчанию на контакте ввода-вывода, а затем позволить внешним схемам изменять его. Еще лучше, потому что мы не требуем, чтобы эти схемы сами определяли напряжение высокого уровня, вы могли бы иметь много переключателей (или резисторов с открытым коллектором) параллельно - и если какой-либо из них включится, это потянет I/ Низкое напряжение на контакте O. Протокол I2C использует это, чтобы позволить ведомому устройству подтверждать передачу данных, переводя подтянутый контакт SDA (данные) в низкий уровень.

У меня нет практических знаний о PS/2, но я предполагаю, что здесь происходит то же самое. Если вы управляете выводом как выходом, вместо того, чтобы через резистор среднего значения, вы сильно управляете им через транзистор - и это путь с гораздо более низким сопротивлением. Вам нужно будет вытянуть намного больше тока из вывода, чтобы снизить его, и поэтому подтверждение не сработает. Вы можете думать об этом как о подтянутом выводе, являющемся слабо определенным состоянием напряжения - другие схемы могут относительно легко изменить напряжение на выводе. Вывод, управляемый выходом, является гораздо более строго определенным состоянием - и это преднамеренно, поскольку вы не хотите, чтобы на него влияли другие схемы.

Что касается того, почему работает запись высокого значения на входной контакт, это особенность того, как расположены регистры внутри AVR и PIC. Если бит DDxn для определенного вывода установлен как входной, AVR интерпретирует бит значения PORTxn как подключение подтяжки или нет. Если бит DDxn установлен как выход, бит значения PORTxn определяет уровень возбуждения (высокий или низкий). Объяснение этого см. на стр.76 таблицы данных Atmega328 . Другие архитектуры реагируют по-разному (некоторые, например, позволяют подключать подтягивающий или подтягивающий резистор с помощью других настроек регистра). По мере того, как Arduino расширялся и включал в себя более широкий спектр архитектур, использование

pinMode(pin, INPUT);
digitalWrite(pin, HIGH);

для включения подтянутого входа был заменен

pinMode(pin, INPUT_PULLUP);

для того, чтобы его было легче понять и в целом адаптировать к более современным архитектурам.

Спасает меня от написания ответа. Я хотел / Вы могли бы включить ссылку, например, на atmel.com/images/doc2503.pdf Страница 50.
Спасибо @Scheintod - добавил ссылку, как было предложено (хотя и в таблицу данных Atmega328)