Arduino – Ein- / Ausgangsports

  1. Data Direction Register x (DDRx)
    Die einzelnen Bits geben an, ob der jeweilige Pin als Ein- oder Ausgang benutzt wird.
    DDxn = 0 -> Eingang
    DDxn = 1 -> Ausgang
  2. Port x Data Register (PORTx)
    Wenn ein Pin im Data Direction Register x (DDRx) als Ausgang definiert ist:
    PORTxn = 0 -> Ausgabe von logisch „0“
    PORTxn = 1 -> Ausgabe von logisch „1“
    Wenn ein Pin im Data Direction Register X (DDRX) als Eingang definiert ist:
    PORTxn = 0 -> Interner Pullup-Widerstand deaktiviert
    PORTxn = 1 -> Interner Pullup-Widerstand aktiviert
  3. Port x Input Pins Register (PINxn)
    Wenn ein Pin im Data Direction Register X (DDRX) als Eingang definiert ist, stellt PINXn des jeweiligen Zustand des Pins dar.

Tabelle 1:

Bit (n) 7 6 5 4 3 2 1 0
DDRx  DDxn DDxn DDxn DDxn DDxn DDxn DDxn DDxn
PORTBn D13 D12 D11 D10 D9 D8
PORTCn A5 A4 A3 A2 A1 A0
PORTDn D7 D6 D5 D4 D3 D2 D1 D0
PINx PINx7 PINx6 PINx5 PINx4 PINx3 PINx2 PINx1 PINx0
Ein- / Ausgangsports

x = Portnummer, n = Bitnummer

Beispiel:
Setzen der Binär-Pins D2 und D7 als Ausgang:

(D2 und D7 sind die Bits 2 und 7 am Port D)

DDRD |= B10000100; // Nur Bit 2 und 7 werden verändert

// oder

DDRD |= (1 << DDD2); //D2 ist Ausgang
DDRD |= (1 << DDD7); //D7 ist Ausgang

// oder

DDRD |= (1 << DDD2) | (1 << DDD7); //D2 und D7 sind Ausgaenge


Ausgabe von logisch „1“ und logisch „0“ am Beispiel Binär-Pin D10:

(D10 ist das Bit 2 am Port B)

//D10 als Ausgang setzen
DDRB |= (1 << DDB2);

//D10 auf "1" setzen
PORTB |= (1 << PORTB2);

//D10 auf "0" setzen
PORTB &= ~(1 << PORTB2);


Einlesen des Binär-Pins D5 mit internem Pullup-Widerstand:

(D5 ist das Bit 5 am Port D)

//D5 als Eingang setzen
DDRD &= ~(1 << DDD5);

//Pullup-Widerstand aktivieren
PORTD |= (1 << PORTD5);

//Abfrage des Eingangs-Pin D5
byte bitStatus = (PIND & (1 << PIND5)) >> PIND5;