Как я могу digitalRead pin-код, который находится в выводе pinMode?

у меня очень простой тест эскиз в котором я пытаюсь установить pin-код в 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. Таким образом, установка pin в HIGH на OUTPUT режим, а затем меняется к INPUT режим изменит его на LOW. Таким образом, digitalRead всегда будет возвращать 0. Если нет ... измените pinMode, он не сможет прочитать pin-код. Итак, как я могу прочитать текущую настройку pin-кода, который находится в OUTPUT режим без потери стоимости?

11 ответов


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

регистры PORTB и PORTD содержат данные pin, которые вы ищете. Я, наконец, получил доступ к 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.

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


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

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

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

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


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

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


держать pinMode() выбор в


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

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

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

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

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

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

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


вы пытаетесь установить значение по умолчанию HIGH?
Если это так, вы хотите активировать pull-up register:

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:

если pin-код настроен как вход, запись высокого значения с помощью digitalWrite () позволит использовать внутренний 20k-импульсный резистор.


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

если pin-код GPIO микроконтроллера установлен как вход, то его значение при чтении зависит от того, к чему он подключен извне. В этом-то все и дело.


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


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

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
  }

можно попробовать:

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)

}