Arduino Uno alle Ausgänge eines Ports gleichzeitig einschalten?


09.01.2025, 07:47

Ein erster Anfang, aber es funktioniert.

```cpp
/*
  Lauflicht
  


*/
int led1 = 9;
int led2 = 8;
int led3 = 7;
int led4 = 6;
int led5 = 5;
int led6 = 4;
int led7 = 3;
int led8 = 2;


int pinsGesamt = 8;                       // deklariert die ganzzahlige Variable pinsGesamt
int pins[] = { 2, 3, 4, 5, 6, 7, 8, 9 };  // deklariert das Array pins[]


void setup() {
  //Startsequenz
  //Beginn
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
  pinMode(led3, OUTPUT);
  pinMode(led4, OUTPUT);
  pinMode(led5, OUTPUT);
  pinMode(led6, OUTPUT);
  pinMode(led7, OUTPUT);
  pinMode(led8, OUTPUT);


  digitalWrite(led1, HIGH);
  digitalWrite(led2, HIGH);
  digitalWrite(led3, HIGH);
  digitalWrite(led4, HIGH);
  digitalWrite(led5, HIGH);
  digitalWrite(led6, HIGH);
  digitalWrite(led7, HIGH);
  digitalWrite(led8, HIGH);


  delay(1500);


  digitalWrite(led1, LOW);
  digitalWrite(led2, LOW);
  digitalWrite(led3, LOW);
  digitalWrite(led4, LOW);
  digitalWrite(led5, LOW);
  digitalWrite(led6, LOW);
  digitalWrite(led7, LOW);
  digitalWrite(led8, LOW);
  delay(1500);
//Startsequenz
//Ende


  for (int i = 0; i < pinsGesamt; i = i + 1) {  // zählt die Variable i von 0 bis 7
    pinMode(pins[i], OUTPUT);                   // initialisiert den Pin an der pins-Array-Stelle i als OUTPUT
  }
}


void loop() {
  for (int i = 0; i < pinsGesamt; i = i + 1) {  // Lauflicht Hin
    digitalWrite(pins[i], HIGH);                // LED an der Stelle i einschalten
    delay(100);                                 // hält das Programm für 100 Millisekunden an
    digitalWrite(pins[i], LOW);                 // LED an der Stelle i ausschalten
  }
  for (int i = 6; i > 0; i = i - 1) {  // Lauflicht Zurück (die äußeren LEDs werden nicht angesteuert)
    digitalWrite(pins[i], HIGH);       // LED an der Stelle i einschalten
    delay(100);                        // hält das Programm für 100 Millisekunden an
    digitalWrite(pins[i], LOW);        // LED an der Stelle i ausschalten
  }
}
```


3 Antworten

Vom Beitragsersteller als hilfreich ausgezeichnet

In dem Du den Befehl mehrfach nacheinander schreibst.

{
....anderer Code....
digitalWrite(4, HIGH);
digitalWrite(5, HIGH);
....weiterer Code....
}

Die Verzögerung wirst Du nicht merken... Kannst Du nur mit einem Oszilloskop messtechnisch darstellen. Sonst musst Du in Richtung Assembler gehen, da sprichst Du einen ganzen Port an, statt nur einen Pin... Ob die dann aber tatsächlich gleichzeitig gesetzt werden oder auch schnell nacheinander? So tief stecke ich nicht drin...

Funfakt, ein Port bezeichnet mehrere I/O in Assembler. Daher kritisch, einen Pin als Port zu bezeichnen, kann zur Verwechslung führen...


Premutos85  09.01.2025, 07:05

2. Möglichkeit wären adressierbare LED. Da benötigt man nur einen Ausgang. WS2812 LEDs zum Beispiel.

KaePie  09.01.2025, 07:15

Das funktioniert natürlich, aber verursacht sinnloser Weise zu großen Code. Auf dem Arduino hast du nicht so viel davon. Ports direkt ansprechen geht auch viel schneller

NadjaX1970 
Beitragsersteller
 09.01.2025, 07:48

Ich habe meine Frage mit dem Code ergänzt. Wird sicherlich nicht das Optimum sein, aber es funktioniert schon wie gewünscht.

Wozu machst du die PIN MODE For SChleife. Du hast vorher doch schon alles von Hand gemacht?

In Assembler schickst du immer ein Byte gleichzeitig über den internen Bus, also 8 Pins gleichzeitig.

Wie gleichzeitig brauchst du es denn ?

Du kannst delay (100) variiieren oder sogar ganz weglassen.

Bei delay(0) oder delay(10) wird das Auge schon alle gleichzeitig wahrnehmen.


NadjaX1970 
Beitragsersteller
 09.01.2025, 08:37

Nun ja, ich mache das so, weil ich es nicht besser weiß. So firm bin ich im Programmieren noch nicht. Klar ist der Code etwas umständlich. Aber es funktioniert ja schon.

Nach jedem Einschalten leuchten alle LEDs gleichzeitig auf und gehen nach kurzer Zeit wieder aus. Das wird nur einmal ausgeführt.

Danach geht das eigentliche Lauflicht los.

Lothar1974  09.01.2025, 10:49
@NadjaX1970

delay(1500) wartet bei leuchtenden LED 1.5 Sekunden, dann kommt der Befehl zum ausmachen. . Dann wieder delay (1500) 1500millisekunden. Solange sind die LED sicher aus, bevor der nächste Befehl kommt. Fehlt dir jetzt noch etwas? Wie gesagt , die Ports als Ausgang zu definieren machst du eigentlich doppelt.

NadjaX1970 
Beitragsersteller
 09.01.2025, 18:14
@Lothar1974

Wenn ich es besser wüsste, hätte ich es sicher anders geschrieben.

Beschäftige dich damit, wie du Pin und Ports direktmanipulieren kannst.

Google nach "Ports bei dem Atmega" du bekommst Anleitungen ohne Ende.

Beispiel aus einem meiner Quellcodes:

//digitalWrite(clockPin, HIGH);
    PORTA |= (1 << _clockPin);

//digitalWrite(clockPin, LOW);
    PORTA &= ~(1 << _clockPin);

Woher ich das weiß:Hobby