Какая настройка по умолчанию для цифрового вывода
С помощью digitalWrite(pin_number,value) мы можем установить выходной контакт как HIGH или LOW. Но если только кодировать pinMode (pin_number, OUTPUT), какое состояние по умолчанию для контакта pin_number, LOW или HIGH? Отмечено, что: Выводы, сконфигурированные как ВЫХОД с помощью pinMode(), считаются находящимися в состоянии с низким импедансом. Означает ли это, что контакт будет в состоянии LOW?
@jingweimo, 👍8
Обсуждение2 ответа
Лучший ответ:
По крайней мере, на 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.
У меня была аналогичная проблема с платой DIGISPARK с питанием от ATTINY85.
У меня возник сбой при установке вывода на OUTPUT и немедленном переводе его в HIGH. Выглядело примерно так:
CH1:
pinMode(ch1, OUTPUT); // именно в этой строке ch1 становится НИЗКИМ
digitalWrite(ch1, LOW); // технически избыточно, поскольку на выводе ch1 уже установлен НИЗКИЙ уровень
Канал 2:
pinMode(ch2, OUTPUT); // в этот момент канал ch2 становится НИЗКИМ
digitalWrite(ch2, HIGH); // и становится ВЫСОКИМ только после выполнения этой инструкции

Решение, которое устранило указанный выше сбой в моем случае (плата ATTiny85 / Digispark), как указал выше Эдгар Боне, проходило фазу INPUT_PULLUP:
pinMode(ch2, INPUT_PULLUP);
pinMode(ch2, OUTPUT);
digitalWrite(ch2, HIGH);
- Как использовать SPI на Arduino?
- Как решить проблему «avrdude: stk500_recv(): programmer is not responding»?
- Как создать несколько запущенных потоков?
- avrdude ser_open() can't set com-state
- Как подключиться к Arduino с помощью WiFi?
- Mac OSX Yosemite не отображает последовательные порты для Uno R3
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
ни то, ни другое, они HI-Z ... все контакты установлены как входные с отключенными подтягивающими резисторами ... это означает, что они рассматриваются как плавающие (отключенные) ... любой вывод, который имеет внешний подтягивающий или подтягивающий резистор, будет подтянут в сторону резистора, @jsotola