8x8x8 RGB Cube Schieberegister Probleme

Moin in die Runde,

Ich bin gerade mit meinem "kleinen" Cube dran und stoße beim Multiplexen auf ein Problem.

Ich steuer immer nur einen Layer (Kathoden) Gleichzeitig an und lege auf die Anoden der LEDs zuvor das komplette Muster für den Layer (Schieberegister), erst dann Steuer ich den FET für den Layer an.

Beispiel:
Ich steuer den untersten Layer nur komplett rot an, der zweite Layer soll komplett aus sein (genullt), aber trotzdem leuchten alle LEDs noch leicht auf.
Aber nur für einen Bruchteil einer Sekunde.

In dem Beispielcode, den ich hier hochgeladen habe, sieht man, dass die on/off time jeweils 3Sekunden beträgt. Der Layer der leuchten soll, leuchtet auch in voller Länge, wie er soll.
Nur der nächste Layer (der darüber) leuchtet auch noch ganz kurz.

Nach Messungen konnte ich feststellen, dass der Ausgang vom Schieberegister noch auf 5V steht, obwohl dieser schon auf 0 sein sollte.
Dann dachte ich mir, das vielleicht irgendwelche Kapazitäten innerhalb des SR entstehen und sich mit dem nächsten Layer entladen... Habe direkt an Ausgänge mal Testweise einen 1k Widerstand gegen GND geschaltet..
Gleiches Problem..

Habt ihr eine Idee wo das problem liegen könnte?

PS: Die Leiterplatten habe ich vor über 3 Jahren erstellt, daher war mir etwas wie z.B. eine Emitterschaltung nicht bekannt.

Die Transistoren sollen einfache Treiber sein, da der 595 nicht viel Strom verkraftet.
Die zwei Treiberstufen habe ich genutzt, damit der Ausgangspegel des SR auch gleich mit dem an der Anode ist.

