-
        

Seite 1 von 6 123 ... LetzteLetzte
Ergebnis 1 bis 10 von 59

Thema: Hilfestellung bei drei Schieberegistern und 20 LED´s

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    26.04.2011
    Ort
    Heilbronn
    Alter
    28
    Beiträge
    180

    Hilfestellung bei drei Schieberegistern und 20 LED´s

    Anzeige

    könnte mir jemand unter die Arme greifen beim Verstehen helfen??

    Ich habe 20 LED´s an drei Schieberegister Angeschlossen (74HC595) .....

    Ziel ist es das alle LED nach ein nach einander angehen und bei der 20ten LED angekommen gehen alle wieder aus!

    Ich komm aber mit der Bit Geschichte nicht klar, das will nicht in mein Kopf rein -.-

    Ich denke ich hab verstanden das ich zuerst das dritte Schieberegister ansprechen muss, das es die letzte LED anmacht
    weil ja immer durchgereicht wird ....

    Dann bekomm ich auch noch nicht hin bzw, versteh ich´s nicht ganz, das bei mir alle drei Schieberegister das gleiche machen!

    Kann mir da jemand Licht ins Dunkle bringen ?

    Mfg Benny

  2. #2
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    13.01.2014
    Beiträge
    398
    Blog-Einträge
    3
    Hast du den Output des ersten Schieberegisters mit dem Input(Data) des zweiten verbunden und den Output des zweiten mit Input des dritten?

    Hier ein ausführliches Tutorial (engl., ab Kapitel 4).
    Geändert von Sisor (23.03.2014 um 17:44 Uhr)

  3. #3
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    Die Daten für die LEDs werden nacheinander gesandt. In der Regel schreibt man die Daten für alle LEDs und übernimmt dann gleichzeitig die Daten aus den Schieberegistern zu den Ausgängen: Zuerst kommen die Daten für das Letzte der Schieberegister in der Reihe. Die Reihenfolge im Byte übernimmt in der Regel die SPI- (ggf. auch USART) Hardware im µC.
    Das zusammensetzen der Daten muss man vorab im Programm machen, etwa mit D = (D << 1) +1 für das anschalten. D sollte dabei wenigstens 20 Bit Breit sein, also etwa long. Zu senden sind dann erst das 3. Höchste Byte, dann das 2. und zuletzt das low Byte.


    Für den Fall das die LEDs nacheinander an / Ausgehen sollte, könnte man ausnahmsweise auch das Schiebend er Daten sofort sichtbar machen. Also erst 20 mal eine 1 rein schieben und dann gleich Übernehmen. Damit gehen die LEDs nacheinander an. Danach das ganze mit einer 0 wiederholen.

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    26.04.2011
    Ort
    Heilbronn
    Alter
    28
    Beiträge
    180
    ja sisor hab es richtig verbunden denke ich, habe es nach diesem Schaltbild ausgebaut:

    Klicke auf die Grafik für eine größere Ansicht

Name:	breadboard.jpg
Hits:	27
Größe:	55,8 KB
ID:	27830

    das is mein code dazu, habe ihn schon von zwei auf drei Schieberegister geändert:

    hier der code:

    Code:
    //Pin connected to ST_CP of 74HC595
    int latchPin = 4;
    //Pin connected to SH_CP of 74HC595
    int clockPin = 3;
    ////Pin connected to DS of 74HC595
    int dataPin = 2;
    
    
    
    void setup()
    {
      //set pins to output because they are addressed in the main loop
      pinMode(latchPin, OUTPUT);
      pinMode(clockPin, OUTPUT);
      pinMode(dataPin, OUTPUT);
    }
    
    
    void loop()
    {
      int data1 = 256;
      int data2 = 1;
      int data3 = 2;
      for(int i=0; i<8; i++)
      {
        digitalWrite(latchPin, LOW);
        shiftOut(dataPin, clockPin, MSBFIRST, data1 >>8);
        shiftOut(dataPin, clockPin, MSBFIRST, data2 & 255);
        shiftOut(dataPin, clockPin, MSBFIRST, data3 & 255);
        digitalWrite(latchPin, HIGH);
        data1*=2;
        data2*=2;
        data3*=2;
        delay(1000);
    
      }
    }
    wie gesagt vom Code her das die LED einzeln nacheinander angehen erstmal ned schlimm, erstmal verstehen das alle nacheinander angehen.

    @ besserwessi,

    ja das hab ich verstanden das ich zuerst das letze ansprechen muss und dann das vorletzte und dann das erste,
    aber wie ich das umsetze O.o

    hier noch ein Bild wie es im echten aussieht:

    Klicke auf die Grafik für eine größere Ansicht

