INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
? ShiftOut-Befehl richitg nutzen ?
26.03.2015, 13:12 (Dieser Beitrag wurde zuletzt bearbeitet: 26.03.2015 13:15 von Samweis.)
Beitrag #1
? ShiftOut-Befehl richitg nutzen ?
Hi,
ich baue mir meine Modellbahn Steuerung grade auf Arduino um und muss unter Anderem 22 LEDs im Stellpult und noch Weichenatriebe ansteuern. Ich nutze für all das einen Arduino Uno. Um die ganzen Ausgänge zu bedienen habe ich mir eine Platine mit 5x 74HC595 gelötet, also insgesamt 40 Ausgänge.
Bis jetzt habe ich zum ausgeben der Daten so ein Programm geschrieben (ist nur ein Beispiel):

Code:
int Sck = 4;      //Shift Register Clock
  int RCK = 7;     //Storage Register Clock
  int WertReg=8;    //Data Input
  int Pause=100;     //Pause zwischen  den einzelnen Befehlen


  digitalWrite(RCK,0);
  digitalWrite(Sck,0);
  //1. LEDs für Weichen einschieben (20 LEDs)
  digitalWrite(WertReg,Wert1);      //1.
  delay(Pause);
  digitalWrite(Sck,1);
  delay(Pause);
  digitalWrite(Sck,0);
  delay(Pause);

  digitalWrite(WertReg,Wert2);      //2.
  delay(Pause);  
  digitalWrite(Sck,1);
  delay(Pause);
  digitalWrite(Sck,0);
  delay(Pause);

  digitalWrite(WertReg,Wert3);      //3.
  delay(Pause);  
  digitalWrite(Sck,1);
  delay(Pause);
  digitalWrite(Sck,0);
  delay(Pause);

