Die digitalen und die analogen Pins des Arduinos sind in drei Gruppen aufgeteilt:
Funktionen wie digitalWrite() und digitalRead() sind relativ langsam in der Ausführung und manchmal werden Programme mit vielen Ein- oder Ausgängen komplex und schwer überschaubar.Deshalb ist es oft übersichtlicher die Pins mithilfe der Ports zu definieren und zu schalten.
Es existieren drei sogenannte Register:
Register | Funktion |
---|---|
DDR(D,B,C) | Pins als INPUT = 0 oder als OUTPUT = 1 definieren |
PORT(D,B,C) | Pins als HIGH = 1 oder als LOW = 0 festlegen |
PIN(D,B,C) | gibt den Zustand der Pins an, die im DDR-Register auf Input gesetzt wurden |
Das Register wird jeweils mit dem Namen des Ports (D, B oder C) ergänzt.
Beim Zugriff auf die Ports wird jeweils ein Bit gesetzt. Sein Wert ist entweder 1 = an, oder 0 = aus
Beispiele:
Digitale Pins 7, 6, 5, 4 und 3 als OUTPUT setzen
DDRD = B11111000;
Digitale Pins 7, 6, 5, 4 und 3 auf HIGH setzen:
PORTD = B11111000;
Taster an Pin 13 als INPUT setzen
DDRB = B00100000;
PULL_UP-Widerstand an Pin 13 einschalten
PORTB = B00100000;
Beispiel: Wechselblinker mit Ports
void setup()
{
// Pins 7 und 5 als OUTPUT definieren
DDRD = B10100000;
}
void loop()
{
// LED an Pin 7 einschalten
PORTD = B10000000;
delay(1000);
// alle LEDs ausschalten
PORTD = B00000000;
// LED an Pin 5 einschalten
PORTD = B00100000;
delay(1000);
// alle LEDs ausschalten
PORTD = B00000000;
}
Beispiel: Ampel
void setup()
{
// Pins 7 bis 5 als OUTPUT definieren
DDRD = B11100000;
}
void loop()
{
// LED an Pin 5 (rot) einschalten
PORTD = B00100000;
delay(5000);
// LED an Pin 5 und Pin 6 (rot/gelb) einschalten
PORTD = B01100000;
delay(1000);
// LED an Pin 7 (grün) einschalten
PORTD = B10000000;
delay(3000);
// LED an Pin 6 (gelb) einschalten
PORTD = B01000000;
delay(1000);
}
Einzelne Bits werden mit den Operatoren << eine Position nach links und >> eine Position nach rechts verschoben.
Nach rechts schieben:
PORTD = PORTD >> 1;
PORTD = PORTD >> 1;
PORTD = PORTD >> 1;
PORTD = PORTD >> 1;
PORTD = PORTD >> 1;
Nach links schieben:
PORTD = PORTD << 1;
PORTD = PORTD << 1;
PORTD = PORTD << 1;
PORTD = PORTD << 1;
PORTD = PORTD << 1;
Der Parameter ~ kehrt den Wert eines Bits um:
// LEDs an den Pins 7 5 3 leuchten
PORTD = B10101000;
// Werte umkehren, aus 0 wird 1 und aus 1 wird 0
PORTD = ~PORTD;
// PORTD hat jetzt den Wert B01010111
// -> Die LEDs an den Pins 6 4 leuchten (Pins 2 bis 0 sind nicht belegt)