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;
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);
}
}
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.
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.