Как я могу digitalRead пин-код, который находится в pinMode OUTPUT? - PullRequest
29 голосов
/ 28 мая 2011

У меня очень простой тест 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, не теряя значение?

Ответы [ 11 ]

32 голосов
/ 05 февраля 2013

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

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));
}

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

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

32 голосов
/ 30 мая 2011

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

Регистры 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.

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

4 голосов
/ 14 февраля 2014
digitalWrite(3,HIGH);
digitalRead(3);
3 голосов
/ 04 октября 2016

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

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

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

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

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

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

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

2 голосов
/ 08 января 2014

Сохраните ваш выбор pinMode() в функции setup() и попробуйте функции digitalWrite() и digitalRead().

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

int pin22 = 22;
void setup()
{
  Serial.begin(9600);
  pinMode(pin22,output);
}

void loop()
{
  digitalWrite(pin22,HIGH);
  digitalRead(pin22);
  digitalWrite(pin22,LOW);
  digitalRead(pin22);
}
2 голосов
/ 27 июня 2011

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

0 голосов
/ 20 мая 2018

Я написал процедуру для мигания четырех разных светодиодов для разных целей, но я также хотел сохранить их начальное состояние до того, как я буду их мигать, поскольку их устойчивое состояние также говорит мне, что что-то происходит в моем коде, поэтому вот мой Flash-код, Вы вызываете его, отправляя пин-код, количество раз, чтобы его прошить и как долго его прошивать.

inline void Flash (byte pinNum, byte times, byte flashSpeed)
  {
    bool state;                     // Local var for State of pin
    state = digitalRead(pinNum);    // Read the current state as set elsewhere
    int x;                          // Local var for repeat flash
    for (x = 0; x < times; x++)
      {
        digitalWrite(pinNum, HIGH); // Turn on LED
        delay(flashSpeed);
        digitalWrite(pinNum, LOW);  // Turn off LED
        delay(flashSpeed * 2);      //  leave off twice as long as on
      }                             //  due to persistence of Vision   
    digitalWrite(pinNum, state);    // Restore the original state of the LED
  }
0 голосов
/ 08 января 2014

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

0 голосов
/ 02 декабря 2012

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

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)

}
0 голосов
/ 28 мая 2011

Вы пытаетесь установить для входа по умолчанию значение ВЫСОКИЙ?
Если это так, вы хотите активировать подтягивающий регистр:

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...