Zeitliche Synchronisierung von Ausgänge

Hallo,
für die Beleuchtuns-Steuerung meines Star Trek Modells bräuchte ich Hilfe. Ich benutzte einen UNO mit diversen angeschlossenen LEDs. Unter anderem um das "Hochfahren" von den einzelnen Antriebs-LEDs zu simulieren. Das Problem ist, dass das Hochfahren zeitversetzt passiert. Wie kann ich das Ansteuern von mehreren PINs zeitlich synchronisieren ?

int SignalMitteOben = 7;
int EngineMain = 3;
int EngineLeft = 5;
int EngineRight = 6;
int EngineImpulsA = 9;
int EngineImpulsB = 10;

void setup() {
pinMode(SignalMitteOben, OUTPUT);
pinMode(EngineMain, OUTPUT);
pinMode(EngineLeft, OUTPUT);
pinMode(EngineRight, OUTPUT);
pinMode(EngineImpulsA, OUTPUT);
pinMode(EngineImpulsB, OUTPUT);
}

void loop() {
EngineStart(EngineRight);
EngineStart2(EngineLeft);
//EngineStart3(EngineMain);
}

void EngineStart(int led){

for(int i = 0; i < 200; i++){
analogWrite(led, i);
delay(20);
}
delay(20);
for(int i = 200; i > 10; i--){
analogWrite(led, i);
delay(20);
}}

void EngineStart2(int led){

for(int i = 0; i < 200; i++){
analogWrite(led, i);
delay(20);
}

delay(20);
for(int i = 200; i > 10; i--){
analogWrite(led, i);
delay(20);
}}

Vielleicht möchtest du endliche Automaten bauen, z.B. Schrittketten.

Tipp:
"Blink without Delay" zeigt dir wie man Nebenläufigkeiten baut.

aktuell machst du eine LED nach der anderen.
Du könntest aber deiner Funktion auch zwei LEDs übergeben und dann beide LEDs in der gleichen For loop bearbeiten

void EngineStartQuasiGleichzeitig(int led, int ledNochEine){
  for(int i = 0; i < 200; i++){
    analogWrite(led, i);
    analogWrite(ledNochEine, i);
    delay(20);
  }
}

Hi,
danke dir ! Ich probiere es direkt aus :slight_smile:

VG

Nochwas zur Theorie.
Wenn Du 2 Digital-Writee() auf 2 Pins nacheinander machst, sind die Pins um ca 3- 4 µS versetzt.
Das sieht man bei LED unmöglich.
Wenn das wirklich mal zuviel sind gibt es auch eine schnellere Variante des digitalWrite() und auchs Direkt Port Maipulation.

Schnellere Version mit einer Bibliothek:
https://pololu.github.io/fastgpio-arduino/

Direct Port Manipulation:
Die 20 Pins sind in 3 Ports a 8 Bit organisiert. ( einige fehlen weil Reset und Quarzpin auch drauf sind) Dann gibt es 3 Register pro Port. Eines das Bestimmt ob die Pins Eingang oder Ausgang sein soll, eines das die Pins einließt und eines das die Pins auf HIGH bze LOW setzt. Dabei ist jeweils ein Bit für ein Pin zuständig.

Um ein Pin zu setzen muß man den Zustand des Ports auslesen, Das für das Pin zuständige Bit verändern und dann wieder in den Port-Register schreiben. Das sind 3 Maschinenbefehle die zusammen weiniger als 0,3 µS brauchen.

Wenn man die richtigen Pins verwendet, weil sie alle auf dem gleichen Port liegen, kann man bis zu 8 Pins gleichzeitig schalten. Braucht man mehr als 8 Pins gleichzeitig, ist das ohne Zusatzhardware nicht 100% möglich.

Genauere Erklährung:
Arduino Fast digitalWrite - The Robotics Back-End oder
https://www.instructables.com/Fast-digitalRead-digitalWrite-for-Arduino/

Aber glaub mir solche zeitliche Gleichzeitigkeit (im unteren µS Bereich) ist höchst selten notwendig.

Grüße Uwe