Jetzt habe ich den deutlich kürzeren ShiftOut Befehl gefunden. In dem dazugehörigen text von Arduino ( http://www.arduino.cc/en/Tutorial/ShiftOut ) findet man ganz unten die Erklärung für die Reihenfolge der Informationen ind er Klammer hinter ShiftOut. Woanders habe ich gesehen, wie unter data zB "01101001" eingegeben wurde. Kann ich da denn auch einfach Varaiblen eingeben, die 1 oder 0 als Wert haben? Wie oihr vllt gesehen habt, wechseln die bei mir immer, je nach dem, wie die Weiche gestellt ist. Ich habe auch das Gefühl, das in dem Text davor erklärt wird wie man das macht, aber mein 9.Klasse englisch reicht dafür noch nicht aus Smile.
Danke, Samweis

Edit: hatte einen alten Code eingefügt
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
26.03.2015, 13:25
Beitrag #2
RE: ? ShiftOut-Befehl richitg nutzen ?
Hi,
Du rufst das shiftOut immer mit einem kompletten Byte auf. Ausserdem musst Du immer so viele Bytes rausschieben, wie Du Schieberegister hast. Dann erst einen Impuls auf den Latch Pin (bei Dir glaube ich RCK) geben. D.h. wenn Du 5 74HC595 hintereinander hängen hast, dann musst Du im Prinzip immer 5 Byte rausschieben, auch wenn Du nur ein Bit ändern willst. (Ok, genau genommen wäre es z.B. nur zwei Byte, wenn Du im zweiten 74HC595 was ändern willst.)
Am besten, Du schreibst Dir eine kleine Funktion, die wie digitalWrite funktioniert, und Dir einzelne Bits setzt. Ich habe sowas vor Kurzem mal für ein 74HC595 gemacht:http://www.arduinoforum.de/arduino-Threa...1#pid12911. Das müsste man recht einfach auf eine beliebige Anzahl erweitern können.
Gruß,
Thorsten

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
28.03.2015, 11:14
Beitrag #3
RE: ? ShiftOut-Befehl richitg nutzen ?
Hi Thorsten,
danke für die schnelle ANtwort. Wenn ich dein Programm richtig verstehe, dann ist es ja so aufgebaut, dass due es via srDigitalWrite überall im Sketch nutzen kannst, oder? Kannst du mir vllt erklären, was du von Zeile 2 bis Zeile 5 machst? das ist mir nicht wirklich klar.
Mein Gedanke wäre gewesen, für jeden einzuschaltenen Pin seinen Dezimalwert zu einer Variable zu addieren und diese Variable dann in den ShiftOut Befehl zu geben und ausgeben zu lassen. (z.B. pin 5 am Register soll an sein, also wird zur Variable x 2^4 hinzu addiert und da nichts anderes addiert wird, wird dann 16 als Data in ShiftOut eingesetzt und ausgegeben.) Oder nutzt du eine andere Variante.
Danke, Samweis
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
29.03.2015, 12:45
Beitrag #4
RE: ? ShiftOut-Befehl richitg nutzen ?
Hi,
Zitat:Wenn ich dein Programm richtig verstehe, dann ist es ja so aufgebaut, dass due es via srDigitalWrite überall im Sketch nutzen kannst, oder?
Ja, das ist die Idee von Funktionen.
Keine Ahnung, was Du mit Zeile 2 bis 5 meinst. Hier ist eine Version mit ein paar mehr Kommentaren:
Code:
void srDigitalWrite(int pin, int state) {
   // nur auf sinnvolle Pin-Nummern zwischen 0 und 7 reagieren  
   if(pin < 0 || pin > 7) return;
   // Das zum Pin gehoerende Bit setzen oder zurücksetzen
   bitWrite(srState,pin,state);    
   // Latch-Pin auf LOW setzen
   digitalWrite(latchPin, LOW);
   // Daten rausschieben
   shiftOut(dataPin, clockPin, MSBFIRST, srState);  
   // ...und Latch setzen zum übernehmen.
   digitalWrite(latchPin, HIGH);
};

Zitat:Mein Gedanke wäre gewesen, für jeden einzuschaltenen Pin seinen Dezimalwert zu einer Variable zu addieren und diese Variable dann in den ShiftOut Befehl zu geben und ausgeben zu lassen. (z.B. pin 5 am Register soll an sein, also wird zur Variable x 2^4 hinzu addiert und da nichts anderes addiert wird, wird dann 16 als Data in ShiftOut eingesetzt und ausgegeben.)
So funktioniert das nicht, da ja dann alle anderen Bits auf 0 sind. D.h. Du würdest Pin 5 einschalten, aber alle anderen aus. Du willst ja aber den Zustand der anderen erhalten.
Man addiert da auch nicht, sondern ver-oder-t. Das macht aber bitWrite für einen.

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  mehere Analoge Eingänge nutzen clemens89 17 1.082 16.03.2016 20:40
Letzter Beitrag: hotsystems
  Constrain-Befehl -wie gehts richtig? Nimes 8 939 14.03.2016 18:00
Letzter Beitrag: DL1AKP
Star Infrarot variabel nutzen ??? Mourti 7 410 18.02.2016 18:13
Letzter Beitrag: Mourti
  Frage zu Befehl in UTFT-Lib: Screen 180° drehen? ? HaWe 8 1.772 12.09.2015 13:56
Letzter Beitrag: HaWe
  Taster für zwei Funktionen nutzen - wie macht man das? Gelegenheitsbastler 2 947 22.07.2015 11:56
Letzter Beitrag: Scherheinz
  Referenz eines Arrays in Klasse nutzen jensel 5 875 23.02.2015 11:46
Letzter Beitrag: Thorsten Pferdekämper
  Wird der "print"-Befehl auch ohne Zugriff über Konsole abgearbeitet? itsy 8 1.367 18.06.2014 17:28
Letzter Beitrag: rkuehle
  Stop Befehl während einer Void - Loop lezz89 13 12.730 17.01.2014 19:40
Letzter Beitrag: demokrit

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste