Okay guys .. I am very thankful for your help.. I somehow managed to run the program successfully.. My 16 LED simulator giving me best results without loosing any bits...Following is the visual basic code to send two bytes and then a small delay(for loop) and then again send two bytes..The arduino received exactly what i sent...
ComArduino.Output = Chr(&H7F)
ComArduino.Output = Chr(&H1C)
For i = 0 To 10000
Next i
ComArduino.Output = Chr(&H0)
ComArduino.Output = Chr(&H1)
I am not using any delimiter.. I have made a programmable delay in the Visualbasic to send two bytes and then a small delay and then send two bytes... At the Arduino end, following is the workable code..
//Pin connected to ST_CP of 74HC595
int latchPin = 6;
//Pin connected to SH_CP of 74HC595
int clockPin = 13;
////Pin connected to DS of 74HC595
int dataPin = 11;
byte c;
byte c1;
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() {
if (Serial.available() > 0){
c = Serial.read();
c1= Serial.read();}
//count up routine
digitalWrite(latchPin, 0);
//count up on 1st byte
shiftOut(dataPin, clockPin, c);
//count down on 2nd byte
shiftOut(dataPin, clockPin, c1);
//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);
}
The above code is for 16 solenoid valves operated through Arduino and 02 74HC595... If we have to increase the solenoid valves upto multyple of 8i.e. 8, 16,24,32, 40,48,56 etc.. we just to add some more declaration of bytes and shiftout like following code:
// THIS CODE IS FOR 40 SOLENOID VALVES
byte c;
byte c1;
[b]byte c2;
byte c3;
byte c4;[/b]
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() {
if (Serial.available() > 0){
c = Serial.read();
c1= Serial.read();
[b] c2 = Serial.read();
c3= Serial.read();
c4 = Serial.read();[/b]
}
//count up routine
digitalWrite(latchPin, 0);
//count up on 1st byte
shiftOut(dataPin, clockPin, c);
//count down on 2nd byte
shiftOut(dataPin, clockPin, c1);
//count down on 3rd byte
shiftOut(dataPin, clockPin, c2);
//count down on 4th byte
shiftOut(dataPin, clockPin, c3);
//count down on 5th byte
shiftOut(dataPin, clockPin, c4);