Aiutoshift register 74hc595!

Sto seguendo il TRD che per me , Arduinista da un paio di settimane , ha fatto brillare qualche idea
Pensavo che , con tempi di refresh non critici , si potrebbe con 5 pin avere 8 In ed 8 Out usando in combinata il 595 ed il 165 ; clock , data in , data out , enable in , enable out .
restando sul 595 pensavo che essendo value un int potrebbe essere valorizzato partendo da un array boolean Uscita[] in cui ciascun elemento sara true o false
Quindi con un ciclo for scansionare gli 8 elemeti dell'array impostando l'intero
Inizializzo value a 0
Al "passo" zero se uscita[passo] e' true avro' value = value + 2^passo // passo vale 0 e quindi se uscita[0] e' true aggiungo 1 ( 2^0)
al passo 1 se uscita[passo] e' true avro' value = value + 2^passo // passo vale 1 e quindi se uscita[1] e' true aggiungo 2 ( 2^1)
al passo 2 se uscita[passo] e' true avro' value = value + 2^passo // passo vale 2 e quindi se uscita[2] e' true aggiungo 4 ( 2^2)
e cosi via per trovarmi alla fine con la somma del peso di ciascun bit dentro a value e "spararlo" fuori con lo shiftout
Per cambiare le uscite basta cambiare l'elemento dell'array portandolo da true a false o viceversa
Penso che un for di 8 passi con 8 if ed eventali elevazioni a potenza + somma non porti via tanto tempo e consenta anche di avere un codice abbastanza compatto

Chiedo venia se ho scritto una castroneria

Credo sia un'ottima cosa ma sinceramente, x quello che mi serve adesso, non ci capisco una mazza!!!!! Lascio ai fenomeni una risposta adeguata!!! XD

nytro81:
Credo sia un'ottima cosa ma sinceramente, x quello che mi serve adesso, non ci capisco una mazza!!!!! Lascio ai fenomeni una risposta adeguata!!! XD

Se l'81 del tuo nick e' il tuo anno di nascita i 30 li hai passati ed a scuola non ci vai piu' :grin:
A 'sto punto bisognerebbe essere al corrente delle tue conoscenze in merito ai "pesi" dei bit che compongono il byte

Altrimenti te lo spiego io o qualche altro ben volentieri , sia chiaro . Siamo qui anche imparare

Già, l'81 è proprio il mio anno di nascita ed in effetti a scuola non ci vado +!!! Ma non ho smesso di avere passione nell'imparare cose nuove!!! Mi reputo uno smanettone ma + sull'hardware, di programmazione come avrai letto mi limito a spulciare in rete alla ricerca di qualcosa di vicino a quello che mi serve ed adattarmelo!!! Il metodo + sbagliato di fare le cose, lo ammetto..... :blush:

ciao
per l'uso dello shiftout ho capito questo:

digitalWrite(latchPin, LOW);          //Pull latch LOW to start sending data

     shiftOut(dataPin, clockPin, MSBFIRST,var1);         //Send the data 1
          shiftOut(dataPin, clockPin, MSBFIRST,var2);         //Send the data 2
...
          shiftOut(dataPin, clockPin, MSBFIRST,varN);         //Send the data n

        digitalWrite(latchPin, HIGH);

var1 te lo trovi sullo N ultimo shift
...
varN-1 te lo trovi sul secondo shift
varN te lo trovi sul primo shift

in pratica i byte entrano nel primo 74 e scivolano fino all'ultimo

stefano

Sì, è corretto. shiftOut "spinge" i bit dentro al 595 collegato all'Arduino, 8 bit per volta. Se devi spedire i dati su più registri devi usare tanti shiftOut quanti sono i registri.

stefa24:
in pratica i byte entrano nel primo 74 e scivolano fino all'ultimo

Immagina 2 treni di 8 vagoni ciscuno che entrano in galleria :slight_smile:
Uno in fila all'altro
I "bit" entrano nel primo per poi uscirne ed entrare nel secondo
Per gli 8 bit della var2 entrano nel primo poi quando parte il secondo shiftout per inviare la var1 quelli che sono gia dentro al primo vengono "spinti" nel secondo
Alla fine nel secondo ci saranno i bit della var2 e nel primo quelli della var1
A questo punto clock e data hanno finito il loro lavoro ed il terzo segnale abilita il trasferimento di quanto infilato dentro alle rispettive uscite
Mi pare che la cosa sia abbastanza elementare , semmai trovo piu' di difficile comprensione la tecnica per scrivere i nostri 16 bit nelle due variabili
Non perche' lo ho pensato io , ma penso che la tecnica di sommare i pesi di 16 var boolean sia la piu' semplice

brunol949:
semmai trovo piu' di difficile comprensione la tecnica per scrivere i nostri 16 bit nelle due variabili
Non perche' lo ho pensato io , ma penso che la tecnica di sommare i pesi di 16 var boolean sia la piu' semplice

A voi servono le funzioni lowByte e highByte per scomporre l'int (mi raccomando di usare il tipo unsigned) nei 2 byte che lo compongono.
http://arduino.cc/en/Reference/LowByte
http://arduino.cc/en/Reference/HighByte

Però leggete il Reference, ci sono spiegate tutte le operazioni sui bit.

leo72:
A voi servono le funzioni lowByte e highByte per scomporre l'int (mi raccomando di usare il tipo unsigned) nei 2 byte che lo compongono.

Io intendevo fare l'opera in 2 for su 2 variabili
Parlo di 16 bit ma perche' sono 16 in tutto
Sicuramente da fare boolean OutL[] e OutH[] per non complicarsi la vita

Scrivevo : tecnica per scrivere i nostri 16 bit nelle due variabili

ciao

Per gli 8 bit della var2 entrano nel primo poi quando parte il secondo shiftout per inviare la var1 quelli che sono gia dentro al primo vengono "spinti" nel secondo
Alla fine nel secondo ci saranno i bit della var2 e nel primo quelli della var1

scusa
ma non è il contrario, prima parte var1 e poi quando parte var2 questo spinge var1

stefano

stefa24:
ma non è il contrario, prima parte var1 e poi quando parte var2 questo spinge var1

I 2 shift sono in catena

ARDUINO ------> 74595/A ---------> 74595/B

Nel /B ci saranno i bit della prima variabile inviata
Nel /A quelli della seconda inviata

Se carichiamo una int e poi la dividiamo in 2 byte come ventilava Leo piu' sopra ci sarebbe da disquisire ma con 2 byte il concetto e quello del /B e /A

@bruno:
sbagli approccio, perché consumare un intero array di boolean per tenere il valore di x bit quando puoi benissimo appoggiarti ad un tipo byte?
Il 165 lo leggi con shiftIn, che legge il registro e restituisce il byte, poi con le operazioni sui bit che ho linkato (le avete viste, vero? bitRead, bitSet, bitClear) modifichi i bit che ti servono e poi spedisci al 595 con shiftOut.

leo72:
@bruno:
sbagli approccio, perché consumare un intero array di boolean per tenere il valore di x bit

Giusto quello che dici perche' alla fine sempre un byte occupano
Ma se la memoria e' sufficente forse diventa piu' esplicito avere una corrispondenza bit interno --> out esterna
Piu' facile da capirsi insomma .. come mappatura immaginado interruttore --> lampadina

In un recente progetto dove ho 2 CN che si scambiano dati i vari flags ( boolean ) li raggruppo in word
Cosi' anziche trasferire 16 byte ne trasferisco 2 e poi ovviamente li scompongo all'arrivo