Bilder von Layer 1 und 2. (Layer 2 wird auch nochmal schnell durchgeschoben, als würden die Schiftregister erst dann Nullen reinschieben. Videos kann ich hier nicht hochladen, daher Bilder.



Schaltpläne:


#include <digitalWriteFast.h>

//Arduino Pins
const byte allePins[] = {2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14};
const int data3 = 6;
const int data2 = 5;
const int data1 = 4;
const int clockPin = 3;
const int latchPin = 2;

const byte alleLayers[] = {7, 8, 9, 10, 11, 12, 13, 14};
const int layer1 = 7;
const int layer2 = 8;
const int layer3 = 9;
const int layer4 = 10;
const int layer5 = 11;
const int layer6 = 12;
const int layer7 = 13;
const int layer8 = 14;



//Struct für die Muster
typedef struct {
  const char rot;
  const char gruen;
  const char blau;
} cube;


/*
const cube Beispiel[8][8] = {
//------Layer1----------------Layer2----------------Layer3----------------Layer4----------------Layer5----------------Layer6----------------Layer7----------------Layer8--------
//---R-----G-----B---------R-----G-----B---------R-----G-----B---------R-----G-----B---------R-----G-----B---------R-----G-----B---------R-----G-----B---------R-----G-----B----
  {{0x00, 0x00, 0x00},   {0x00, 0x00, 0x00},   {0x00, 0x00, 0x00},   {0x00, 0x00, 0x00},   {0x00, 0x00, 0x00},   {0x00, 0x00, 0x00},   {0x00, 0x00, 0x00},   {0x00, 0x00, 0x00}},   //Schieberegister 1
  {{0x00, 0x00, 0x00},   {0x00, 0x00, 0x00},   {0x00, 0x00, 0x00},   {0x00, 0x00, 0x00},   {0x00, 0x00, 0x00},   {0x00, 0x00, 0x00},   {0x00, 0x00, 0x00},   {0x00, 0x00, 0x00}},   //Schieberegister 2
  {{0x00, 0x00, 0x00},   {0x00, 0x00, 0x00},   {0x00, 0x00, 0x00},   {0x00, 0x00, 0x00},   {0x00, 0x00, 0x00},   {0x00, 0x00, 0x00},   {0x00, 0x00, 0x00},   {0x00, 0x00, 0x00}},   //Schieberegister 3
  {{0x00, 0x00, 0x00},   {0x00, 0x00, 0x00},   {0x00, 0x00, 0x00},   {0x00, 0x00, 0x00},   {0x00, 0x00, 0x00},   {0x00, 0x00, 0x00},   {0x00, 0x00, 0x00},   {0x00, 0x00, 0x00}},   //Schieberegister 4
  {{0x00, 0x00, 0x00},   {0x00, 0x00, 0x00},   {0x00, 0x00, 0x00},   {0x00, 0x00, 0x00},   {0x00, 0x00, 0x00},   {0x00, 0x00, 0x00},   {0x00, 0x00, 0x00},   {0x00, 0x00, 0x00}},   //Schieberegister 5
  {{0x00, 0x00, 0x00},   {0x00, 0x00, 0x00},   {0x00, 0x00, 0x00},   {0x00, 0x00, 0x00},   {0x00, 0x00, 0x00},   {0x00, 0x00, 0x00},   {0x00, 0x00, 0x00},   {0x00, 0x00, 0x00}},   //Schieberegister 6
  {{0x00, 0x00, 0x00},   {0x00, 0x00, 0x00},   {0x00, 0x00, 0x00},   {0x00, 0x00, 0x00},   {0x00, 0x00, 0x00},   {0x00, 0x00, 0x00},   {0x00, 0x00, 0x00},   {0x00, 0x00, 0x00}},   //Schieberegister 7
  {{0x00, 0x00, 0x00},   {0x00, 0x00, 0x00},   {0x00, 0x00, 0x00},   {0x00, 0x00, 0x00},   {0x00, 0x00, 0x00},   {0x00, 0x00, 0x00},   {0x00, 0x00, 0x00},   {0x00, 0x00, 0x00}}    //Schieberegister 8
};
*/
const cube test_muster[8][8] = {
  {{0xFF, 0x00, 0x00},   {0x00, 0x00, 0x00},   {0x00, 0xFF, 0x00},   {0x00, 0x00, 0x00},   {0x00, 0x00, 0xFF},   {0x00, 0x00, 0x00},   {0xFF, 0xFF, 0xFF},   {0x00, 0x00, 0x00}},
  {{0xFF, 0x00, 0x00},   {0x00, 0x00, 0x00},   {0x00, 0xFF, 0x00},   {0x00, 0x00, 0x00},   {0x00, 0x00, 0xFF},   {0x00, 0x00, 0x00},   {0xFF, 0xFF, 0xFF},   {0x00, 0x00, 0x00}},
  {{0xFF, 0x00, 0x00},   {0x00, 0x00, 0x00},   {0x00, 0xFF, 0x00},   {0x00, 0x00, 0x00},   {0x00, 0x00, 0xFF},   {0x00, 0x00, 0x00},   {0xFF, 0xFF, 0xFF},   {0x00, 0x00, 0x00}},
  {{0xFF, 0x00, 0x00},   {0x00, 0x00, 0x00},   {0x00, 0xFF, 0x00},   {0x00, 0x00, 0x00},   {0x00, 0x00, 0xFF},   {0x00, 0x00, 0x00},   {0xFF, 0xFF, 0xFF},   {0x00, 0x00, 0x00}},
  {{0xFF, 0x00, 0x00},   {0x00, 0x00, 0x00},   {0x00, 0xFF, 0x00},   {0x00, 0x00, 0x00},   {0x00, 0x00, 0xFF},   {0x00, 0x00, 0x00},   {0xFF, 0xFF, 0xFF},   {0x00, 0x00, 0x00}},
  {{0xFF, 0x00, 0x00},   {0x00, 0x00, 0x00},   {0x00, 0xFF, 0x00},   {0x00, 0x00, 0x00},   {0x00, 0x00, 0xFF},   {0x00, 0x00, 0x00},   {0xFF, 0xFF, 0xFF},   {0x00, 0x00, 0x00}},
  {{0xFF, 0x00, 0x00},   {0x00, 0x00, 0x00},   {0x00, 0xFF, 0x00},   {0x00, 0x00, 0x00},   {0x00, 0x00, 0xFF},   {0x00, 0x00, 0x00},   {0xFF, 0xFF, 0xFF},   {0x00, 0x00, 0x00}},
  {{0xFF, 0x00, 0x00},   {0x00, 0x00, 0x00},   {0x00, 0xFF, 0x00},   {0x00, 0x00, 0x00},   {0x00, 0x00, 0xFF},   {0x00, 0x00, 0x00},   {0xFF, 0xFF, 0xFF},   {0x00, 0x00, 0x00}}
};

const cube layer8an[8][8] = {
  {{0x00, 0x00, 0x00},   {0x00, 0x00, 0x00},   {0x00, 0x00, 0x00},   {0x00, 0x00, 0x00},   {0x00, 0x00, 0x00},   {0x00, 0x00, 0x00},   {0x00, 0x00, 0x00},   {0x00, 0xFF, 0x00}},
  {{0x00, 0x00, 0x00},   {0x00, 0x00, 0x00},   {0x00, 0x00, 0x00},   {0x00, 0x00, 0x00},   {0x00, 0x00, 0x00},   {0x00, 0x00, 0x00},   {0x00, 0x00, 0x00},   {0x00, 0xFF, 0x00}},
  {{0x00, 0x00, 0x00},   {0x00, 0x00, 0x00},   {0x00, 0x00, 0x00},   {0x00, 0x00, 0x00},   {0x00, 0x00, 0x00},   {0x00, 0x00, 0x00},   {0x00, 0x00, 0x00},   {0x00, 0xFF, 0x00}},
  {{0x00, 0x00, 0x00},   {0x00, 0x00, 0x00},   {0x00, 0x00, 0x00},   {0x00, 0x00, 0x00},   {0x00, 0x00, 0x00},   {0x00, 0x00, 0x00},   {0x00, 0x00, 0x00},   {0x00, 0xFF, 0x00}},
  {{0x00, 0x00, 0x00},   {0x00, 0x00, 0x00},   {0x00, 0x00, 0x00},   {0x00, 0x00, 0x00},   {0x00, 0x00, 0x00},   {0x00, 0x00, 0x00},   {0x00, 0x00, 0x00},   {0x00, 0xFF, 0x00}},
  {{0x00, 0x00, 0x00},   {0x00, 0x00, 0x00},   {0x00, 0x00, 0x00},   {0x00, 0x00, 0x00},   {0x00, 0x00, 0x00},   {0x00, 0x00, 0x00},   {0x00, 0x00, 0x00},   {0x00, 0xFF, 0x00}},
  {{0x00, 0x00, 0x00},   {0x00, 0x00, 0x00},   {0x00, 0x00, 0x00},   {0x00, 0x00, 0x00},   {0x00, 0x00, 0x00},   {0x00, 0x00, 0x00},   {0x00, 0x00, 0x00},   {0x00, 0xFF, 0x00}},
  {{0x00, 0x00, 0x00},   {0x00, 0x00, 0x00},   {0x00, 0x00, 0x00},   {0x00, 0x00, 0x00},   {0x00, 0x00, 0x00},   {0x00, 0x00, 0x00},   {0x00, 0x00, 0x00},   {0x00, 0xFF, 0x00}}
};



void setup() {
  Serial.begin(115200);
  for (int i = 0; i < sizeof(allePins); i++) {
    pinMode(allePins[i], OUTPUT);
  }
  allOff();
  delay(1000);
}


//---------------------------------------------------------Loop
void loop() {
  lampe(255, 255, 255, 300, 1, 1000);

  anzeigen(test_muster);
}




//------------------------------------------------------------Muster anzeigen
void anzeigen(cube data[8][8]){
  for (int k = 0; k < 1000; k++) {
    for (int j = 0; j < 8; j++) {

      digitalWriteFast(latchPin, 0);
      shiftOut(data[0][j].rot, data[0][j].gruen, data[0][j].blau);
      shiftOut(data[1][j].rot, data[1][j].gruen, data[1][j].blau);
      shiftOut(data[2][j].rot, data[2][j].gruen, data[2][j].blau);
      shiftOut(data[3][j].rot, data[3][j].gruen, data[3][j].blau);
      shiftOut(data[4][j].rot, data[4][j].gruen, data[4][j].blau);
      shiftOut(data[5][j].rot, data[5][j].gruen, data[5][j].blau);
      shiftOut(data[6][j].rot, data[6][j].gruen, data[6][j].blau);
      shiftOut(data[7][j].rot, data[7][j].gruen, data[7][j].blau);
      digitalWriteFast(latchPin, 1);
      delay(3000);
      
      digitalWriteFast(alleLayers[j], HIGH);
      delay(3000);
      digitalWriteFast(alleLayers[j], LOW);
    }
  }
}

//------------------------------------------------------------lampe
void lampe(int u, int v, int w, int x, int y, int z) {
  digitalWriteFast(latchPin, 0);
  shiftOut(u, v, w);
  shiftOut(u, v, w);
  shiftOut(u, v, w);
  shiftOut(u, v, w);
  shiftOut(u, v, w);
  shiftOut(u, v, w);
  shiftOut(u, v, w);
  shiftOut(u, v, w);
  digitalWriteFast(latchPin, 1);
  for (int j = 0; j < x; j++) {
    for (int i = 0; i < 8; i++) {
      digitalWriteFast(alleLayers[i], HIGH);
      delay(y);
      digitalWriteFast(alleLayers[i], LOW);
    }
  }
  delay(z);
}



//------------------------------------------------------------allOff
void allOff() {
  for (int i = 0; i < sizeof(alleLayers); i++) {
    digitalWriteFast(alleLayers[i], LOW);
  }
  digitalWriteFast(latchPin, 0);
  shiftOut(0, 0, 0);
  shiftOut(0, 0, 0);
  shiftOut(0, 0, 0);
  shiftOut(0, 0, 0);
  shiftOut(0, 0, 0);
  shiftOut(0, 0, 0);
  shiftOut(0, 0, 0);
  shiftOut(0, 0, 0);
  digitalWriteFast(latchPin, 1);
}

//------------------------------------------------------------shiftOut
void shiftOut(byte myDataOut1, byte myDataOut2, byte myDataOut3) {
  int i = 0;
  int pinState1;
  int pinState2;
  int pinState3;
  digitalWriteFast(clockPin, 0);

  for (i = 7; i >= 0; i--)  {
    digitalWriteFast(clockPin, 0);
    if ( myDataOut1 & (1 << i) ) {
      pinState1 = 1;
    }
    else {
      pinState1 = 0;
    }
    if ( myDataOut2 & (1 << i) ) {
      pinState2 = 1;
    }
    else {
      pinState2 = 0;
    }
    if ( myDataOut3 & (1 << i) ) {
      pinState3 = 1;
    }
    else {
      pinState3 = 0;
    }
    digitalWriteFast(data1, pinState1);
    digitalWriteFast(data2, pinState2);
    digitalWriteFast(data3, pinState3);
    digitalWriteFast(clockPin, 1);
  }
  digitalWriteFast(clockPin, 0);
}
#include <digitalWriteFast.h>

was macht das ?

Mit include binde ich die Bibliothek digitalWriteFast ein..
Die Bibliothek ist dafür, um die IOs schneller Umzustellen.
DigitalWriteFast ist um ein vielfaches schneller als digitalwrite, da dort direkt auf die register der ports zugegriffen wird.

Dafür müssen nur die entsprechenden Pins als Konstanten deklariert werden.

#define CLR(x,y) (x&=(~(1<<y)))
#define SET(x,y) (x|=(1<<y))
#define CHK(x,y) (x & (1<<y))
#define TOG(x,y) (x^=(1<<y))
#define makePin1(b) ( (b)<8 ? PORTD |=(1<<(b)) : PORTB |=(1<<(b-8)) )
#define makePin0(b) ( (b)<8 ? PORTD &=~(1<<(b)) : PORTB &=~(1<<(b-8)) )
#define readOutput(b) ((b)<13?((b)<8?(PORTD&(1<<(b))):(PORTB&(1<<(b-8)))):(PORTC&(1<<(b-13))))
#define readInput(b) ((b)<13?((b)<8?(PIND&(1<<(b))):(PINB&(1<<(b-8)))):(PINC&(1<<(b-13))))

hier, für dich, man mus nix deklarieren nur das.

Wo hast du das her?

Ich weiß auf jeden Fall, vor knapp 2, 5 Jahren habe ich das Programm zuletzt bearbeitet, mir dafür extra ne bib runter geladen und die musste man so deklarieren.
Andernfalls waren die Befehle (fast) unbekannt.

EDIT:

Und das wird mein Problem leider auch nicht lösen..
Das andere läuft ja?

je einfacher ist dein programm, desto leichter ist Fehler zu finden.
oder glaubst du alle haben die entsprechende lib um dein Code zu testen?

#define CLR(x,y) (x&=(~(1<<y)))
#define SET(x,y) (x|=(1<<y))
#define CHK(x,y) (x & (1<<y))
#define TOG(x,y) (x^=(1<<y))
#define makePin1(b) ( (b)<8 ? PORTD |=(1<<(b)) : PORTB |=(1<<(b-8)) )
#define makePin0(b) ( (b)<8 ? PORTD &=~(1<<(b)) : PORTB &=~(1<<(b-8)) )
#define readOutput(b) ((b)<13?((b)<8?(PORTD&(1<<(b))):(PORTB&(1<<(b-8)))):(PORTC&(1<<(b-13))))
#define readInput(b) ((b)<13?((b)<8?(PIND&(1<<(b))):(PINB&(1<<(b-8)))):(PINC&(1<<(b-13))))


//Arduino Pins
const byte allePins[] = {2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14};
const int data3 = 6;
const int data2 = 5;
const int data1 = 4;
const int clockPin = 3;
const int latchPin = 2;

const byte alleLayers[] = {7, 8, 9, 10, 11, 12, 13, 14};
const int layer1 = 7;
const int layer2 = 8;
const int layer3 = 9;
const int layer4 = 10;
const int layer5 = 11;
const int layer6 = 12;
const int layer7 = 13;
const int layer8 = 14;



//Struct für die Muster
typedef struct {
  const byte rot;
  const byte gruen;
  const byte blau;
} cube;


/*
  const cube Beispiel[8][8] = {
  //------Layer1----------------Layer2----------------Layer3----------------Layer4----------------Layer5----------------Layer6----------------Layer7----------------Layer8--------
  //---R-----G-----B---------R-----G-----B---------R-----G-----B---------R-----G-----B---------R-----G-----B---------R-----G-----B---------R-----G-----B---------R-----G-----B----
  {{0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}}, //Schieberegister 1
  {{0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}}, //Schieberegister 2
  {{0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}}, //Schieberegister 3
  {{0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}}, //Schieberegister 4
  {{0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}}, //Schieberegister 5
  {{0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}}, //Schieberegister 6
  {{0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}}, //Schieberegister 7
  {{0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}} //Schieberegister 8
  };
*/
const cube test_muster[8][8] = {
  {{0xFF, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0xFF, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0xFF}, {0x00, 0x00, 0x00}, {0xFF, 0xFF, 0xFF}, {0x00, 0x00, 0x00}},
  {{0xFF, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0xFF, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0xFF}, {0x00, 0x00, 0x00}, {0xFF, 0xFF, 0xFF}, {0x00, 0x00, 0x00}},
  {{0xFF, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0xFF, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0xFF}, {0x00, 0x00, 0x00}, {0xFF, 0xFF, 0xFF}, {0x00, 0x00, 0x00}},
  {{0xFF, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0xFF, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0xFF}, {0x00, 0x00, 0x00}, {0xFF, 0xFF, 0xFF}, {0x00, 0x00, 0x00}},
  {{0xFF, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0xFF, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0xFF}, {0x00, 0x00, 0x00}, {0xFF, 0xFF, 0xFF}, {0x00, 0x00, 0x00}},
  {{0xFF, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0xFF, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0xFF}, {0x00, 0x00, 0x00}, {0xFF, 0xFF, 0xFF}, {0x00, 0x00, 0x00}},
  {{0xFF, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0xFF, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0xFF}, {0x00, 0x00, 0x00}, {0xFF, 0xFF, 0xFF}, {0x00, 0x00, 0x00}},
  {{0xFF, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0xFF, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0xFF}, {0x00, 0x00, 0x00}, {0xFF, 0xFF, 0xFF}, {0x00, 0x00, 0x00}}
};

const cube layer8an[8][8] = {
  {{0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0xFF, 0x00}},
  {{0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0xFF, 0x00}},
  {{0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0xFF, 0x00}},
  {{0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0xFF, 0x00}},
  {{0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0xFF, 0x00}},
  {{0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0xFF, 0x00}},
  {{0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0xFF, 0x00}},
  {{0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0xFF, 0x00}}
};

void setup() {
  Serial.begin(115200);
  for (int i = 0; i < sizeof(allePins); i++) {
    pinMode(allePins[i], OUTPUT);
  }
  allOff();
  delay(1000);
}

void loop() {//---------------------------------------------------------Loop
  lampe(255, 255, 255, 300, 1, 1000);
  anzeigen(test_muster);
}

void anzeigen(cube data[8][8]) {//------------------------------------------------------------Muster anzeigen
  for (int k = 0; k < 1000; k++) {
    for (int j = 0; j < 8; j++) {

      makePin0(latchPin);
       ShiftOut(data[0][j].rot, data[0][j].gruen, data[0][j].blau);
       ShiftOut(data[1][j].rot, data[1][j].gruen, data[1][j].blau);
       ShiftOut(data[2][j].rot, data[2][j].gruen, data[2][j].blau);
       ShiftOut(data[3][j].rot, data[3][j].gruen, data[3][j].blau);
       ShiftOut(data[4][j].rot, data[4][j].gruen, data[4][j].blau);
       ShiftOut(data[5][j].rot, data[5][j].gruen, data[5][j].blau);
       ShiftOut(data[6][j].rot, data[6][j].gruen, data[6][j].blau);
       ShiftOut(data[7][j].rot, data[7][j].gruen, data[7][j].blau);
      makePin1(latchPin);
      delay(3000);

      makePin1(alleLayers[j]);
      delay(3000);
      makePin0(alleLayers[j]);
    }
  }
}

//------------------------------------------------------------lampe
void lampe(int u, int v, int w, int x, int y, int z) {
  makePin0(latchPin);
   ShiftOut(u, v, w);
   ShiftOut(u, v, w);
   ShiftOut(u, v, w);
   ShiftOut(u, v, w);
   ShiftOut(u, v, w);
   ShiftOut(u, v, w);
   ShiftOut(u, v, w);
   ShiftOut(u, v, w);
  makePin1(latchPin);
  for (int j = 0; j < x; j++) {
    for (int i = 0; i < 8; i++) {
      makePin1(alleLayers[i]);
      delay(y);
      makePin0(alleLayers[i]);
    }
  }
  delay(z);
}

//------------------------------------------------------------allOff
void allOff() {
  for (int i = 0; i < sizeof(alleLayers); i++) {
    makePin0(alleLayers[i]);
  }
  makePin0(latchPin);
   ShiftOut(0, 0, 0);
   ShiftOut(0, 0, 0);
   ShiftOut(0, 0, 0);
   ShiftOut(0, 0, 0);
   ShiftOut(0, 0, 0);
   ShiftOut(0, 0, 0);
   ShiftOut(0, 0, 0);
   ShiftOut(0, 0, 0);
  makePin1(latchPin);
}

//------------------------------------------------------------ ShiftOut // nicht verwechseln mit shiftOut()
void  ShiftOut(byte myDataOut1, byte myDataOut2, byte myDataOut3) {
  int i = 0;
  makePin0(clockPin);

  for (i = 7; i >= 0; i--) {
    makePin0(clockPin);
    if ( myDataOut1 & (1 << i) ) makePin1(data1);
    else makePin0(data1);

    if ( myDataOut2 & (1 << i) ) makePin1(data2);
    else makePin0(data2);

    if ( myDataOut3 & (1 << i) ) makePin1(data3);
    else makePin0(data3);

    makePin1(clockPin);
  }
  makePin0(clockPin);
}

Danke, ich wusste nicht, dass ich nur den kurzen Ausschnitt brauche. Ich habe die Bib nur überflogen und stand noch viel bezüglich verschiedener Boards drin.
Verstehe deinen Punkt aber :slight_smile:

Hast du vielleicht auch eine Idee, wo der Fehler liegen könnte?
Hänge da seit 3 Tagen dran, habe auch schon mit einem Kollegen Stunden experimentiert.
Ich habe gerade absolut keinen Ansatz mehr.

ist es ein fertiges PCB oder kann man Pins noch tauschen?
sind es also parallel drei Ketten vor 8 Registers ? ah, und das sind dann die drei Farben.

Ja genau, das sind 3 x 8 SR Ketten.
Leider schon alles auf PCBs, aber ggf kann ich daran basteln, habe noch 4 rumliegen.

Was würdest du versuchen zu tauschen?

nö, geht nicht mehr. es ist nur, man konnte alle Layer-Pin auf ein Register umbelegen, auf PORTB, es ist einziger der alle 8 seine pins auf Board present sind, denn zur Zeit ein ist auf PORTB, 6 auf PORTD und noch ein auf PORTC. wäre doch so schön mit einem einzelnen Kommando PORTB=0b10101001; alle Layer gleichzeitig einstellen

Achso ja, das habe ich auch überlegt, aber mit Absicht dagegen entschieden. Durch jedes IC kommen mehr mögliche Probleme auf.
Und wenn man beim Arduino schon so viele Pins hat, kann man davon auch ein paar nutzen.. Ich fand es einfach schöner, die direkt anzusteuern.
Zudem würde das auch noch mehr Takte 'fressen'
Im Gegensatz zu einem umstellen auf 'HIGH' müsste jedes bit einzeln ausgegeben werden mit umstehenden Befehle

Unabhängig davon wird das ja nicht helfen

verstehe nicht was haben IC's mit Pinbelegung an der Arduino. oder war es dir so bequemer PCB zu routen? na gut. die Paar überflüssigen Takten werden wahrscheinlich nix kaputt machen.

siehtst du das hier?

das könnte man so umschreiben, wenn Layers auf einem Port des Arduino wären:

      PORTB=0xFF;
      delay(y);
      PORTB=0x00;

:thinking:

/tmp/arduino_modified_sketch_385077/sketch_apr30a.ino: In function 'void setup()':
/tmp/arduino_modified_sketch_385077/sketch_apr30a.ino:81:21: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for (int i = 0; i < sizeof(allePins); i++)
                   ~~^~~~~~~~~
/tmp/arduino_modified_sketch_385077/sketch_apr30a.ino: In function 'void loop()':
/tmp/arduino_modified_sketch_385077/sketch_apr30a.ino:92:23: warning: invalid conversion from 'const cube (*)[8]' to 'cube (*)[8]' [-fpermissive]
   anzeigen(test_muster);
                       ^
/tmp/arduino_modified_sketch_385077/sketch_apr30a.ino:95:6: note:   initializing argument 1 of 'void anzeigen(cube (*)[8])'
 void anzeigen(cube data[8][8])  //------------------------------------------------------------Muster anzeigen
      ^~~~~~~~
/tmp/arduino_modified_sketch_385077/sketch_apr30a.ino: In function 'void allOff()':
/tmp/arduino_modified_sketch_385077/sketch_apr30a.ino:147:21: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for (int i = 0; i < sizeof(alleLayers); i++)
                   ~~^~~~~~~~~
Compiling libraries...
const byte alleLayers[] = {7, 8, 9, 10, 11, 12, 13, 14};
const int layer1 = 7;
const int layer2 = 8;
const int layer3 = 9;
const int layer4 = 10;
const int layer5 = 11;
const int layer6 = 12;
const int layer7 = 13;
const int layer8 = 14;

aufgezählte Variablen und dann nicht mal genutzt. ...
Da ist noch Spielraum. :slight_smile:

Ahh ich bitte um Verzeihung. Ich habe deinen Text falsch verstanden.
Klar, dass würde mehr Sinn machen, die auf ein Register zu legen, was aber für diese Ansteuerung nichts bringen würde

Ähh, ne eben nicht. In deinem Fall werden alle 8 Pins des PortB auf 0 oder 1 gesetzt.
In einem Fall wird immer nur ein Layer eingeschaltet für Zeit y und wieder aus. Erst dann der nächste Layer.
In meinem Fall wird immer nur 1 Layer angesteuert.
Wenn ich das gleiche mit dem Port realisieren würde, wie in deinem Fall, bräuchte ich diese drei Befehle 8 mal hintereinander für jeden Layer

Meinst du, dass ich bei "alleLayers" die Pins anstatt der Bezeichnung für den Pin genommen habe?

Diese Warnungen wurden mir nicht angezeigt, bzw ich habe sie Übersehen..
Aber warum genau meckert der da?
Weil ich eine Konstante in eine nicht Konstante übergebe oder wie soll ich das genau verstehen?

DATEI - VOREINSTELLUNGEN
grafik

Ne, kann man machen. Aber Layer1 etc. ist
a) eine numerische Aufzählung ohne Bezug
b) ungenutzt
c) Da Du mit 1 anfängst zu zählen machst Du das für zukünftige Lernerfolge unnötig schwer! Elemente beginnen bei 0.

