Arduino Uno alle Ausgänge eines Ports gleichzeitig einschalten?
Hallo zusammen,
Ich habe ein Arduino Uno Board und möchte daran 8 LEDs anschließen. Diese 8 LEDs sollen aber nun gemeinsam ein bzw. ausgeschaltet werden.
Es soll so eine Art Blinkleiste werden.
Die Frage ist jetzt nur, wie programmiere ich das?
Wie man einen Port ein bzw. ausschaltet, ist mir geläufig, aber wie geht das mit allen Ausgängen eines Ports?
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
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...
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.
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);