Go Down

Topic: Controlling 4 daisy chained 595 chips (Read 902 times) previous topic - next topic

kustom

Jun 21, 2012, 06:43 pm Last Edit: Jun 21, 2012, 07:23 pm by kustom Reason: 1
This code is straight c/p from the tutorial, except that I've added 2 more lines since I'm using 4 instead of 2 shift registers and there's my own array.

Notice: I only have LEDs on 1st and 2nd shift register at the moment. 8 on the first and 5 on 2nd.


Code: [Select]
//**************************************************************//
//  Name    : shiftOutCode, Dual Binary Counters                 //
//  Author  : Carlyn Maw, Tom Igoe                               //
//  Date    : 25 Oct, 2006                                       //
//  Version : 1.0                                                //
//  Notes   : Code for using a 74HC595 Shift Register            //
//          : to count from 0 to 255                             //
//**************************************************************//

//Pin connected to ST_CP of 74HC595
int latchPin = 3;
//Pin connected to SH_CP of 74HC595
int clockPin = 4;
////Pin connected to DS of 74HC595
int dataPin = 2;

int array[] = {1,2,4,8,16,32,64,128,255};



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

}

void loop() {
 //count up routine
 for (int j = 0; j < 9; j++) {
   //ground latchPin and hold low for as long as you are transmitting
   digitalWrite(latchPin, 0);
   shiftOut(dataPin, clockPin, 0);
   shiftOut(dataPin, clockPin, 0);
   shiftOut(dataPin, clockPin, array[j]);
   shiftOut(dataPin, clockPin, array[j]);
   //return the latch pin high to signal chip that it
   //no longer needs to listen for information
   digitalWrite(latchPin, 1);
   delay(1000);
 }
}

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;
s  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);
}


Now, if I write this:

   
Code: [Select]

   shiftOut(dataPin, clockPin, 0);
   shiftOut(dataPin, clockPin, 0);
   shiftOut(dataPin, clockPin, 0);
   shiftOut(dataPin, clockPin, array[j]);


First shift register (the one which has clock pin, latch and data pin connected to Arduino) works perfectly. All 8 LEDs turn on as expected EXCEPT for this:

array[7] - last LED on first SR turns on
array[8] (255) - every LED on first SR turns on
array[0] (again) - every LED on both SR turns on
array[1] - second LED on first SR turns on

then it works all fine until array[0] comes again.
Notice: when I upload the sketch and the loop starts, array[0] turns only first LED on first SR until the loop starts again, then array[0] turns on every LED on both SR.

If I write this code

 
Code: [Select]

   shiftOut(dataPin, clockPin, 0);
   shiftOut(dataPin, clockPin, 0);
   shiftOut(dataPin, clockPin, array[j]);
   shiftOut(dataPin, clockPin, 0);


LEDs on 2nd SR turn on and off repeatedly (not one by one but all).
I'm running out of ideas here.

johnwasser

From http://arduino.cc/en/Reference/ShiftOut:

Syntax
shiftOut(dataPin, clockPin, bitOrder, value)

YOU HAVE LEFT OUT 'bitOrder'.

Note
The dataPin and clockPin must already be configured as outputs by a call to pinMode().

YOU HAVE NOT DONE THAT.
Send Bitcoin tips to: 1L3CTDoTgrXNA5WyF77uWqt4gUdye9mezN
Send Litecoin tips to : LVtpaq6JgJAZwvnVq3ftVeHafWkcpmuR1e

kustom

No need to yell. Anyways I've fixed and it's behaving exactly the same.

Code: [Select]
//**************************************************************//
//  Name    : shiftOutCode, Dual Binary Counters                 //
//  Author  : Carlyn Maw, Tom Igoe                               //
//  Date    : 25 Oct, 2006                                       //
//  Version : 1.0                                                //
//  Notes   : Code for using a 74HC595 Shift Register            //
//          : to count from 0 to 255                             //
//**************************************************************//

//Pin connected to ST_CP of 74HC595
int latchPin = 3;
//Pin connected to SH_CP of 74HC595
int clockPin = 4;
////Pin connected to DS of 74HC595
int dataPin = 2;

int array[] = {1,2,4,8,16,32,64,128,255};



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

}

void loop() {
  //count up routine
  for (int j = 0; j < 9; j++) {
    //ground latchPin and hold low for as long as you are transmitting
    digitalWrite(latchPin, 0);
    //count up on GREEN LEDs
    shiftOut(dataPin, clockPin, MSBFIRST, 0);
    shiftOut(dataPin, clockPin, MSBFIRST, 0);
    shiftOut(dataPin, clockPin, MSBFIRST, 0);
    shiftOut(dataPin, clockPin, MSBFIRST, array[j]);
    //return the latch pin high to signal chip that it
    //no longer needs to listen for information
    digitalWrite(latchPin, 1);
    delay(1000);
  }
}

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);
}

johnwasser

Try removing the shiftOut function from your code an using the shiftOut() function from the Arduino core.  Perhaps back in 2006 when that example code ws written the Arduino library didn't include shiftOut().

Are you using the schematic from this tutorial?  http://arduino.cc/en/Tutorial/ShiftOut

Send Bitcoin tips to: 1L3CTDoTgrXNA5WyF77uWqt4gUdye9mezN
Send Litecoin tips to : LVtpaq6JgJAZwvnVq3ftVeHafWkcpmuR1e

kustom

Removed shiftOut function. New results:

Code: [Select]

   shiftOut(dataPin, clockPin, MSBFIRST, 0);
   shiftOut(dataPin, clockPin, MSBFIRST, 0);
   shiftOut(dataPin, clockPin, MSBFIRST, 0);
   shiftOut(dataPin, clockPin, MSBFIRST, array[j]);


Working as expected. No LEDs are lighted up on 2nd register.

Code: [Select]
   shiftOut(dataPin, clockPin, MSBFIRST, 0);
   shiftOut(dataPin, clockPin, MSBFIRST, 0);
   shiftOut(dataPin, clockPin, MSBFIRST, array[j]);
   shiftOut(dataPin, clockPin, MSBFIRST, 0);


Nothing is lighted up.

And yes, schematics is same except that I've added capacitors between GND and +5 on each chip.

johnwasser


Code: [Select]
   shiftOut(dataPin, clockPin, MSBFIRST, 0);
   shiftOut(dataPin, clockPin, MSBFIRST, 0);
   shiftOut(dataPin, clockPin, MSBFIRST, array[j]);
   shiftOut(dataPin, clockPin, MSBFIRST, 0);


Nothing is lighted up.


My best guess would be a wiring error.
Send Bitcoin tips to: 1L3CTDoTgrXNA5WyF77uWqt4gUdye9mezN
Send Litecoin tips to : LVtpaq6JgJAZwvnVq3ftVeHafWkcpmuR1e


kustom

I tried code from this site and guess what - it works.

http://bildr.org/2011/02/74hc595/


Go Up