Небольшая путаница в команде digitalWrite
Будет ли среда разработки Arduino интерпретировать digitalWrite(13,x), где x>0, как digitalWrite(13,HIGH)? И будет ли он интерпретировать digitalWrite(13,x), где x<=0, как digitalWrite(13,LOW)?
@Kv07, 👍0
Обсуждение1 ответ
Лучший ответ:
Любое другое значение, отличное от 0 или LOW, приведет к установке пина в HIGH. Ниже я объясню, почему:
Функция digitalWrite() находится в файле hardware/arduino/avr/cores/arduino/wiring_digital.c. Важные строки здесь:
if (val == LOW) {
*out &= ~bit;
} else {
*out |= bit;
}
Как вы можете видеть, он проверяет, равно ли заданное значение (из параметра) LOW, и если это так, то он устанавливает соответствующий пин на 0. В любом другом случае он устанавливает пин на 1. Определение LOW можно найти в arduino/hardware/arduino/avr/cores/arduino/Arduino.h:
#define HIGH 0x1
#define LOW 0x0
Таким образом, код проверяет, равно ли значение 0, и устанавливает пин также на 0. Любое другое значение даст в результате 1 (что означает HIGH). Также взгляните на определение digitalWrite():
void digitalWrite(uint8_t pin, uint8_t val)
Значение имеет тип без знака, поэтому каждый тип со знаком будет приведен к типу без знака. Отрицательное число приведет к положительному числу внутри функции.
Просто придирка: также False и все остальное, что оценивается как 0, здесь работает :) (И обычно в качестве val используются логические переменные/выражения), @gilhad
- Как инициализировать цифровой выходной контакт как LOW
- Использование контактов NodeMCU D8 (GPIO15), D4 (GPIO2) и D3 (GPIO0).
- Отправка цифрового сигнала с одного Arduino на другой для запуска события
- Как настроить выходы без использования digitalWrite?
- Случайная ошибка "Compilation error: Error: 13 INTERNAL: exit status 1". Как устранить или что вызывает эту ошибку
- Какой аналог PORTx для Teensy (4.0)?
- установка выходного аналогового/цифрового контакта на землю
- Встроенные светодиоды HIGH и LOW кажутся перевернутыми
0 — низкий, все остальное — ВЫСОКИЙ, @Juraj
но какой-нибудь шутник мог бы сделать ядро Arduino, где LOW определен как 2. Код AVR для digitalWrite и digitalRead будет работать. он не предполагает, что LOW равен 0. поэтому ваш код тоже не должен этого делать. (но в своих набросках я часто предполагаю, что LOW равен 0)., @Juraj
основные функции esp8266 digitalRead и digitalWrite игнорируют LOW и HIGH и используют
if (val)и возвращают состояние бита регистра, @Juraj