Go Down

Topic: urgent shiftOut help needed (Read 1 time) previous topic - next topic

conorhiggins

Hi my friends and I are currently working on a project for a college assignment. The project involves the use of 16 RGB LEDs in a 4 x 4 matrix. We are sending 16 bytes from MaxMSP which will hopefully control the colour of the lights and be able to turn them on and off etc. For some reason though the code isnt working at all. Can someone help us please? The code is attached:

Code: [Select]
//Pin connected to ST_CP of 74HC595
int latchPin = 8;
//Pin connected to SH_CP of 74HC595
int clockPin = 12;
////Pin connected to DS of 74HC595
int dataPin = 11;

//holders for infromation you're going to pass to shifting function
byte data1;
byte dataArray1[20];

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

void loop()
{
 if (Serial.available() >= 17)
 {
   //check for start bit
   //if incoming byte is 'a' then store all other bytes
   if (byte( Serial.read() ) == 'a') // 97 in int form
   {
     dataArray1[0] = Serial.read();
     dataArray1[1] = Serial.read();
     dataArray1[2] = Serial.read();
     dataArray1[3] = Serial.read();
     dataArray1[4] = Serial.read();
     dataArray1[5] = Serial.read();
     dataArray1[6] = Serial.read();
     dataArray1[7] = Serial.read();
     dataArray1[8] = Serial.read();
     dataArray1[9] = Serial.read();
     dataArray1[10] = Serial.read();
     dataArray1[11] = Serial.read();
     dataArray1[12] = Serial.read();
     dataArray1[13] = Serial.read();
     dataArray1[14] = Serial.read();
     dataArray1[15] = Serial.read();
   }
 }

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

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

conorhiggins

Can you explain by any chance why some of the LEDs were still lighting up though? The only thing that seems to be going wrong is that there doesn't seem to be any degree of control over which LED lights up unfortunately.

PaulS

Quote
For some reason though the code isnt working at all.


This is truly hard to believe. Perhaps what you meant was that this code is not doing everything you expected, and nothing you didn't expect.

I see no Serial.print statements that would confirm that any serial data was received, or that it was correct.

Without that, there's not much sense in examining the rest of the code. If no data is being received, there is one problem. If there is data coming in, but it is not in the expected format, that is a different problem. If there is data, and it is in the right format, there is still another problem.

Give us a hint. Which one are we trying to solve?
The art of getting good answers lies in asking good questions.

conorhiggins

@ PaulS - I tried using Serial.println(Serial.read()) to print the data out in MaxMSP but to no avail and couldn't figure out what was happening. Can you perhaps tell me why the data wasn't printing. I thought it might have had something to do with the way I was storing the incoming values, I mean I've been told that that method works whereby each Serial.read() will correspond to a separate Byte in the buffer. Am I correct in saying that?

Conor

PaulS

The way you are reading and storing the data looks OK (except that it should be done using 4 lines, not 16).

Code: [Select]
for(byte j=0; j<16; j++)
{
  dataArray1[j] = Serial.read();
}


Since you are sending serial data from MaxMSP, the Serial.print() data would need to be read by MaxMSP. Is that possible?
The art of getting good answers lies in asking good questions.

conorhiggins

@PaulS Yes its definitely possible. There is a simple object used in Max called serial which facilitates bidirectional serial communication. However for some reason the serial data wont print out. Can you suggest a reason as to why this is happening? I have never experienced that problem with serial communication.

Conor

PaulS

Quote
Can you suggest a reason as to why this is happening?


Much depends on where the Serial.print statement was, or statements were, placed.

I would have started with something like this:

Code: [Select]
int avail = Serial.available();
Serial.print("There are ");
Serial.print(avail, DEC);
Serial.println(" bytes available to read...");
if(avail >= 17)
{
 // Read and echo each value
}


Only when I had the serial communication stuff working would I have written the rest of the code. In any application, in my experience, the hardest part is getting data in and out of the application. Once you are getting good data in, the manipulation of that data is easy.
The art of getting good answers lies in asking good questions.

Go Up