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
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'
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.....
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
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
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
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
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
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