Wie lese ich PinMode für Digital Pin?


8

Gibt es eine Möglichkeit für mich, den Pin-Modus für einen der digitalen Pins auf Arduino zu lesen? Mit anderen Worten, kann ich feststellen, ob ein Pin auf einen Eingang oder Ausgang gesetzt wurde?

Antworten:


4

Ja, Sie können die Datenrichtungsregister (DDR B , DDR C , DDR D, je nach Port) verwenden, um zu überprüfen, in welchem ​​Modus sich ein Pin befindet.

Befindet sich ein Pin im Ausgangsmodus, ist das entsprechende Bit in DDRx 1.

Eine Komplikation besteht darin, dass die Arduino-Funktionen jedem Pin eine "Arduino" -Pin-Nummer geben und Sie sich eine Pin-Map ansehen müssen, um herauszufinden, welches DDR-Register und -Bit dem Pin entspricht, den Sie überprüfen möchten. Eine Pin-Karte für Arduinos basierend auf dem ATMEGA168 / ATMEGA328 (einschließlich Uno) finden Sie hier ...

https://www.arduino.cc/en/Hacking/Atmega168Hardware

Wenn Sie beispielsweise überprüfen möchten, ob der digitale Arduino-Pin Nr. 4 für die Ausgabe eingestellt ist, sehen Sie sich die Karte an und sehen Sie, dass sie PD4 entspricht. Das bedeutet "Port D" und "Bit 4", also könnte man sagen ...

if ( DDRD & _BV(4) ) {   // Check bit #4 of the data direction register for port D
    // If we get here, then Arduino digital pin #4 was in output mode
} else {
    // If we get here, then Arduino digital pin #4 was in input mode
}

Wenn Sie Arduino Digital Pin # 14 überprüfen möchten, würden Sie verwenden DDRB & _BV(5).

( _BV(x)ist ein Makro, das 1 xBits nach rechts verschiebt.)


6

Es gibt Funktionen, mit denen Sie die Register und Bitnummern von einer in die Arduino-API integrierten Pin-Nummer abrufen können.

uint8_t bit = digitalPinToBitMask(pin);
uint8_t port = digitalPinToPort(pin);
volatile uint8_t *reg = portModeRegister(port);

if (*reg & bit) {
    // It's an output
} else {
    // It's an input
}

Diese Antwort ist auch richtig und ich werde diese Funktionen in Zukunft verwenden. Vielen Dank für den Hinweis!
John

5

Dem Arduino-Kern scheint eine Funktion zum Lesen des pinMode () zu fehlen. Hier ist eine mögliche Implementierung:

int pinMode(uint8_t pin)
{
  if (pin >= NUM_DIGITAL_PINS) return (-1);

  uint8_t bit = digitalPinToBitMask(pin);
  uint8_t port = digitalPinToPort(pin);
  volatile uint8_t *reg = portModeRegister(port);
  if (*reg & bit) return (OUTPUT);

  volatile uint8_t *out = portOutputRegister(port);
  return ((*out & bit) ? INPUT_PULLUP : INPUT);
}

Es verarbeitet unzulässige PIN-Nummern (Rückgabe -1) und alle PIN-Modi. OUTPUT, INPUT und INPUT_PULLUP.

Prost!

BW: Ich habe dies als Problem im Arduino Github-Repository hinzugefügt.


Schöne Lösung. Sie sollten es dem Standard hinzufügen.
Sod Allmächtiger
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.