Почему контакт должен быть установлен как вход, если он может считывать ввод, когда он установлен как выход?

pins input

Недавно я создал схему для считывания значений с двух наборов кнопок, используя только два аналоговых контакта. Это включает в себя установку одного контакта HIGH и чтение ввода на другом контакте, а затем перестановку. Когда оба контакта настроены на OUTPUT, я все еще могу считывать значения с помощью analogRead() без необходимости постоянно переключать режимы контактов.

Мой вопрос: почему это так? Какой смысл устанавливать вывод на INPUT, если OUTPUT все еще может считывать значения? Есть ли у этого недостатки?

, 👍0

Обсуждение

Просто не ожидайте, что это сработает при переходе на другую плату. Например, Due или Teensy. В остальном, пожалуй, недостатков нет., @Gerben


4 ответа


Лучший ответ:

1

Причина этого в том, что analogRead() не имеет абсолютно никакого отношения к тому, в каком режиме находится вывод. Этот режим имеет какое-либо значение только в рамках цифрового операций, т. е. при использовании digitalRead() и digitalWrite(). При использовании analogRead() код Arduino сначала переключает вывод в аналоговый режим, а затем считывает его.

,

Почему для цифровых операций требуется установить режим вывода, а для аналоговых — нет?, @James Coyle

Потому что цифровые операции отличаются от аналоговых операций. Когда вы выполняете AnalogRead, контакт ввода-вывода изолирован от схемы цифрового ввода-вывода, поэтому режим контакта (который влияет на схему цифрового ввода-вывода) абсолютно не влияет на работу., @Majenko

Это как ключи от машины. Вы используете их для своей машины, но не для своего велосипеда, но оба они в гараже, и оба выходят из одного дверного проема., @Majenko


0

Поскольку контакты ввода-вывода могут использоваться как для цифрового ввода, так и для цифрового вывода, и их можно переключать для работы в заданном направлении. Некоторые из контактов также имеют аналоговые возможности, либо аналого-цифровое преобразование (вход), либо ШИМ (своего рода псевдоаналоговый выход), но только в одном направлении, постоянно назначенном аппаратным обеспечением и, следовательно, не переключаемом с одного на другое. .

,

1

Мой вопрос: почему это так? Какой смысл устанавливать контакт на ВХОД, если ВЫХОД все еще может считывать значения? Есть ли у этого недостатки?

Если вы выполняете digitalRead, вы можете прочитать текущее зафиксированное состояние контакта output (оно не меняет его на вход). Другими словами, вы читаете то, что было записано последним.

Если вы выполняете digitalWrite HIGH для контакта input, это устанавливает внутреннюю подтяжку. Если вы пишете LOW, это отключает внутреннюю подтяжку. Если бы он переключил его на вывод для вас, вы не смогли бы включить или отключить подтягивание. (Примечание: это относится к более старым версиям IDE, в более новых для параметра pinMode установлено значение INPUT_PULLUP).

Какой смысл устанавливать контакт на ВХОД, если ВЫХОД все еще может считывать значения?

Это определенно не будет работать с digitalRead, потому что вы записываете значение на вывод в режиме OUTPUT, поэтому вы просто читаете то, что пишете. Другими словами, вы активировали транзисторы драйвера, которые переопределяют любое значение, которое вы пытаетесь считать.

,

0

Определение их является хорошей практикой, особенно если вы программируете не Arduino, а что-то другое. Например, вывод порта на PCF8574 (периферийное устройство) записывается как 1, поэтому вы можете прочитать его, он имеет небольшое внутреннее подтягивание. Если вы потянете его вниз в этом состоянии, вы прочтете ноль. Если вы пишете ноль, вы всегда будете читать ноль. Доведение его до 1 при нулевом значении может разрушить деталь. Эта конфигурация также используется на микроконтроллерах. Существуют сотни различных конфигураций портов и вариантов программирования, лучше сначала прочитать данные и понять их, иначе вы можете приобрести другой.

,