Schieberegister 74HC595N ohne delay

Hallo,

ich bin Arduino-Neuanfänger, also bitte nicht verhauen.

Für die Mogelleisenbahn meines Sohnes versuche ich, an einem Arduino eine RGBLED und ein Schieberegister 74HC595N GLEICHZEITIG zu steuern.

Da beide Sketches mit der delay-Funktion arbeiten, konnte ich beide Sketches nur hintereinander ablaufen lassen, was blöd aussieht.

Für die RGB-LED habe ich inzwischen einen Sketch ohne delay gefunden.

Aber für das Beschreiben des Schieberegisters finde ich einfach nichts Passendes.

Für den Anfang würde es mir genügen acht LEDs zu steuern, Ziel sind 10 LEDs.

Hier mein Sketchversuch:

int latchPin = 9; //ST
int clockPin = 8; //SH
int dataPin = 10;  //DS

int daten [8] = {1,2,4,8,16,32,64,128};

unsigned long previousMillis;
const long interval = 2000;

void setup() {

pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
}

void loop() {unsigned long currentMillis = millis(); 
 if (currentMillis - previousMillis >= interval) { 
    previousMillis = currentMillis;

  for (int index1 = 0; index1 <= 7; index1 ++) 
  {digitalWrite(latchPin, LOW);
  shiftOut(dataPin, clockPin, LSBFIRST, daten [index1]);  
  digitalWrite(latchPin, HIGH);
  
}
}
}

Das funktioniert aber nicht.

Könnt Ihr mir helfen?

Danke.

Andree

Dein Sohn tut mir jetzt schon leid.
Was soll er mit einer "Mogeleisenbahn" ? :wink:

Ok, mal im Ernst, wozu soll das Schieberegister gut sein, was willst du damitmachen ?

Warum nimmst du keine WS2812 LEDs? Da kannst du auch 500 LEDs in allen Farben mit einem Pin ansteuern.

Ansonsten "Blink without delay"

Lieben Gruß,
Chris

Hallo
hier kommt ein Link zu einem Tutorial für das weitere Studium.

bluekanada:
... GLEICHZEITIG ...

Was Du möchtest ist möglich, indem Du einen „Endlichen Automaten“ programmierst. Das ist eine Art Programmierstrickmuster, das Quasi-Gleichzeitigkeit ermöglicht. Was mir hierzu eingefallen ist, kannst Du hier lesen. Außerdem ist auch das Beispiel „BlinkWithoutDelay“ in der IDE (Datei -> Beispiele -> 2. Digital) hilfreich.

Gruß

Gregor

Hallo Andree, von Ulrich -- noch neuerer
dein PGM funktioniert. es nudelt 2 Sekunden um dann in einem void-loop Durchgang die for-Schleife raus zu schießen. Es flackert tatsächlich aber viel zu schnell. Also: void-loop ist die Schleife ; for wegnehmen. Ist der Zeitpunkt ermittelt, einen Daten[] wert rausschieben und dann weiternudeln, vielleicht nach zig void-loop Durchläufen wird der nächste Startzeitpunkt ermittelt und dann eben der nächste Daten[] wert herausgeschoben. Ich habe es ausprobiert - funktioniert schön. Etwas Kosmetik an Datentypen, Einrückungen habe ich mir erlaubt.

//bua 2021-01-31 74HC595 ohne delay und auch ohne for ----- für MEGA 2560
int latchPin = 47; //ST
int clockPin = 45; //SH
int dataPin = 51;  //DS
byte index1 =0;
int daten [] = {1,2,4,8,16,32,64,128};
unsigned long currentMillis;
unsigned long previousMillis;
const unsigned long interval = 2000L;


void setup() 
 {
 pinMode(latchPin, OUTPUT);
 pinMode(clockPin, OUTPUT);
 pinMode(dataPin, OUTPUT);
 }
void loop()
 { 
 currentMillis = millis();
 if  (currentMillis - previousMillis >= interval)
     {
     previousMillis = currentMillis;
     digitalWrite(latchPin, LOW);
     shiftOut(dataPin, clockPin, MSBFIRST, daten[index1]);  
     digitalWrite(latchPin, HIGH);
     index1++;
     if(index1>= 8){index1=0;}
     }
 }
  1. ist 8)

Hallo,

du musst den Code in code tags einrahmen. Entweder linker Button über den Smilie Buttons.
Oder händisch mit code und /code jeweils in eckige Klammern. Dazwischen den eigentlichen Code.
Oder in der IDE > Bearbeiten > Für Forum kopieren anklicken und hier einfügen. Dann sind die code tags automatisch dabei.

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.