Go Down

Topic: programma troppo lento per settare 8 bit (Read 5083 times) previous topic - next topic

erpomata

Certo che puoi ma non puoi settarle contemporaneamente.
Prima setti i pin della PORTA B e poi setti i 2 pin rimanenti della PORTA C

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?

leo72

Con una maschera di bit fatta con un AND binario.
Se fai un AND con 00111111 solo i primi 6 bit vengono considerati, facendo un AND con 11000000 solo gli ultimi 2.
Quindi
Code: [Select]
PORTB = valore & 0b00111111;
PORTC = valore & 0b11000000;

Attenzione che così per cambi tutti pin delle 2 porte.
Se vuoi approfondire, ho scritto un articolo a riguardo


leo72

Sono simili. In entrambi si parla di manipolazione di una porta.

erpomata

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.

leo72

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  ;)

pablos71

#22
Apr 22, 2013, 09:50 am Last Edit: Apr 22, 2013, 10:12 am by pablos Reason: 1

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
Code: [Select]

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 :)


oppure ancora più semplicemente
Code: [Select]
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

L'esperienza è il tipo di insegnante più difficile ....
Prima ti fa l'esame e poi ti spiega la lezione.

ilmandorlone

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

pablos71

#24
Apr 22, 2013, 07:27 pm Last Edit: Apr 22, 2013, 10:10 pm by pablos Reason: 1

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 :)

Quelle istruzioni sono queste qui sotto, che trovi nella libreria Arduino.h ne avevamo discusso qui con MautoTec qui
http://arduino.cc/forum/index.php/topic,152705.msg1152466.html#msg1152466
Code: [Select]
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
L'esperienza è il tipo di insegnante più difficile ....
Prima ti fa l'esame e poi ti spiega la lezione.

Go Up