Go Down

Topic: Due 74HC595 in serie (Read 1 time) previous topic - next topic

toti94

Ho un problema ad inviare la serie di bit a 2 shift register in serie.
Naturalmente ho collegato sia il pin del latch e del clock dei due shift assieme, e ho collegato il pin 9 del primo col 14 del secondo (ovvero il srial output col serial input)
Però non capisco come pilotarli assieme.
Ho provato semplicemente ad inviare una serie di 16 bit (8 per il primo e 8 per ilsecondo) ma non va bene.
Questo è il codice
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;

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

void loop() {
  digitalWrite(latchPin, LOW);
  shiftOut(dataPin, clockPin, MSBFIRST, 0b0000000100000001); 
  digitalWrite(latchPin, HIGH);
  delay(500);
  digitalWrite(latchPin, LOW);
  shiftOut(dataPin, clockPin, MSBFIRST, 0b0000000000000000); 
  digitalWrite(latchPin, HIGH);
  delay(500);
}

leo72

Non devi spedire 16 bit tutti insieme ma 2 byte da 8 bit ciascuno con il latch sempre giù:
Code: [Select]

  digitalWrite(latchPin, LOW);
  shiftOut(dataPin, clockPin, MSBFIRST, 0b00000001);
  shiftOut(dataPin, clockPin, MSBFIRST, 0b00000001);
  digitalWrite(latchPin, HIGH);
  delay(500);
  digitalWrite(latchPin, LOW);
  shiftOut(dataPin, clockPin, MSBFIRST, 0b00000000);
  shiftOut(dataPin, clockPin, MSBFIRST, 0b00000000);
  digitalWrite(latchPin, HIGH);
  delay(500);

uwefed

Spiegazione:
shiftOut() spedisce solo 8 bit alla volta. Per spedire 16 bit devi inviare 2x 8 bit. La stessa cosa vale per shiftIn():

Ciao Uwe

toti94

#3
Jun 07, 2013, 12:36 pm Last Edit: Jun 07, 2013, 12:47 pm by toti94 Reason: 1
ah ok, vi ringrazio ^^

edit: ho provato come avete detto voi, ma si accende solo 1 volta l'ultimo led del 2° shift (ovvero il secondo byte inviato) e il primo byte no.
Inoltre poi rimane tutto spento, anche dopo il delay, i led (compreso quello che si era acceso) non si accendono più
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;

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

void loop() {
  digitalWrite(latchPin, LOW);
  shiftOut(dataPin, clockPin, MSBFIRST, 0b00000001);
  shiftOut(dataPin, clockPin, MSBFIRST, 0b00000001); 
  digitalWrite(latchPin, HIGH);
  delay(1500);
  digitalWrite(latchPin, LOW);
  shiftOut(dataPin, clockPin, MSBFIRST, 0b00000000);
  shiftOut(dataPin, clockPin, MSBFIRST, 0b00000000); 
  digitalWrite(latchPin, HIGH);
  delay(1500);
}

stefa24

ciao
ho fatto piccole applicazioni con 74hc595 non ho mai avuto problemi a parte quelli dovuti alla inesperienza, mi viene da dirti di controllare bene i collegamenti

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

leo72

Nel mio ultimo progetto piloto 5 shift register in cascata spedendo 5 byte per volta e tutti i led fanno il loro lavoro come io comando  ;)
Suggerisco anch'io di riguardare i collegamenti per bene.

Hai impostato anche il pin MR su High (collegato a 5V) ed il pin OE su Low (collegato a massa)?

PS:
replicando uno di questi progetti, ti funziona tutto?
http://arduino.cc/en/Tutorial/ShiftOut

pelletta

Piccolo OT nella discussione: ma il parametro MSBFIRST nella funzione shiftOut a che serve?
Io non l'ho mai messo e funziona tutto ugualmente

toti94

MSBFIRST vuol dire : more significative bit first, ovvero il bit più significativo per primo.
In una serie di bit abbiamo che il 1° partendo da sinistra è il più significativo, mentre l'ultimo è il meno significativo.
Infatti puoi anche scrivere LSBFIRST.
In pratica ti fa leggere il bit o da destra a sinistra o da sinistra a destra (in parole povere)

PaoloP

#8
Jun 07, 2013, 03:18 pm Last Edit: Jun 07, 2013, 03:21 pm by PaoloP Reason: 1
Credo che serva per indicare la codifica Big-endian o Little-endian (http://it.wikipedia.org/wiki/Ordine_dei_byte)

--> http://it.wikipedia.org/wiki/Ordine_dei_bit

toti94

ho ricollegato il tutto ed ora si accendono, ma non rimangono accesi per 1 secondo e mezzo ma lampeggiano velocemente e poi rimangono spenti per 1 secondo e mezzo O.o?

leo72

1) ti riferisci allo schema del link?
2) Pubblica il codice che stai usando

toti94

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;

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

void loop() {
  digitalWrite(latchPin, LOW);
  shiftOut(dataPin, clockPin, MSBFIRST, 0b10000000);
  shiftOut(dataPin, clockPin, MSBFIRST, 0b10000000); 
  digitalWrite(latchPin, HIGH);
  delay(1500);
  digitalWrite(latchPin, LOW);
  shiftOut(dataPin, clockPin, MSBFIRST, 0b00000000);
  shiftOut(dataPin, clockPin, MSBFIRST, 0b00000000); 
  digitalWrite(latchPin, HIGH);
  delay(1500);
}

i collegamenti vanno bene, perchè accendendoli solamente, funzionano

leo72

Hai messo il condensatore tra il pin latch e massa? Aiuta molto, quando i led sballonzolano un pò.
Sarebbe buono avere anche foto e schema dei collegamenti.

Go Up