Какая настройка по умолчанию для цифрового вывода
С помощью 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»?
- Как создать несколько запущенных потоков?
- Как подключиться к Arduino с помощью WiFi?
- avrdude ser_open() can't set com-state
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
- Я закирпичил свой Arduino Uno? Проблемы с загрузкой скетчей на плату
ни то, ни другое, они HI-Z ... все контакты установлены как входные с отключенными подтягивающими резисторами ... это означает, что они рассматриваются как плавающие (отключенные) ... любой вывод, который имеет внешний подтягивающий или подтягивающий резистор, будет подтянут в сторону резистора, @jsotola