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
Hilfe beim Schieberegister
21.02.2016, 20:07
Beitrag #1
Hilfe beim Schieberegister
Hallo

Ich sitze jetzt schon ewig vor meiner Schaltung und probiere an meinem Sketch hin und her, aber ich kapiere dieses Schieberegister einfach nicht. Ich habe mir X Beschreibungen und Diskussionen durchgelesen, bekomme es aber einfach nicht hin.

Ich beschreibe mal kurz, was ich habe und was ich damit erreichen möchte:
Ich habe momentan 2 Schieberegister 74HC595 mit jeweils 8 LEDs am Arduino hängen.
Die Leiste mit den LEDs soll hintereinander weg angehen. Also erst komplett aus, da 1. LED an, dann 1. und 2. LED an, dann 1., 2. und 3. LED an - bis alle 16 Stück leuchten.
Die komplette Leiste soll dann etwa 2 Minuten leuchten und dann komplett ausgehen.
Über einen Taster möchte ich das Ganze dann wieder von vorn starten.

Das heißt ja erst einmal, die Ansteuerung der LEDs muss in eine eigene Funktion geschrieben werden, die dann über einen Interrupt beim Drücken des Tasters aufgerufen wird.

Ich bekomme es im Moment aber noch nicht einmal hin, die Leiste zu "füllen". Die anderen Codebeispiele sind aber immer nur entweder Lauflicht oder einzelne LEDs innerhalb der Kette.

Ich habe folgendes probiert:
- Daten Pin (DS / SER) auf High um eine 1 hineinzuschreiben
- Takt Pin (SH_CP / SRCLK) auf High um die 1 ins Register zu schieben
- Speicher Pin (ST_CP / RCLK) auf High um die 1 schließlich an den Ausgang des Registers zu übergeben
- kurze Pause (250 ms)
- Die selbe Prozedur noch einmal, um die nächste 1 ins Register zu schieben

Es funktioniert aber nicht. Irgendwie muss ich das noch weiterschieben oder macht es das beim 2. Durchlauf automatisch?
Bitte helft mir auf die Sprünge.

Matthias
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
22.02.2016, 09:08
Beitrag #2
RE: Hilfe beim Schieberegister
Probier mal diese Demos:
Code:
//Pin connected to ST_CP of 74HC595
int latchPin = 28;
//Pin connected to SH_CP of 74HC595
int clockPin = 29;
////Pin connected to DS of 74HC595
int dataPin = 30;

void setup() {
  //set pins to output so you can control the shift register
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
}

void loop() {
  // count from 0 to 255 and display the number
  // on the LEDs
  for (int numberToDisplay = 0; numberToDisplay < 256; numberToDisplay++) {
    // take the latchPin low so
    // the LEDs don't change while you're sending in bits:
    digitalWrite(latchPin, LOW);
    // shift out the bits:
    shiftOut(dataPin, clockPin, MSBFIRST, numberToDisplay);  

    //take the latch pin high so the LEDs will light up:
    digitalWrite(latchPin, HIGH);
    // pause before next value:
    delay(500);
  }
}

Code:
//Pin connected to ST_CP of 74HC595
int latchPin = 28;
//Pin connected to SH_CP of 74HC595
int clockPin = 29;
////Pin connected to DS of 74HC595
int dataPin = 30;

//holders for infromation you're going to pass to shifting function
byte data;
byte dataArray[10];

void setup() {
  //set pins to output because they are addressed in the main loop
  pinMode(latchPin, OUTPUT);
  Serial.begin(9600);

  //Binary notation as comment
  dataArray[0] = 0xFF; //0b11111111
  dataArray[1] = 0xFE; //0b11111110
  dataArray[2] = 0xFC; //0b11111100
  dataArray[3] = 0xF8; //0b11111000
  dataArray[4] = 0xF0; //0b11110000
  dataArray[5] = 0xE0; //0b11100000
  dataArray[6] = 0xC0; //0b11000000
  dataArray[7] = 0x80; //0b10000000
  dataArray[8] = 0x00; //0b00000000
  dataArray[9] = 0xE0; //0b11100000

  //function that blinks all the LEDs
  //gets passed the number of blinks and the pause time
  blinkAll_2Bytes(2,500);
}

void loop() {

  for (int j = 0; j < 10; j++) {
    //load the light sequence you want from array
    data = dataArray[j];
    //ground latchPin and hold low for as long as you are transmitting
    digitalWrite(latchPin, 0);
    //move 'em out
    shiftOut(dataPin, clockPin, data);
    //return the latch pin high to signal chip that it
    //no longer needs to listen for information
    digitalWrite(latchPin, 1);
    delay(300);
  }
}



// the heart of the program
void shiftOut(int myDataPin, int myClockPin, byte myDataOut) {
  // This shifts 8 bits out MSB first,
  //on the rising edge of the clock,
  //clock idles low

  //internal function setup
  int i=0;
  int pinState;
  pinMode(myClockPin, OUTPUT);
  pinMode(myDataPin, OUTPUT);

  //clear everything out just in case to
  //prepare shift register for bit shifting
  digitalWrite(myDataPin, 0);
  digitalWrite(myClockPin, 0);

  //for each bit in the byte myDataOut�
  //NOTICE THAT WE ARE COUNTING DOWN in our for loop
  //This means that %00000001 or "1" will go through such
  //that it will be pin Q0 that lights.
  for (i=7; i>=0; i--)  {
    digitalWrite(myClockPin, 0);

    //if the value passed to myDataOut and a bitmask result
    // true then... so if we are at i=6 and our value is
    // %11010100 it would the code compares it to %01000000
    // and proceeds to set pinState to 1.
    if ( myDataOut & (1<<i) ) {
      pinState= 1;
    }
    else {  
      pinState= 0;
    }

    //Sets the pin to HIGH or LOW depending on pinState
    digitalWrite(myDataPin, pinState);
    //register shifts bits on upstroke of clock pin  
    digitalWrite(myClockPin, 1);
    //zero the data pin after shift to prevent bleed through
    digitalWrite(myDataPin, 0);
  }

  //stop shifting
  digitalWrite(myClockPin, 0);
}


