I think your problem is in the use of those macros
Have a look at what this "bit set" macro is doing
#define bit_s(p,m) ((p) |= (m))
And then have a look at how its being used.
bit_s (DIDR0, ADC0D);
If we expand the macro we get
DIDR0 |= ADC0D;
The problem here is that ADC0D is defined as the bit position, not the value.
eg, ADC0D is defined as 5 ( bit 5 of DIDR0 )
so you are going
DIDR0 |= 5;
when you really want
DIDR0 |= 32; // 0010 0000
You need to change the macro or how you are calling it.
My syntax knowledge of C macros is limited but you could..
Call it like this..
bit_s (DIDR0, (1<<ADC0D) );
OR, instead, change the macro too..
#define bit_s(p,m) ((p) |= (1<<(m)))
Note: other macros have the same usage problem, not just that one.