Aiutoshift register 74hc595!

Salve a tutti!! Sto cercando di creare diverse animazioni con led tramite questi shift register, e sono riuscito a padroneggiarne appieno (che parolone!) le funzionalità, ma con 1 soltanto... qualcuno sa dirmi come adattare questo sketch x metterne 2 in cascata? Fisicamente ho già collegato i 2 reg, mettendo in parallelo oltre alle alimentazioni i pin del clock e del latch, x il data ho mandato dal pin 9 (Serial Out) del primo al pin 14 (Data input) del secondo... come devo modificare il codice per creare sequenze di 16 led?! Grazie!!!

int clockPin = 12; //IC Pin 11, Yellow Jumper int dataPin = 11; //IC Pin 14, Blue Jumper int latchPin = 8; //IC Pin 12, Green Jumper

byte patterns[40] = { B00011000, 100, B00111100, 100, B01111110, 100, B11111111, 10, B01111110, 100, B00111100, 100, B00011000, 100,

};

int index = 0; int count = sizeof(patterns) / 2;

void setup() { pinMode(latchPin, OUTPUT); pinMode(clockPin, OUTPUT); pinMode(dataPin, OUTPUT); }

void loop() { digitalWrite(latchPin, LOW); shiftOut(dataPin, clockPin, MSBFIRST, patterns[index * 2]); digitalWrite(latchPin, HIGH); delay(patterns[(index * 2) + 1]); index++; if (index >= count){ index = 0; } }

Allunga la manina........ STACK! Una bella bacchettata per non aver cercato nel Playground XD XD http://www.arduino.cc/en/Tutorial/ShiftOut

Grazie!!! Adesso guardo subito il link!! ps manina allungata..... ma come semplicità di programmazione della sequenza è simile a quello che ho postato?! Nel mio semplicemente vado a cambiarmi la stringa B00000000 a seconda dei led che voglio accendermi... molto intuitiva

Perfetto, trovato quello giusto credo!!!! Questo forum è fantastico.... tutta la comunità è fantastica, grazie!!!

Sono arenato.... riesco ad accendere sequenze avanti-indietro ma mantenendo accesi i led precedenti... se volessi fare una sequenza di un led alla volta?!

Partiamo da un concetto semplice: 1 595=8 uscite 8 uscite=8 bit 8 bit=1 byte

Quindi per 2 595, ti servono 2 byte. Per comandare anche 1 solo pin di 1 solo 595 devi rispedire entrambi i byte. Ppotresti rispedire solo il 1° ma così devi controllare se il led da accendere è collegato al 1° o 2° chip: non è complicato ma, per imparare, ti viene più semplice rispedire tutta la sequenza.

Così, perchè l'ho trovato piuttosto interessante per imparare ad usare i 74HC595, prova a dare un occhio al massimo impari qualcos'altro:

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

Grazie a entrambi, ottimo il sito con il video dimostrativo!!! Ok, mi servono 2 byte e ci sono, 1 per ciascun 595. Se gli mando la stringa di bit per esempio 0xFF, che sarebbe 11111111 si accendono tutti i led del 595 relativo... se inserisco per esempio 0xFE (11111110) si accendono tutti tranne il primo... e così via. Ma ancora non comprendo come andare ad accendere solo il primo, o il secondo individualmente!!! :blush:

scusa ma usando l'esempio che ti ho linkato non ti basta?

tipo setRegisterPin(9, HIGH);

dovresti poter accendere il secondo led del secondo shift register. Spero che qualcuno mi corregga se è errato.

Ho provato esclusivamente con 1 shift register anche perchè a me serviva di pilotare un LCD, non dei led.

Sai come funziona uno shift register?

Shift register significa registro a scorrimento. Immagina di avere 8 caselle: se spedisci 1 solo bit, occupi la prima casella. Se ne spedisci 2, occuperai le prime 2... e così via fino a riempirle tutte ed 8.

E dopo l'ottava? Qui entra in gioco il pin Q7", il Serial Out. Se spedisci 9 bit, occuperai le 8 caselle del 1° 595, il 9° bit "spingerà" i bit già dentro al chip per farsi spazio, col risultato che il 1° bit che avevi spedito verrà spinto fuori da quel pin. Mettendo 2 shift register in cascata, ossia con il pin Q7" del 1° collegato al pin DS (Serial In) del 2° ti assicurerai che i bit espulsi dal 1° shift entrino nel 2°. Per far ciò devi ovviamente collegare in parallelo anche i pin Latch, Clock e Output Enable, in modo da comandare entrambi i registri simultaneamente.

