desideravo conoscere, per potermi interfacciare ad un dispositivo esterno, come vengono memorizzati i dati su Arduino Uno.
Es. se assegno un unsigned int il byte + significativo viene posto nell'indirizzo piu' basso di memoria rispetto il byte meno significativo? grazie giorgio
Avr-gcc usa il little-endian pertanto i dati multibyte sono memorizzati col formato msb nel byte con address minore e lsb nel byte con address maggiore.
Esempio pratico, il valore 0x1224 ipotizzando che viene memorizzato a partire dall'address 0x48 della ram viene scritto in questo modo:
add. 0x48 msb ->0x24
add. 0x49 lsb -> 0x12
Però adesso mi devi spiegare a cosa ti serve questa informazione perché è utile solo al fine di manipolazione diretta della memoria tramite assembly o accesso tramite puntatore alla locazione di memoria.
Se il tuo problema è trasferire su un qualche tipo di bus valori multibyte non devi fare altro che scomporli nei singoli byte tramite lo shift a destra oppure con una unione-
Come hai previsto si tratta di una union associata a 4 shiftOut per scrivere
4 byte che compongono una unsigned long (32 bit)
Ho fatto cosi:
Typedef Reg_ union{ Unsigned long u; char unbyte[4];}
Reg_ Reg;
nel codice assegno il valore alla u e poi:
for(n=3; n=0; n--)
ShiftOut(... Reg.unbyte[n]..)
Il datasheet del dispositivo sul quale devo scrivere (AD9951) afferma:
"For MSB first operation, the serial port controller will generate the most significant byte (of the specified register) address first. followed by the next lesser significant bute address until the I/O operation is complete. "
la interpreto che si deve inviare prima il byte + significativo e poi gli altri 3 in ordina di mano significativita'.
Ora vista la tua risposta mi sembra che dovrei scrivere:
for(n=0;n<=3;n++)
ShiftOut(... Reg.unbyte[n]..)
per quanto riguarda i singoli bit il testo e' chiaro e uso il formato MSB, cioe' prima il bit + significativo, ciao giorgio