zurück zur Übersicht...

Direkte Port-Manipulation

Hinweis: 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

Ex. 1

Das folgende Beispiel setzt den Port B zunächt 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);
}

Ex. 2 (Binärzähler)

Dieses Beispiel zeigt die recht elegante Lösung für einen Binärzähler. Im Sketch kann man sehen, das 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

Ex. 3

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