Weil Du u.a. signed und unsigned mixt. Es kann passen, aber muss nicht. (Ja, hier passt es, aber jede Warnung hat ihren Sinn und diese kann vermieden werden)

Jupp.

Im Übrigen habe ich noch nicht verstanden, warum ihr das numerische in

      ShiftOut(data[0][j].rot, data[0][j].gruen, data[0][j].blau);
[...]

nicht auch mit einer Schleife abhandelt...
Ich bin noch nicht ganz schlau geworden, da ich nur mit einem Auge drauf sehe - Ich wollt den aber mal mitnehmen um evtl. zu schauen, wo das Leuchten des benachbarten Layers her kommt.... Dazu kompiliere ich mir das erstmal um zu sehen, das der soweit warnungsfrei ist :wink:

Hmm, das hatte ich eigentlich schonmal eingeschaltet, da mir vor einigen Jahren das mal jemand gesagt hat
Seitdem kam ich aber nicht mehr zu solchen Problemen :sweat_smile:
Prüfe ich später mal.

Mittlerweile mache ich das auch so.
Wie vorhin schonmal erwähnt, ist der Code über 2 Jahre alt und mich hat das persönlich jetzt nicht gestört. Wahrscheinlich eben weil die ungenutzt sind.

Meinste Bei dem 'Array' den einen festen Wert und den einen als variable der Schleife?
Wenn ich das in noch eine Schleife packe und die nochmal von 0-7 zählen lasse, wird der Code schon langsam, dass man ein flicken wahrnimmt.

???

    for (int j = 0; j < 8; j++)
    {
      makePin0(latchPin);
      for (byte b = 0; b < 8; b++)
      {
        ShiftOut(data[b][j].rot, data[b][j].gruen, data[b][j].blau);
      }
      makePin1(latchPin);
      delay(3000);
      makePin1(alleLayers[j]);
      delay(3000);
      makePin0(alleLayers[j]);
    }

Das ich das delay() da auflösen würde hab ich schon gesagt?

ja, stimmt, es war kein Equivalent.

mein Vorschlag/Rat: einen neuen Sketch schreiben, erstmal für Effekte an einer Schicht, mal schauen ob andere Schicht dadurch beeinflusst wird.