Name:	IMG_8200.jpg
Hits:	13
Größe:	78,3 KB
ID:	27831

  5. #5
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    13.01.2014
    Beiträge
    398
    Blog-Einträge
    3
    Ich hab noch nicht mit mehreren Schieberegistern gearbeitet, daher ist der folgende Code ohne Gewähr.
    So hab ich das verstanden:
    Code:
    long data = 0; // alle Bits aus -> alle LEDs aus
    
    void loop()
    {
        digitalWrite(latchPin, LOW);
        shiftOut(dataPin, clockPin, MSBFIRST, data >>16);
        shiftOut(dataPin, clockPin, MSBFIRST, data >>8);
        shiftOut(dataPin, clockPin, MSBFIRST, data);
        digitalWrite(latchPin, HIGH);
    
        data = (data<<1)+1;
        if (data > 1048576)  data = 0;   // 1048576 = 2^20
    
        delay(1000);
    }

  6. #6
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    26.04.2011
    Ort
    Heilbronn
    Alter
    28
    Beiträge
    180
    okay...... also funktunieren tust genau so wie ich es mir vorgestellt habe!
    jetzt muss ich nur noch mit while(1); das ganze begrenzen auf einmal

    so funktioniert es doch wenn man was nur ein mal ausführen möchte oder ?
    oder kann man es auch in die Setup Funktion schreiben? wie macht man es richtig wenn man
    was nur einmal ausführen will?

    das ich es aber auch verstehe frage ich nochmal, möchte es ja auch verstehen

    data = (data<<1)+1;
    if (data > 1048576) data = 0; // 1048576 = 2^20

    diesen teil verstehe ich nicht, bzw is mir nicht so klar .... wo kann man sowas nachlesen
    oder dieses Wissen herbekommen ... echt klasse =)

    und du hast in der shiftOut Methode noch >>16 >>8 geändert und dann nur data
    damit sprichst du erst den dritten, dann den zweiten und zu letzt das erste Schieberegister an richtig ?

  7. #7
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    13.01.2014
    Beiträge
    398
    Blog-Einträge
    3
    Die Funktion hier kannst du im setup mit ledLine(); aufrufen.
    Code:
    void ledLine()
    {
      long data = 0;  // alle Bits aus -> alle LEDs aus
      while (data <= 1048576)
      {
        digitalWrite(latchPin, LOW);
        shiftOut(dataPin, clockPin, MSBFIRST, data >>16);
        shiftOut(dataPin, clockPin, MSBFIRST, data >>8);
        shiftOut(dataPin, clockPin, MSBFIRST, data);
        digitalWrite(latchPin, HIGH);
    
        data = (data<<1)+1;
        delay(1000);
      }
    }
    Jedes Bit im long data repräsentiert letztendlich eine LED. Das kleinste Bit wird durch die Zahl 1 dargestellt, das nächstgrößere durch 2, dann 4,8,16... D.h. man kann auch sagen 2^n = repräsentierende Zahl. Bsp: 2^4 = 16, also repräsentiert 16 die 4.LED. Insgesamt gibt's 20 LEDs, also ist nach 2^20 = 1048576 Schluss.

    und du hast in der shiftOut Methode noch >>16 >>8 geändert und dann nur data
    damit sprichst du erst den dritten, dann den zweiten und zu letzt das erste Schieberegister an richtig ?
    Ja, richtig.
    diesen teil verstehe ich nicht, bzw is mir nicht so klar .... wo kann man sowas nachlesen
    oder dieses Wissen herbekommen ... echt klasse =)
    Im Zweifelsfall Elektrotechnik studieren, so wie ich.
    Geändert von Sisor (23.03.2014 um 19:03 Uhr)

  8. #8
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    26.04.2011
    Ort
    Heilbronn
    Alter
    28
    Beiträge
    180
    also man muss void loop() durch void ledLine() ersetzen, nur mit while(1); geht es nicht ?

    okay dann muss ich mir das bei Wiki oder so mit den bit und Byte nochmal genau anschauen und durchlesen.

    Ah ja Elektrotechnik studiert, daher weht der Wind, ich als Konstrukteur beherrsche nur die Technische Seite
    Könnte man erahnen wenn mein mein Roboter genauer anschaut, wie schon erwähnt, muss mal ne ruhige Minute
    finden und ein ausführlichen Bericht schreiben, bzw hier im Forum vorstellen.

    Aber so langsam wird's

    Die 20 LED´s dienen dazu mir ein Ladebalken zu erstellen, wenn ich die Fernsteuerung meines Roboter RSL-7 einschalte,
    bis alle Systeme gebootet und hochgefahren sind, anzeigt.

    Habe mir folgendes bei Reichelt bestellt:

    Klicke auf die Grafik für eine größere Ansicht

