programma troppo lento per settare 8 bit

Si ma penso che da quello derivi questo discorso, non so se è il caso di unificarli.
Anche perché in quel topic gli era stato già indicato quel link.

Tutto qui.

Grazie di avermelo fatto notare. Non avevo visto che era stato aperto dalla stessa persona.

@ilmandorlone:
il problema era il seguito di quello trattato nel 1° thread che avevi aperto, continuiamo qui :wink:

ilmandorlone:
e come posso fare?
ho un numero decimale come imposto che i primi 6 bit vengono scritti in B e gli ultimi 2 in C?

se può esserti utile io ho dovuto unire 2 registri come te usando bitread e bitwrite, queste 2 funzioni sono molto semplice e molto veloci sono 2 righe di codice, le puoi trovare nella libreria dell'ide, non ricordo quale (c'è un treadh dove ne discuto negli ultimi 2-3 mesi da qualche parte)
ora devo scappare e non ho tempo di cercare tra i post, sta sera magari se hai bisogno te li cerco

Come vedi scompongo il byte in 8 bit e riscrivo gli stessi valori su 2 PIN del registro PORTJ e 6 PIN del registro PORTH uno alla volta senza alterare lo stato degli altri bit

byte mio_byte; //valore 0-255 che controlla 2 registri

if (bitRead(mio_byte, 0)) bitWrite(PORTH,0,1) else bitWrite(PORTH,0,0);// 17
if (bitRead(mio_byte, 1)) bitWrite(PORTH,1,1) else bitWrite(PORTH,1,0);// 16
if (bitRead(mio_byte, 2)) bitWrite(PORTJ,0,1) else bitWrite(PORTJ,0,0);// 15
if (bitRead(mio_byte, 3)) bitWrite(PORTH,3,1) else bitWrite(PORTH,3,0);// 6
if (bitRead(mio_byte, 4)) bitWrite(PORTH,4,1) else bitWrite(PORTH,4,0);// 7
if (bitRead(mio_byte, 5)) bitWrite(PORTH,5,1) else bitWrite(PORTH,5,0);// 8
if (bitRead(mio_byte, 6)) bitWrite(PORTH,6,1) else bitWrite(PORTH,6,0);// 9
if (bitRead(mio_byte, 7)) bitWrite(PORTJ,1,1) else bitWrite(PORTJ,1,0);// 14

tu se vuoi nel tuo caso puoi usare 2 for uno da 6 e uno da 2, però nelle prestazioni ho notato che il micro è più veloce scrivendo 8 righe di codice piuttosto che 4 col for (+ prestazione ... - flash :slight_smile: )

oppure ancora più semplicemente

bit0=bitRead(mio_byte, 0); bitWrite(PORTH,0,bit0);// 17
bit1=bitRead(mio_byte, 1); bitWrite(PORTH,1,bit1);// 16
...
...
bit8=bitRead(mio_byte, 8); bitWrite(PORTJ,1,bit8);// 14

grazie @pablos.
voglio solo chiederti se come metodo è veloce o rallenta di molto il programma come quando usiamo digitalWrite??

ilmandorlone:
voglio solo chiederti se come metodo è veloce o rallenta di molto il programma come quando usiamo digitalWrite??

direi di si (piuttosto rapido) penso che con l'IDE non ci siano metodi più veleci, forse con l'assembler guadagni ancora qualcosa :slight_smile:

Quelle istruzioni sono queste qui sotto, che trovi nella libreria Arduino.h ne avevamo discusso qui con MautoTec qui

Arduino.h

#define bitRead(value, bit) (((value) >> (bit)) & 0x01)
#define bitSet(value, bit) ((value) |= (1UL << (bit)))
#define bitClear(value, bit) ((value) &= ~(1UL << (bit)))
#define bitWrite(value, bit, bitvalue) (bitvalue ? bitSet(value, bit) : bitClear(value, bit))

value è il tuo Byte e bit il valore 0..7

Io li sto usando con la 2560 su 64 pin con una matrice 8 byte x 8 bit e mi trovo benissimo

ciao