It means that the memory is organized in multiple of 8bits and that the cpu can get one frommemory byte at a time, two bytes at a time or four bytes at a time.
Actually, in the case of the dsPIC because the data memory bus is 16 bit wide to move around 32bits it has to do it in two steps, 16 bit at a time... but the instruction set support a single instruction to do that
so you have
MOV.B that will move 8bits to/from, in a single cycle
MOV that will move 16bits to/from, in a single cycle
MOV.D that will move 32bits to/from, in two cycles (slightly different than doing two 16bit MOVs)
does it mean it can't get 9bits? No, not natively. In fact, it can get 9 bits, but it's more complicated.
The nine bits will be inside a 16bit block (hopefully aligned to an even address so they can be loaded/stored with a single MOV) they will be loaded, they will be rotated so the LSB is at bit0, they will be masked to gt rid of the unnecessary data, the operation will be performed on them, they will be masked again, they will be rotated back to their original position and they will be stored back.
wooooah, that sounds incredibly tedious to do every time! yeah, but you have a C compiler that will do that for you.
this is what already happens every time you modify a multi-bit parameter in the peripheral registers.
LATAbits.LATA5 = 0
well this can be translated in much more efficient contructs, the dsPIC can modify single bits in every register so all of this gets optimized to
BCLR LATA,#5
but this
if (AD1CON1bits.CHS == 5)
will execute as i said before
so how do you do that?
the C language helps you! read up on bitfields in C
union {
struct {
unsigned singlebit:1;
unsigned multibit:7;
};
unsigned char singlebyte;
} bitfield;
will create a bitfield variable where you can access the one bit field, the 7bit field, the whole byte variable