Какая настройка по умолчанию для цифрового вывода

С помощью digitalWrite(pin_number,value) мы можем установить выходной контакт как HIGH или LOW. Но если только кодировать pinMode (pin_number, OUTPUT), какое состояние по умолчанию для контакта pin_number, LOW или HIGH? Отмечено, что: Выводы, сконфигурированные как ВЫХОД с помощью pinMode(), считаются находящимися в состоянии с низким импедансом. Означает ли это, что контакт будет в состоянии LOW?

, 👍8

Обсуждение

ни то, ни другое, они HI-Z ... все контакты установлены как входные с отключенными подтягивающими резисторами ... это означает, что они рассматриваются как плавающие (отключенные) ... любой вывод, который имеет внешний подтягивающий или подтягивающий резистор, будет подтянут в сторону резистора, @jsotola


2 ответа


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

19

По крайней мере, на Arduino на основе AVR контакты начинаются с INPUT, т.е. импедансное состояние. Если вы затем pinMode(pin, OUTPUT);, контакт превращается в ВЫВОД НИЗКИЙ. Обратите внимание, однако, что если вы сначала установите выход на INPUT_PULLUP и затем в OUTPUT, контакт оказывается в OPUTPUT HIGH состояние.

Иногда вам нужно контролировать состояние, которое будет иметь контакт, когда он превратился в OUTPUT. Например, вы можете смоделировать открытый коллектор. вывод путем переключения между INPUT (или INPUT_PULLUP) и OUTPUT LOW, избегая состояния OUTPUT HIGH. В этом случае сейф идиома заключается в установке выходного уровня перед переключением вывода на OUTPUT, например

// Устанавливаем вывод в состояние OUTPUT LOW, не переходя в состояние OUTPUT HIGH.
digitalWrite(pin, LOW); // делаем это первым
pinMode(pin, OUTPUT);

Побочный эффект выполнения digitalWrite() для вывода, который не установлен на OUTPUT заключается в том, что вывод переключается либо на INPUT (при записи LOW) или INPUT_PULLUP (если пишется HIGH). Это индивидуальная непереносимость порты AVR IO, на которые, вероятно, не следует полагаться, если вы хотите, чтобы ваш код быть удобочитаемым или переносимым.

Ссылка: исходный код pinMode() в Arduino ядро и техническое описание соответствующего микроконтроллера. См., например, раздел Порты как Общий цифровой ввод/вывод в техническом описании ATmega328P.

,

7

У меня была аналогичная проблема с платой DIGISPARK с питанием от ATTINY85.

У меня возник сбой при установке вывода на OUTPUT и немедленном переводе его в HIGH. Выглядело примерно так:

CH1:

pinMode(ch1, OUTPUT); // именно в этой строке ch1 становится НИЗКИМ

digitalWrite(ch1, LOW); // технически избыточно, поскольку на выводе ch1 уже установлен НИЗКИЙ уровень

Канал 2:

pinMode(ch2, OUTPUT); // в этот момент канал ch2 становится НИЗКИМ

digitalWrite(ch2, HIGH); // и становится ВЫСОКИМ только после выполнения этой инструкции

Сбой на канале 2 при установке контакта на ВЫХОД, а затем при установке ВЫСОКОГО

Решение, которое устранило указанный выше сбой в моем случае (плата ATTiny85 / Digispark), как указал выше Эдгар Боне, проходило фазу INPUT_PULLUP:

pinMode(ch2, INPUT_PULLUP);

pinMode(ch2, OUTPUT);

digitalWrite(ch2, HIGH);

,