LEDs schal­ten mit PORT/DDR

Lese­zeit: 5 Minu­ten
Navi­ga­ti­on

Die LEDs sol­len als Lauf­licht und in ver­schie­de­nen Kom­bi­na­ti­on leuchten:

  • Lauf­licht hin und zurück
  • alle LEDs
  • die LEDs 7 5 3 
  • die bei­den inne­ren LEDs 
  • die bei­den äuße­ren LEDs
  • alle außer den äuße­ren LEDs
  • nur die mittlere

So sieht es aus:

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-Register 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; 

PULL_UP-Widerstand an Pin 13 einschalten

PORTB = B00100000;

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)

Benö­tig­te Bauteile:

  • 5 LEDs
  • 5 Wider­stän­de > 100 Ω
  • Lei­tungs­dräh­te

Baue die Schal­tung auf:
(Fah­re mit der Maus über das Bild, um die Bezeich­nun­gen der Bau­tei­le zu sehen)

Das Pro­gramm. Beach­te die Kommentare.

int Leuchtdauer = 200;

void setup() 
{
  // Pins 7 bis 3 als OUTPUT definieren
  DDRD = B11111000;
}

void loop()
{
  // Lauflicht hin Start mit LED Pin 7
  PORTD = B10000000;
  delay(Leuchtdauer);
  for (int i = 0; i < 4; i++)
  {
    /*
      1 Bit nach rechts schieben
      B01000000 -> Pin 6
      B00100000 -> Pin 5
      B00010000 -> Pin 4
      B00001000 -> Pin 3
    */
    PORTD = PORTD >> 1;
    delay(Leuchtdauer);
  }

  // Lauflicht zurück Start mit LED Pin 3
  PORTD = B00001000;
  delay(Leuchtdauer);
  for (int i = 0; i < 4; i++)
  {
    /*
      1 Bit nach links schieben
      B00010000 -> Pin 4
      B00100000 -> Pin 5
      B01000000 -> Pin 6
      B10000000 -> Pin 7
    */
    PORTD = PORTD << 1;
    delay(Leuchtdauer);
  }
  delay(Leuchtdauer);
  
  // alle LEDs
  PORTD = B11111000;
  delay(1000);

  // alle aus
  PORTD = B00000000;
  delay(1000);

  // LEDs an den Pins 7 5 3 leuchten
  PORTD = B10101000;
  delay(1000);

  // umkehren
  PORTD = ~PORTD;
  delay(1000);

  // die beiden äußeren
  PORTD = B10001000;
  delay(1000);

  // die inneren
  PORTD = ~PORTD;;
  delay(1000);
  
  // nur die mittlere
  PORTD = B00100000;
  delay(1000);

  // alle aus
  PORTD = B00000000;
  delay(1000);
}


Ver­wand­te Aufgaben:


Letzte Aktualisierung: 7. Jan 2021 @ 22:00