3 Schieberegister und immer noch keine Lösung

Hi, ich bin nun langsam am verzweifeln. Ich finde einfach keine Lösung für mein Problem.
Mit 2 Schieberegistern komme ich noch so einigermaßen klar aber bei 3 hört es schon auf. Also die Pins werden in einem Array gespeichert( zb.: 0000 0000 0000 0000 0000 0000) es gibt ca. 8 Möglichkeiten. Der Code funktioniert mit 2 Registern ohne Probleme. Nur beim shiftOut für 3 Register stehe ich auf dem Schlauch. >>8 ist 8bit ein Register; &255 sind die 2. 8bit für 2 Register;
& 16777216 ???? wäre das 3. Regsiter? Das ganze in 3 Variablen schreiben und dann einzeln schicken, möchte ich erst mal nicht. Später vielleicht. Hier nun der Code , bei dem ich nicht weiter komme.
Testen kann ich es nicht, weil die jetztige Schaltung nur 2 Register hat.

void sendeLampen(int wert)
	{ 
		digitalWrite(speicher_Pin, LOW);								// Ansteuerung der 2 Schieberegister
		shiftOut(daten_Pin, takt_Pin, LSBFIRST, LampenPin[wert] >> 8);
		shiftOut(daten_Pin, takt_Pin, LSBFIRST, LampenPin[wert] & 255);
	    shiftOut(daten_Pin, takt_Pin, LSBFIRST, LampenPin[wert] & 16777216);  //welchen wert muss hier hin bei 3 und mehr Registern
		digitalWrite(speicher_Pin, HIGH);
		
	}

MfG Marco

Deklariere mal int als long

Hallo Marco,

ich kann Dir bei Deinem Problem leider nicht direkt helfen, aber vielleicht hilft Dir meine Information dennoch weiter. Ich hatte zunächst einen Arduino Uno gekauft und kam schnell zu dem Punkt an dem mir die Ein- und Ausgänge nicht mehr gereicht haben. Hatte dann auch überlegt mit Multiplexern das Ganze zu erweitern. Die einfachere Lösung bestand letztlich darin einen Mega zu kaufen und den Uno zum Testen von Sketchen und Bauteilen zu verwenden.

Hat mich auch Überwindung gekostet, denn ca. 45,- Euro noch einmal auszugeben ist auch ein Brocken. Man spart sich aber zusätzliche Bauteile und eben umständliche Programmierung.

Weiß nicht sicher, ob das sich bei Dir auch so verhält. Nur so meine Gedanken dazu.

Gruß
Peter

Mach halt sowas:

long shift = LampenPin[wert];

for(int i = 0; i < 3; i++)
{
   digitalWrite(speicher_Pin, LOW);
   shiftOut(daten_Pin, takt_Pin, LSBFIRST, shift);
   shift >>= 8;
   digitalWrite(speicher_Pin, HIGH);
}

Das schiebt den Wert nach rechts und speichert in wieder ab.

Und wie gesagt dran denken, dass du für 3 Bytes in einer Variable einen long brauchst. Eine gute Alternative wäre ein zwei-dimensionales Array aus byte. Dann musst du nichts schieben.

Außerdem musst du beachten, dass Integer Literale standardmäßig int sind. Wenn du also den Wertebereich eines int überschreitest, musst du das angeben:

16777216L

oder

(unsigned long)16777216

@: Serenifly
Habe ich das richtig verstanden, das ich 3x shiften muss und die bytes in shift speichere? Bei jedem durch lauf wird es um 8 stellen verschoben? Wenn ich weitere Register brauche, muss ich nur die Schleife mehrmals durch laufen? ( > 3 ?)
Ich habe es jetzt zum testen auf das Board geladen und es funktioniert ( mit 2 Registern).
Danke :smiley:

MfG Marco

Ja. Du bekommst halt bei >4 ein Problem, da du maximal 4 Bytes in einen unsigned long bekommst.

Besser wäre wie gesagt ein 2-dimensionales Array aus Bytes. Dann bist zu flexibler was die Anzahl der Bytes betrifft. Und du musst auch nichts schieben, sondern kannst einfach mit array[wert][index] das passende Byte auswählen.