Quindi per accendere il 5° led collegato al 2° shift register dovrai spedire il valore di quel led seguito da 12 altri bit, tanti ne servono infatti per far scorrere alla 13 posizione (8+5) il valore che ti serve. In questo modo però modificherai anche i 12 led prima di quello interessato. Ecco allora che entrano in azione le operazioni sui bit per modificare i singoli bit: http://arduino.cc/en/Reference/Bit

Scusa Leo, giusto per curiosità...

penso che potrebbe utilizzare con successo la libreria presente qui:

http://bildr.org/2011/08/74hc595-breakout-arduino/

Ora non so cosa ne pensi tu ma quando riesco e sono disponibili le librerie le trovo molto veloci e comode da usare e quindi se disponibili le sfrutto.

Poi è vero che sicuramente facendo 'a manina' si impara di più.

:)

Ringrazio entrambi per tutti i consigli che mi date!!! In effetti si, le librerie già pronte sono comode, ma preferisco imparare il corretto funzionamento "base" per capirne il + possibile!!!

Ma lui deve imparare, se usa la lib non impara come funziona uno shift register. Quando lo avrà imparato ed avrà imparato anche a modificare i singoli bit, avrà fatto un piccolo bagaglio culturale che gli servirà in altre situazioni (le operazioni sui bit sono frequenti su micro ad 8 bit dalle limitate capacità, permettono di risparmiare memoria e alleggerire di calcoli)

leo72: Ma lui deve imparare, se usa la lib non impara come funziona uno shift register. Quando lo avrà imparato ed avrà imparato anche a modificare i singoli bit, avrà fatto un piccolo bagaglio culturale che gli servirà in altre situazioni (le operazioni sui bit sono frequenti su micro ad 8 bit dalle limitate capacità, permettono di risparmiare memoria e alleggerire di calcoli)

tutto corretto, ci mancherebbe altro non fosse così.

Non avevo considerato il fatto che stesse imparando ma solo la velocità di ottenimento del risultato.

In realtà mi servirebbe con una certa urgenza, ma sto cercando di unire l'utile al dilettevole!!!! ps se vi interessa sapere x cosa, sto provando a realizzare l'impianto luci per una riproduzione di uno zaino protonico dei ghostbusters

Ok, sto imparando qualcosa sulle modifiche dei singoli bit… e stavo anche facendo qualche prova con l’altro metodo, con i comandi setRegisterPin!!! In effetti si, è + veloce ma per fare una sequenza viene fuori un listato enorme, dato che per ogni sequenza è necessario riscrivere 16 righe… x esempio per fare una sequenza di accensione/spegnimento avanti e indietro di 16 led, con 2 595, ho dovuto riscrivere

setRegisterPin(2, HIGH);
setRegisterPin(3, LOW);
setRegisterPin(4, LOW);
setRegisterPin(5, LOW);
setRegisterPin(6, LOW);
setRegisterPin(7, LOW);
setRegisterPin(8, LOW);
setRegisterPin(9, LOW);
setRegisterPin(10, LOW);
setRegisterPin(11, LOW);
setRegisterPin(12, LOW);
setRegisterPin(13, LOW);
setRegisterPin(14, LOW);
setRegisterPin(15, LOW);
writeRegisters();

per tipo 32 volte!!! Ovviamente non è una cosa definitiva, è mastodontico… ma se volessi impostare 2 diverse sequenze (tipo appunto questa avanti-indietro, ed una avanti-indietro a led singolo) variabile tramite un pulsante dite che è possibile??? Resto cmq dell’idea che mi studio x bene il metodo di base…

Ed anche un po' di programmazione, dato che il ciclo potevi farlo con un for o con un while. :sweat_smile:

Già.... come noterai per adesso mi limito o poco + a fare modifiche ad altri sketch che trovo a giro riadattandoli alle mie esigenze, ma riconosco che senza una base ci si intoppa ad ogni piccolo imprevisto.... intendevi dire per il discorso delle 2 diverse sequenze da variare con un pulsante?

leo72: Ed anche un po' di programmazione, dato che il ciclo potevi farlo con un for o con un while. :sweat_smile:

in effetti :grin:

Dai ragazzi, abbiate pazienza con i niubbi!!!!! ;-)