//blinks the whole register based on the number of times you want to
//blink "n" and the pause between them "d"
//starts with a moment of darkness to make sure the first blink
//has its full visual effect.
void blinkAll_2Bytes(int n, int d) {
  digitalWrite(latchPin, 0);
  shiftOut(dataPin, clockPin, 0);
  shiftOut(dataPin, clockPin, 0);
  digitalWrite(latchPin, 1);
  delay(200);
  for (int x = 0; x < n; x++) {
    digitalWrite(latchPin, 0);
    shiftOut(dataPin, clockPin, 255);
    shiftOut(dataPin, clockPin, 255);
    digitalWrite(latchPin, 1);
    delay(d);
    digitalWrite(latchPin, 0);
    shiftOut(dataPin, clockPin, 0);
    shiftOut(dataPin, clockPin, 0);
    digitalWrite(latchPin, 1);
    delay(d);
  }
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
22.02.2016, 18:34
Beitrag #3
RE: Hilfe beim Schieberegister
Habe jetzt das erste Beispiel versucht umzuschreiben. Beim ersten Mal hat es soweit funktioniert, dass nach und nach immer eine LED mehr angegangen ist, bis am Ende alle 16 Stück geleuchtet haben. Danach hat es aber nicht gestoppt, sondern es kommen trotzdem noch irgendwelche wirren Kombinationen. Wenn ich den Arduino dann vom Netz trenne und neu starte laufen gleich diese wirren Kombinationen los, ohne dass mein "Leiste auffüllen" überhaupt zu sehen ist.
Und eigentlich soll die Lichtleiste ja, wenn alle 16 LEDs leuchten "voll" stehen bleiben.
Irgendwie blicke ich es nicht. Hier mal mein Code:
[/code]
Code:
// Schieberegister 74HC595
int latchPin = 9;                // ST_CP
int clockPin = 11;               // SH_CP
int dataPin = 10;                // DS


void setup()
  {
    pinMode(latchPin, OUTPUT);
    pinMode(clockPin, OUTPUT);
    pinMode(dataPin, OUTPUT);
  }

// soll solange Z kleiner als 16 ist jeweils eine 1 ins Register geben
// um die 16 LEDs der Lichtleiste nach und nach aufzufüllen
// bis alle LEDs zusammen leuchten
void loop()
  {
    int hex;
    for (int Z = 0; Z <= 16; Z++)
    {
      if (Z == 0) {hex = 0;}
      if (Z == 1) {hex = 1;}
      if (Z == 2) {hex = 1;}
      if (Z == 3) {hex = 1;}
      if (Z == 4) {hex = 1;}
      if (Z == 5) {hex = 1;}
      if (Z == 6) {hex = 1;}
      if (Z == 7) {hex = 1;}
      if (Z == 8) {hex = 1;}
      if (Z == 9) {hex = 1;}
      if (Z == 10) {hex = 1;}
      if (Z == 11) {hex = 1;}
      if (Z == 12) {hex = 1;}
      if (Z == 13) {hex = 1;}
      if (Z == 14) {hex = 1;}
      if (Z == 15) {hex = 1;}

      digitalWrite(latchPin, LOW);
      shiftOut(dataPin, clockPin, MSBFIRST, hex);  
      digitalWrite(latchPin, HIGH);
      delay(100);
    }
  }
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Hilfe: IR Remote Steuerung, MSGEQ7 + RGB-LED Streifen dastob 1 118 14.10.2016 21:40
Letzter Beitrag: hotsystems
Sad Ich brauche Hilfe Prosac 4 232 09.10.2016 18:39
Letzter Beitrag: Prosac
  Fehler beim Kompilieren binderj1 5 292 03.10.2016 21:27
Letzter Beitrag: hotsystems
  at24c256 Hilfe Gandalf 6 247 29.08.2016 18:59
Letzter Beitrag: MKc
Smile Progammier Neuling Codeschloss bittet um Hilfe Donalonso 2 284 27.08.2016 18:23
Letzter Beitrag: Binatone
  Fehler beim Speichern von Projekten Manni66 16 683 23.08.2016 10:05
Letzter Beitrag: hotsystems
  Hilfe gesucht. Webserver Statsiche und Dynamische HTMl Seite b3ta 11 449 22.08.2016 08:07
Letzter Beitrag: b3ta
  Arduino hängt beim Upload deranda 11 496 12.08.2016 21:27
Letzter Beitrag: hotsystems
  Hilfe: Mega2560 - ENC 28J60 - MYSQL Gandalf 1 179 28.07.2016 16:30
Letzter Beitrag: Gandalf
  Selbstfahrender Roboter Programm änderung hilfe ? arekklone 11 538 06.07.2016 14:59
Letzter Beitrag: Binatone

Gehe zu:


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