Ho trovato una cosa brutta sparsa nel codice
digitalWrite(14,LOW); ////Set ADC port low
digitalWrite(15,LOW);
digitalWrite(16,LOW);
Conviene usare
digitalWrite(A0,LOW); ////Set ADC port low
digitalWrite(A1,LOW);
digitalWrite(A2,LOW);
perché altrimenti il codice non è portabile tra diversi tipi di Arduino.
Poi, all'inizio definisci
#define ADC_DDR DDRC //ADC port data direction register
e poi nel codice usi direttamente DDRC.
Perchè? :~