Name:	RBG2000.jpg
Hits:	3
Größe:	23,5 KB
ID:	27832

    Das ihr auch wisst für was die 20 LED gut sind

    Wenn dann die Arduinos und die Funkmodule da sind und der LED Ladebalken auch .... gehts mächtig ans löten und basteln

  9. #9
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    13.01.2014
    Beiträge
    398
    Blog-Einträge
    3
    Hübsches Projekt, ich hoffe du hältst das Forum auf dem Laufenden!
    Nur zum Verständnis: while(1) ist eine Endlosschleife. Übersetzt: Solange die Bedingung in den Klammern nicht 0 ist tue{...}. Und bevor 1 = 0 ist friert die Hölle ein.

  10. #10
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    26.04.2011
    Ort
    Heilbronn
    Alter
    28
    Beiträge
    180
    ja ich werde noch einen ausführlichen Bericht machen das is versprochen, hab ja auch noch jede Menge vor mit meinem Roboter ....
    Zur Zeit bin ich an einem 5-Achs Roboter Arm dran, aber ich will nichts verraten

    Eine Frage noch zu dem Code? .... habe jetzt dein void ledLine89 eingefügt und jetzt lässt es sich nicht mehr Kompilieren O.o

    Code:
    int latchPin = 4;
    int clockPin = 3;
    int dataPin = 2;
    
    
    
    void setup()
    {
      pinMode(latchPin, OUTPUT);
      pinMode(clockPin, OUTPUT);
      pinMode(dataPin, OUTPUT);
    }
    
    
    void ledLine()
    {
      long data = 0;  // alle Bits aus -> alle LEDs aus
      while (data <= 1048576)
      {
        digitalWrite(latchPin, LOW);
        shiftOut(dataPin, clockPin, MSBFIRST, data >>16);
        shiftOut(dataPin, clockPin, MSBFIRST, data >>8);
        shiftOut(dataPin, clockPin, MSBFIRST, data);
        digitalWrite(latchPin, HIGH);
    
        data = (data<<1)+1;
        delay(1000);
      }
    }

Seite 1 von 6 123 ... LetzteLetzte

Ähnliche Themen

  1. 15 Low Current LED´s als Lauflicht mit drei Taster mit ATMEGA8 und Bascom
    Von stekolos im Forum Eigene fertige Schaltungen und Bauanleitungen
    Antworten: 7
    Letzter Beitrag: 28.04.2017, 20:59
  2. Drei Led´s mit einem Taster unabhängig von einander schalten
    Von p@ty im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 61
    Letzter Beitrag: 10.07.2014, 13:03
  3. Gegenseitige Störung bei Schieberegistern
    Von Ofenrohr im Forum C - Programmierung (GCC u.a.)
    Antworten: 3
    Letzter Beitrag: 27.04.2010, 21:15
  4. ATmega32 Hilfestellung bei Programm gesucht
    Von m0b0t1x im Forum C - Programmierung (GCC u.a.)
    Antworten: 1
    Letzter Beitrag: 19.09.2009, 09:31
  5. Brache Hilfestellung bei Programmierung mit C-Control/ASM
    Von angelhaken im Forum Controller- und Roboterboards von Conrad.de
    Antworten: 4
    Letzter Beitrag: 10.02.2005, 00:31

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •