Go Down

Topic: [risolto] problema concatenare shiftin (Read 912 times) previous topic - next topic

stefa24

Feb 18, 2012, 09:25 pm Last Edit: Feb 20, 2012, 09:22 am by stefa24 Reason: 1
ciao
ho alcuni 74hc597 sono dei piso, ho seguito questa guida
http://y-aji.com/?p=242
funziona con un integrato, adesso vorrei aggiungerne uno,
ho già fatto esperienze con successo, seguendo il playground dove si usa un cd4021, per questo ho collegato pin9 di uno con pin 14 dell'altro ma leggo solo una variabile e la seconda è uguale
qualche suggerimento?

grazie
stefano

Code: [Select]
//**************************************************************//
//  Name    : shiftIn Example 2.1                              //
//  Author  : Carlyn Maw                                        //
//  Date    : 25 Jan, 2007                                      //
//  Version : 1.0                                               //
//  Notes   : Code for using a CD74hc597 Shift Register     //
//          :                                                   //
//****************************************************************

//define where your pins are
int latchPin = 8; //597 pin 12
int dataPin = 9; //597 pin 9
int clockPin = 7; //597 pin 11
int loadPin = 6;//597 pin 13

int count;

//Define variables to hold the data
//for shift register.
//starting with a non-zero numbers can help
//troubleshoot
byte switchVar1 = 72;  //01001000
byte switchVar2 = 159; //10011111

void setup() {
 //start serial
 Serial.begin(9600);

 //define pin modes
 pinMode(latchPin, OUTPUT);
 pinMode(clockPin, OUTPUT);
 pinMode(dataPin, INPUT);
pinMode(loadPin, OUTPUT);
}

void loop() {

 //Pulse the latch pin:
 
 digitalWrite(latchPin,1);//set it to 1 to collect parallel data
  delayMicroseconds(20); //set it to 1 to collect parallel data, wait
 digitalWrite(latchPin,0);//set it to 0 to transmit data serially  

 //while the shift register is in serial mode
 //collect each shift register into a byte
 //the register attached to the chip comes in first
 //switchVar1 = shiftIn(dataPin, clockPin);
switchVar1 = shiftIn(dataPin, clockPin, loadPin);
switchVar2 = shiftIn(dataPin, clockPin, loadPin);
 //Print out the results.
 //leading 0's at the top of the byte
 //(7, 6, 5, etc) will be dropped before
 //the first pin that has a high input
 //reading
//  Serial.println(switchVar1, BIN);
for (count=0;count<8;count++)
{
Serial.print(count);
Serial.print('\t');
Serial.print("switchVar1");
Serial.print('\t');
Serial.println(bitRead(switchVar2,count));
}
Serial.println("-------------------");
for (count=0;count<8;count++)
{
Serial.print(count);
Serial.print('\t');
Serial.print("switchVar2");
Serial.print('\t');
Serial.println(bitRead(switchVar1,count));
}
//white space
Serial.println("-------------------");
//delay so all these print satements can keep up.
delay(1000);

}//------------------end main loop

////// --------------shiftIn function
///// just needs the location of the data pin and the clock pin
///// it returns a byte with each bit in the byte corresponding
///// to a pin on the shift register. leftBit 7 = Pin 7 / Bit 0= Pin 0

//byte shiftIn(int myDataPin, int myClockPin) {
byte shiftIn(int myDataPin, int myClockPin, int myLoadPin)
{
 int i;
 int temp = 0;
 int pinState;
 byte myDataIn = 0;

 pinMode(myDataPin, INPUT);
 pinMode(myClockPin, OUTPUT);
 pinMode(myLoadPin, OUTPUT);
 
//we will be holding the clock pin high 8 times (0,..,7) at the
//end of each time through the for loop

//at the begining of each loop when we set the clock low, it will
//be doing the necessary low to high drop to cause the shift
//register's DataPin to change state based on the value
//of the next bit in its serial information flow.
//The register transmits the information about the pins from pin 7 to pin 0
//so that is why our function counts down

digitalWrite(myLoadPin, 0);
delayMicroseconds(0.2);
digitalWrite(myLoadPin, 1);

 for (i=7; i>=0; i--)
 {
   digitalWrite(myClockPin, 0);
   delayMicroseconds(0.2);
   temp = digitalRead(myDataPin);
   if (temp) {
     pinState = 1;
     //set the bit to 0 no matter what
     myDataIn = myDataIn | (1 << i);
   }
   else {
     //turn it off -- only necessary for debuging
    //print statement since myDataIn starts as 0
     pinState = 0;
   }

   //Debuging print statements
   //Serial.print(pinState);
   //Serial.print("     ");
   //Serial.println (dataIn, BIN);

   digitalWrite(myClockPin, 1);

 }
 //debuging print statements whitespace
 //Serial.println();
 //Serial.println(myDataIn, BIN);
 return myDataIn;
}

https://sites.google.com/site/agritronica/
https://sites.google.com/site/t3chconcrete/
arduino UNO rev 3
ide 105

leo72

Hai collegato i pin 13/12/11 dei 2 registri tra di loro?

stefa24

#2
Feb 19, 2012, 10:17 am Last Edit: Feb 19, 2012, 10:19 am by stefa24 Reason: 1
ciao
@leo
si ho collegato insieme i pin indicati
vorrei utilizzarli perchè ne ho un pò e sono simili alla piedinatura del 74hc595, giusto per non diversificare troppo, inoltre non vorrei darmi per vinto

stefano
https://sites.google.com/site/agritronica/
https://sites.google.com/site/t3chconcrete/
arduino UNO rev 3
ide 105

leo72

Metti per favore lo schema esatto, vediamo se si trova un errore di collegamento.

stefa24

ciao
allego lo schema e un esempio di output mettendo a gnd il pin A di un integrato
Code: [Select]

0      switchVar1 0
1 switchVar1 1
2 switchVar1 1
3 switchVar1 1
4 switchVar1 1
5 switchVar1 1
6 switchVar1 1
7 switchVar1 1
-------------------
0 switchVar2 0
1 switchVar2 1
2 switchVar2 1
3 switchVar2 1
4 switchVar2 1
5 switchVar2 1
6 switchVar2 1
7 switchVar2 1
-------------------


grazie
stefano
https://sites.google.com/site/agritronica/
https://sites.google.com/site/t3chconcrete/
arduino UNO rev 3
ide 105

leo72

Mi sono accorto di una cosa osservando il listato ed il sito da cui hai preso il codice.
Il tuo sketch (che è quello del sito) dichiara una funzione shiftIn per leggere i dati dal registro ma c'è un però: Arduino già dichiara una propria funzione shiftIn, che è diversa da questa. Visto che l'articolo è di 2 anni fa, non vorrei che fosse stato scritto per versioni vecchie dell'IDE che non avevano ancora quella funzione (che ho visto è stata introdotta in una versione rilasciata poco prima di quell'articolo).

Prova intanto a ridenominare la funzione magari da shiftIn a dataIn, per esempio. Per vedere se cambia qualcosa.

stefa24

ciao
@leo
lo sketch di partenza è quello del playground, e funziona con il 4021, è stato modificato facendo le aggiunte del link per il 597, uso la versione di arduino 0022, comunque ho fatto e non ci sono cambiamenti

stefano
https://sites.google.com/site/agritronica/
https://sites.google.com/site/t3chconcrete/
arduino UNO rev 3
ide 105

leo72

Ed usando quello della guida per il 597? Hai provato?

stefa24

ciao
i due sketch sono uguali ho fatto solo le aggiunte segnate in rosso, e con uno solo funziona

grazie
stefano
https://sites.google.com/site/agritronica/
https://sites.google.com/site/t3chconcrete/
arduino UNO rev 3
ide 105

leo72

Ho finito le idee. Ricontrolla i collegamenti, magari c'è qualcosa che non va.

stefa24

ciao
@leo
grazie per la pazienza stamattina ho risolto
posto lo schema funzionante

Code: [Select]
//  Date    : 20.02.2012                                      //
//  Notes   : Code for using a 2 CD74hc597 Shift Register    //
//          :                                                   //
//****************************************************************

//define where your pins are
int latchPin = 8; //597 pin 12
int dataPin = 9; //597 pin 9
int clockPin = 7; //597 pin 11
int loadPin = 6;//597 pin 13

int count;

//Define variables to hold the data
//for shift register.
//starting with a non-zero numbers can help
//troubleshoot
byte switchVar1 = 72;  //01001000
byte switchVar2 = 159; //10011111

void setup() {

  Serial.begin(9600); //start serial

  pinMode(latchPin, OUTPUT); //define pin modes
  pinMode(clockPin, OUTPUT);  //define pin modes
  pinMode(dataPin, INPUT); //define pin modes
pinMode(loadPin, OUTPUT); //define pin modes
}

