Port­ma­ni­pu­la­ti­on

Lese­zeit: 4 Minu­ten

Die digi­ta­len und die ana­lo­gen Pins des Ardui­nos sind in drei Grup­pen aufgeteilt:

Funk­tio­nen wie digi­tal­Wri­te() und digi­tal­Read() sind rela­tiv lang­sam in der Aus­füh­rung und manch­mal wer­den Pro­gram­me mit vie­len Ein- oder Aus­gän­gen kom­plex und schwer überschaubar.Deshalb ist es oft über­sicht­li­cher die Pins mit­hil­fe der Ports zu defi­nie­ren und zu schalten.

Es exis­tie­ren drei soge­nann­te Register:

Regis­terFunk­ti­on
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-Regis­ter auf Input gesetzt wurden

Das Regis­ter 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 ent­we­der 1 = an, oder 0 = aus 

Bei­spie­le:

Digi­ta­le Pins 7, 6, 5, 4 und 3 als OUTPUT setzen

DDRD = B11111000;

Digi­ta­le Pins 7, 6, 5, 4 und 3 auf HIGH setzen:

PORTD = B11111000;

Tas­ter an Pin 13 als INPUT setzen

DDRB = B00100000; 

PUL­L_UP-Wider­stand an Pin 13 einschalten

PORTB = B00100000;

Bei­spiel: Wech­sel­b­lin­ker 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;
}

Bei­spiel: 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);
}

Ein­zel­ne Bits wer­den mit den Ope­ra­to­ren << eine Posi­ti­on nach links und >> eine Posi­ti­on 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;

Bit­ma­ni­pu­la­ti­on

Der Para­me­ter ~ 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)