- Labornetzteil AliExpress         
Ergebnis 1 bis 10 von 59

Thema: Hilfestellung bei drei Schieberegistern und 20 LED´s

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    26.04.2011
    Ort
    Heilbronn
    Alter
    35
    Beiträge
    180

    Hilfestellung bei drei Schieberegistern und 20 LED´s

    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 Roboter-Spezialist
    Registriert seit
    13.01.2014
    Beiträge
    454
    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 16: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
    35
    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:	30
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:	14
Größe:	78,3 KB
ID:	27831

  5. #5
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    13.01.2014
    Beiträge
    454
    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
    35
    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 Roboter-Spezialist
    Registriert seit
    13.01.2014
    Beiträge
    454
    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 18:03 Uhr)

Ä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, 19: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, 12:03
  3. Gegenseitige Störung bei Schieberegistern
    Von Ofenrohr im Forum C - Programmierung (GCC u.a.)
    Antworten: 3
    Letzter Beitrag: 27.04.2010, 20:15
  4. ATmega32 Hilfestellung bei Programm gesucht
    Von m0b0t1x im Forum C - Programmierung (GCC u.a.)
    Antworten: 1
    Letzter Beitrag: 19.09.2009, 08:31
  5. Brache Hilfestellung bei Programmierung mit C-Control/ASM
    Von angelhaken im Forum Controller- und Roboterboards von Conrad.de
    Antworten: 4
    Letzter Beitrag: 09.02.2005, 23:31

Berechtigungen

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

MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad