Hilfe beim Shiftout (Anfängerfrage)

hallo zusammen...

ich hab meinen arduino jetzt seit 4 tagen und ich komm eingentlich ganz gut klar damit..hab schon einige lauflichter und eine 4x5 led matrix zusammen gebastelt :)aber jetzt gehen mir die pins aus lol deswegen hab ich mir gestern n paar 595er gekauft um ne grössere matrix zum bauen..

da ich mal fast gar keine ahnung vom prog. hab..mach ich mir des ganze immer etwas umständlich glaub ich..beispiel :

int led1 = 1; // LED connected to digital pin 1 int led2 = 2; // LED connected to digital pin 2 usw usw void setup() { // initialize the digital pin as an output: pinMode(led1, OUTPUT); pinMode(led2, OUTPUT); usw usw void loop() { digitalWrite(led1, HIGH); // set the LED on delay(500); // wait for a second digitalWrite(led1, LOW); // set the LED on delay(500); // wait for a second digitalWrite(led2, HIGH); // set the LED on } usw usw

ich weiss das man des ganze irgendwie "zusammenfassen" kann aber für mich als anfänger find ich des schon ganz okay..dauert zwar länger aber ich komm besser damit klar.. ::)

kann ich diese codes auch für die 595er nehmen?? ich hab mir auch schon dieses tut durchgelesen http://www.arduino.cc/en/Tutorial/ShiftOut aber irgendwie steig ich da nich durch :-[ :-[

wär nett wenn mir jmd von euch des erklären würde

gerne auch auf "meine" "umständliche" weise ::) ::)

Also, ich sehe in deinem code keinen zusammenhang mit dem 595.

Nen Schieberegister will NACHEINANDER einsen und nullen. Damit der merkt, wann das nächste dings (also eins oder null) kommt, will das über den takt (clock, CLK,...) nen kurzen high->low wechsel. also: du schickst:

Seriell iN: 0 1 0 1 0 1 0 1 Und nach jedem einzelnen davon auf clock "10". Dann haste auf den ausgängen des SR 01010101.

So funktioniert son schieberegister prinzipiell Damit das durchgeschobene nicht "sofort" sondern erst nach allen 8 einsen/nullen erscheint, gibt's noch die "latch". (sonst hättste Störungen. Bei ner LED egal. aber ne pumpe muss nich dein Wohnzimmer fluten, nur weil die Tröte tröten soll...) vielleicht wird dein text im link so durchsichtiger.......

shiftout automatisiert davon einiges. musste nochmal nachlesen wie genau....

Die shiftOut()-Funktion nimmt dir einfach genau den Teil ab den Pumbaa beschrieben hat. Sie schiebt einen ganzen Byte (also 8 Bits) über einen Data- und einen Clock-Pin in ein Schieberegister aus.
Die Syntax: shiftOut(dataPin, clockPin, bitOrder, value)
dataPin = der Pin, aus dem die Bits “herausgeschoben” werden. Dieser Pin muss mit dem seriellen Eingang des Schieberegisters verbunden sein.
clockPin = der Pin, an dem das Clocksignal fürs Schieberegister ausgegeben wird. Also mit dem Clock-Eingan des Schieberegisters verbinden.
bitOrder = bestimmt, welches Bit des Bytes zuerst herausgeschoben wird (MSB = most significant bit = Bit 7 = Bit ganz “links” im Byte; LSB = least significant bit = Bit 0 = Bit ganz “rechts” im Byte)
value = das Byte, das rausgeshiftet werden soll (kann natürlich auch eine Variable sein)

ein einfacher beispiel code wäre vielleicht auch noch ganz hilfreich.. besten dank im vorraus..

Im oben genannten Link (hier noch einmal)

stehen unter “The Code” und ganz unten Beispiele.

Gruß,
Roland

Die Beispiele aus dem Tutorial habe ich alle schon ausprobiert.Alles Top. Mein Problem ist das ich den Code nicht verstehe...Ich hab nun diesen etwas "umständlichen" Code bekommen :

int SER = 12; //SER am Schieberegister int SCK = 13; //SCK am Schieberegister int RCK = 11; //RCK am Schieberegister

/* Ausgangspins des SR(Schieberegister) wie gewünscht anschließen SCL auf +5V; G auf Masse/Ground */

void setup() { pinMode(SER, OUTPUT); pinMode(SCK, OUTPUT); pinMode(RCK, OUTPUT); }

void loop() { //Schieberegister mit 0110 1010 laden, von vorne nach hinten: digitalWrite(SER, LOW); nextClock(); digitalWrite(SER, HIGH); nextClock(); nextClock(); //Da '1' zweimal aufeinander digitalWrite(SER, LOW); nextClock(); digitalWrite(SER, HIGH); nextClock(); digitalWrite(SER, LOW); nextClock(); digitalWrite(SER, HIGH); nextClock(), digitalWrite(SER, LOW); nextClock(); digitalWrite(SCK, HIGH); delayMicroseconds(5); // kann evtl. Weggelassen oder verkleinert werden digitalWrite(SCK, LOW); }

void nextClock() { digitalWrite(SCK, HIGH); delayMicroseconds(5); // kann evtl. Weggelassen oder verkleinert werden digitalWrite(SCK, LOW); }

Wenn ich den einfüge und hochlade tut sich aber gar nichts. Ich hoffe ihr könnt mir weiterhelfen.

Ich kapier immer noch nicht ganz, was genau Du mittlerweile funktionierend hast (Hardware und Software) und was genau Du haben willst...?

Hast Du Dir den Source angeguckt?

Den Hauptteil der Arbeit kannst du dir sparen. Alles bis auf das toggeln des Latch-Pins übernimmt die shiftOut()-Funktion für dich. Also diesen Teil:

void loop()
{
   //Schieberegister mit 0110 1010 laden, von vorne nach hinten:
     digitalWrite(SER, LOW);
     nextClock();
     digitalWrite(SER, HIGH);
     nextClock();
     nextClock();            //Da '1' zweimal aufeinander
     digitalWrite(SER, LOW);
     nextClock();
     digitalWrite(SER, HIGH);
     nextClock();
     digitalWrite(SER, LOW);
     nextClock();
     digitalWrite(SER, HIGH);
     nextClock(),
     digitalWrite(SER, LOW);
     nextClock();

kannst du im Prinzip streichen. Stattdessen würdest du einfach schreiben:
shiftOut(SER, SCK, MSBFIRST, 0110101);
Ich glaube man muss B0110101 schreiben, um dem Compiler zu verklickern dass es sich um eine Binärzahl handelt (keine Garantie darauf), aber 0110101 binär ist natürlich das gleiche wie 53 dezimal, also könntest du auch schreiben:
shiftOut(SER, SCK, MSBFIRST, 53);
Die shiftOut()-Funktion übernimmt das Umschalten des Clock-Pins und des Data-Pins von alleine.

Danach sind also alle Bits im Schieberegister und du musst nur noch per
digitalWrite(RCK, LOW); // vor den shiftOut()-Code setzen
und
digitalWrite(RCK, HIGH); // danach setzen
die Latch toggeln (wenn RCK dein Latch-Pin ist).

Wenn es dann immer noch nicht funktioniert, solltest du nochmal deine Verbindungen auf Richtigkeit überprüfen. Da gebe ich Joghurt recht dass ein bisschen wenig Informationen bezüglich deiner Schaltung existieren :wink:

Otacon2k

P.S.: Sehr leserlich, danke :wink: