Direkte Port-Manipulation beim Arduino

Die hier beschriebenen Techniken wurden nur auf dem Arduino Uno bzw. einem kompatiblem Board getestet und funktionieren vermutlich auf anderen Boards etwas anders!

Anstatt digitalWrite() / digitalRead() zu verwenden, können die Pins des Arduinos auch auf eine direkte Art angesprochen werden.

Vor- und Nachteile

Vorteile

Nachteile

Funktionsweise

Ports

Es gibt drei sogenannte "Ports", die wir manipulieren können. Dies sind quasi Gruppen von Pins, die als Ganzes angesteuert werden.

Register

Jeder dieser Ports kann über drei Register angesteuert werden (x ist jeweils der entsprechende Port, d.h. C, B oder D):

So kann man z.B. Pin 1-7 auf OUTPUT setzen und Pin 0 auf INPUT, indem man in setup() folgende Zeile definiert:
DDRD = B11111110;
Allerdings sollte man sicherheitshalber die Definition folgendermaßen ausführen, um die Werte von Pin 0 (RX) und 1 (TX) nicht zu verändern: DDRD = DDRD | B11111100;

Verwendete Bauteile

Versuch I.

Das folgende Beispiel setzt den Port B zunächst im setup() auf den Modus OUTPUT und legt dann an den Pins 2 und 4 abwechselnd HIGH und LOW an. Dazwischen liegt eine Verzögerungszeit von 1 Sekunde.

Aufbau auf dem Breadboard
void setup()
{
    DDRD = B11111111; // set PORTD to output
}

void loop()
{
    PORTD = B00010000; // set Pin 4 to HIGH all other to LOW
    delay(1000);

    PORTD = B00000100; // set Pin 2 to HIGH all other to LOW
    delay(1000);
}

Versuch II.: Binärzähler

Dieses Beispiel zeigt die recht elegante Lösung für einen Binärzähler. Im Sketch kann man sehen, dass auch Dezimalzahlen an das Portregister übergeben werden können. So kann man leicht in einer Schleife den Iterator hochzählen und die "Bits" fallen dann sozusagen von alleine ab.

Aufbau auf dem Breadboard
void setup()
{
    DDRD = B00001111; // set PORTD (digital 0..3) to output
}

void loop()
{
    for(byte i=0; i<16; i++) {
        PORTD = i;
        delay(250);
    }
}
Video: Demonstration des LED-Binärzahlers durch Port-Manipulation

Versuch III.: Input

Im dritten Experiment wird der Port-B als Eingang konfiguriert und dessen Werte an die serielle Konsole weitergegeben.

void setup()
{
    DDRB = B00000000; // set PORTB to input
    Serial.begin(9600);
}

void loop()
{
    Serial.println(PINB);
    delay(1000);
}
zurück