1. Das ADC-Register sollte unbedingt als 16-Bit-Wert gelesen werden, damit der Zugriff in der richtigen Reihenfolge gemacht wird.
  2. ausserdem ist der Wert darin unsigned.
  3. das Lesen muss atomar erfolgen, da sonst während des Auslesens ein ADC-IRQ auftreten kann, und man dann einen korrupten Wert liest (passiert zwar selten, aber es passiert)

Code:
#include <avr/io.h>
#include <avr/signal.h>
#include <avr/interrupt.h>

uint16_t volatile  adc_wert;

SIGNAL (SIG_ADC)
{
   adc_wert = ADC;
} 

// Lesen:
...
   uint16_t wert;
   uint8_t sreg;
   ...
   sreg = SREG;
   cli();
   wert = adc_wert;
   SREG = sreg;   
   ...