Подтвердить что ты не робот

Как я могу выполнить цифровой вывод pin, который находится в pinMode OUTPUT?

У меня очень простой тест sketch, в котором я пытаюсь установить вывод HIGH, а затем читать его состояние с помощью digitalRead. Вот мой эскиз.

void setup()
{
    Serial.begin(9600);
}

void loop()
{
    delay(1000);

    pinMode(3, OUTPUT);
    digitalWrite(3, HIGH);
    delay(1000);

    pinMode(3, INPUT);
    Serial.println(digitalRead(3));
}

Результат последовательного монитора:

0
0
0
0

Я понял, что изменение pinMode остановит его на HIGH. Таким образом, установив контакт в HIGH в режиме OUTPUT, а затем изменив его на INPUT, он изменит его на LOW. Поэтому digitalRead всегда будет возвращать 0. Если я не изменю pinMode, он не сможет прочитать контакт. Итак, как я могу прочитать текущую настройку вывода, который находится в режиме OUTPUT, не теряя значения?

4b9b3361

Ответ 1

В этом случае вы просто хотите получить доступ к самому регистру данных.

Регистры PORTB и PORTD содержат данные штифта, которые вы ищете. Наконец я получил доступ к Arduino, чтобы понять это. Вы хотите использовать bitRead(PORTD, pin).

Serial.println(bitRead(PORTD,3)); //Reads bit 3 of register PORTD which contains the current state (high/low) of pin 3.

Ссылка Операция чтения бит для получения дополнительной информации.

Ответ 2

Ваш эскиз должен быть

void setup()
{
    Serial.begin(9600);
}

void loop()
{
    delay(1000);

    pinMode(3, OUTPUT);
    digitalWrite(3, HIGH);
    delay(1000);

    // pinMode(3, INPUT); // get rid of this line
    Serial.println(digitalRead(3));
}

Это все. Затем он считывает состояние вывода, которое в вашем случае "HIGH". Если вы установили pinMode для ввода, он будет считывать входные данные в зависимости от того, что связано. Если вы пишете "HIGH" на входном штыре, будет активирован внутренний pullup. Неважно, пишете ли вы HIGH перед установкой его в режим ввода или после его установки в режим ввода. Если, конечно, вы не управляете нагрузкой, которая должна быть высокой для выходного вывода (например, переключения на землю). Тогда это, вероятно, убьет булавку.

Если вы написали низкое значение и установили, что пинкер был низким, он может плавать, что может привести к любому непредсказуемому поведению.

Ответ 3

Почему вы хотите это сделать? Если вы делаете это, чтобы подтвердить, что контакт действительно высок, это не подтвердит его, потому что, возможно, есть короткое замыкание на высоком контакте от внешней цепи, лучший способ - создать обратную связь через другой контакт; сконфигурируйте другой контакт в качестве входного сигнала и подключите выходной вывод к новому входному выводу и прочитайте его значение. Чтение внутреннего регистра всегда будет возвращать для вас то, что контроллер пытается установить на штырь, а не фактическое значение штыря.

Ответ 4

Сохраните выбор PinMode в функции настройки и попробуйте функцию Digitalwrite и read.

Setup() будет выполняться при запуске контроллера, и цикл будет функцией, которая продолжает выполнять.

int Pin22 = 22;
void Setup()
{
  Serial.begin(9600);
  pinMode(pin22,output);
}
void loop()
{
  digitalWrite(pin22,HIGH);
  digitalRead(pin22);
  digitalWrite(pin22,LOW);
  digitalRead(pin22);
}

Ответ 5

digitalWrite(3,HIGH);
digitalRead(3);

Ответ 6

Сохраняйте отдельную логическую карту состояний выходных контактов.

Если в качестве входа задан вывод микроконтроллера GPIO, то его значение при чтении зависит от того, с чем он подключен снаружи. Такого рода точка.

Ответ 7

Вы пытаетесь установить значение по умолчанию для HIGH?
Если это так, вы хотите активировать регистр подтягивания:

void setup() 
{
    Serial.begin(9600);
}

void loop() 
{
    delay(1000);

    pinMode(3,INPUT);         // default mode is INPUT  
    digitalWrite(3, HIGH);    // Turn on the internal pull-up resistor, default state is HIGH  

    delay(1000);
    Serial.println(digitalRead(3));
}

Выдержка из DigitalWrite:

Если контакт сконфигурирован как INPUT, запись значения HIGH с помощью функции digitalWrite() позволит использовать внутренний резистор 20K.

Ответ 8

Всегда помните. Если вы пытаетесь настроить что-либо, просто сохраните его в установочном файле. Поскольку файл установки запускается один раз, если вы устанавливаете In loop. он выполняет непрерывный процесс и пытается сохранить его в состоянии начала. Это активное низкое состояние

Ответ 9

Не понравился ни один из предыдущих ответов, потому что они не были бы совместимы с кросс-ардуино-платформой. Вам нужно получить доступ к таблицам ссылок. Следующее выражение делает трюк.

bool value = (0!=(*portOutputRegister( digitalPinToPort(pin) ) & digitalPinToBitMask(pin)));

Позвольте мне сломать это для лучшего понимания

digitalPinToPort(pin) найдите gpio bank [port], на который назначается контакт на выбранном вами оборудовании

portOutputRegister(...) дает указатель на порт, содержащий требуемое значение. * разыгрывает указатель и дает полное значение всех 8 контактов, назначенных этому порту. Это еще не уникально полезно, но бит, который вы ищете, находится там.

&digitalPinToBitMask(pin) выбирает только бит, который вас интересует для вывода, все остальные биты будут равны нулю.

0!= тесты, чтобы увидеть, является ли полученное выражение равным нулю или что-то еще. Если он равен нулю, то ваш вывод равен нулю на этом выводе. В противном случае выход будет одним.

Ответ 10

Вы можете попробовать:

int Pin22 = 22;
int valuePin22 = 0;

void setup() {

    pinMode(Pin22, OUTPUT);
    digitalWrite(Pin22, LOW);

}

void loop() {

    digitalWrite(Pin22, HIGH)
    valuePin22 = 1;
    Serial.println(valuePin22);
    delay(100);

    digitalWrite(Pin22, LOW)
    valuePin22 = 0;
    Serial.println(valuePin22);
    delay(1000)

}