void loop() {

  //Pulse the latch pin:
 
  digitalWrite(latchPin,1);//set it to 1 to collect parallel data
   delayMicroseconds(20); //set it to 1 to collect parallel data, wait
  digitalWrite(latchPin,0);//set it to 0 to transmit data serially 

digitalWrite(loadPin, 0);
delayMicroseconds(20);
digitalWrite(loadPin, 1);

  //while the shift register is in serial mode
  //collect each shift register into a byte
  //the register attached to the chip comes in first
  //switchVar1 = shiftIn(dataPin, clockPin);
switchVar1 = shiftIn(dataPin, clockPin);
switchVar2 = shiftIn(dataPin, clockPin);
  //Print out the results.
  //leading 0's at the top of the byte
  //(7, 6, 5, etc) will be dropped before
  //the first pin that has a high input
  //reading
//  Serial.println(switchVar1, BIN);
for (count=0;count<8;count++)
{
Serial.print(count);
Serial.print('\t');
Serial.print("switchVar1");
Serial.print('\t');
Serial.println(bitRead(switchVar2,count));
}
Serial.println("-------------------");
for (count=0;count<8;count++)
{
Serial.print(count);
Serial.print('\t');
Serial.print("switchVar2");
Serial.print('\t');
Serial.println(bitRead(switchVar1,count));
}
//white space
Serial.println("-------------------");
//delay so all these print satements can keep up.
delay(2000);

}//------------------end main loop

////// --------------shiftIn function
///// just needs the location of the data pin and the clock pin
///// it returns a byte with each bit in the byte corresponding
///// to a pin on the shift register. leftBit 7 = Pin 7 / Bit 0= Pin 0


//byte shiftIn(int myDataPin, int myClockPin) {
byte shiftIn(int myDataPin, int myClockPin)
{
  int i;
  int temp = 0;
  int pinState;
  byte myDataIn = 0;

  pinMode(myDataPin, INPUT);
  pinMode(myClockPin, OUTPUT);
   
//we will be holding the clock pin high 8 times (0,..,7) at the
//end of each time through the for loop

//at the begining of each loop when we set the clock low, it will
//be doing the necessary low to high drop to cause the shift
//register's DataPin to change state based on the value
//of the next bit in its serial information flow.
//The register transmits the information about the pins from pin 7 to pin 0
//so that is why our function counts down

  for (i=7; i>=0; i--)
  {
    digitalWrite(myClockPin, 0);
    delayMicroseconds(20);
    temp = digitalRead(myDataPin);
    if (temp) {
      pinState = 1;
   
      myDataIn = myDataIn | (1 << i);
    }
    else {
      //turn it off -- only necessary for debuging
     //print statement since myDataIn starts as 0
      pinState = 0;
    }
    digitalWrite(myClockPin, 1);
  }
  return myDataIn;
}


in pratica bisogna portare fuori dalla funzione shiftin questa parte

Code: [Select]
digitalWrite(loadPin, 0);
delayMicroseconds(20);
digitalWrite(loadPin, 1);


grazie
stefano
https://sites.google.com/site/agritronica/
https://sites.google.com/site/t3chconcrete/
arduino UNO rev 3
ide 105

leo72

Quindi in pratica tenere il pin LOAD alto per tutto il tempo in cui tu esegui le letture sui registri.
E' logico, a ripensarci ed a rileggere il datasheet.

Il datasheet dice che il pin LOAD serve per caricare i valori dei pin in un registro intermedio che è posto PRIMA del registro a scorrimento interno su cui viaggiano i dati. Quindi dare il segnale alto su quel pin nella seconda lettura faceva ricaricare nuovamente i dati dei pin al 1° chip, cancellando quindi i bit che erano arrivati dal 2° chip, quello a valle.

stefa24

ciao
esatto con questa parte del codice

Code: [Select]
  digitalWrite(latchPin,1);//set it to 1 to collect parallel data
   delayMicroseconds(20); //set it to 1 to collect parallel data, wait
  digitalWrite(latchPin,0);//set it to 0 to transmit data serially 


carica lo stato dei pin

con questa parte del codice

Code: [Select]
digitalWrite(loadPin, 0);
delayMicroseconds(20);
digitalWrite(loadPin, 1);


trasferiamo le letture nel registro
da qui procediamo con il solito sketch

grazie
stefano
https://sites.google.com/site/agritronica/
https://sites.google.com/site/t3chconcrete/
arduino UNO rev 3
ide 105

Go Up