Ob Dir mein Beispiel unten hilft, weiß ich nicht. Es läuft korrekt, aber eben NICHT auf einem m32 - ausserdem mit 10 bit (daher NICHT mit ADLAR), dummerweise auch noch mit einer Triggersource aus einer "fremden" Interruptquelle. Es sind zwei Bruchstücke: Initialisierung des Ports im main, initialisierung des ADC und die zugehörige ISR.
Code:
/* >> 
  Sicherung 10Okt09 1810   ..\C2\D01-3_40\D01-3_40x23.c
 ===================================================================================
  Target MCU        : ATmega328
...        */

...

// =================================================================================
// ===  HAUPTProgramm ==============================================================
// =================================================================================
                          
  int main(void)          
{                         
...
                          
// Pins/Ports als Ein- (0) oder Ausgänge (1) konfigurieren, Pull Ups (1) aktivieren
//   A = Ausgang, E = Eingang ohne , EU = Eingang MIT PullUp
.....
  DDRC  = 0b01110000;   // PC3 ist ADC3, PC0 .. 6 , kein PC7-Pin bei m168
  PORTC = 0b00000111;   // Beachte für ADC: PC3 ist ADC-Eingang ##>> OHNE Pullup !!
....    
// ================================================================================


----- o ----- o ----- o ----- o ----- o ----- o ----- o ----- o ----- o -----


/* >> 
  Sicherung 15Sep09 2150   .\C2\D01-3_40\D01-3_40_gpd_x21.c ###>>> noch nicht
 ===================================================================================
  Target MCU        : M168
....
 ================================================================================ */


// =================================================================================
// ===  Initialisierung fuer ADC    mega168   MIT Interrupt ========================
//        ADC3/PC3 auf 10 Bit, Wandlung #####>>>>> Interrupt ausgelöst
void ADC3_10_init_irupt(void)   //
{	     
  ADMUX  |= (1<<MUX1)|(1<<MUX0);        // Wandlung mit ADC3 
  ADMUX  |= (1<<REFS0);               // Referenzspannung ist Vcc         doc S 256
  ADCSRA |= (1<<ADATE);         // Auto Triggering Enable           doc S 247 + 257
  ADCSRB |= (1<<ADTS1)|(1<<ADTS0);      // Triggersource = TC0 CmpA       doc S 260
                                // es wird also mit 1/1220 getriggert ca. 0,82 ms
  ADCSRA |= (1<<ADIE);          // ADC Interrupt Enable                   doc S 258
  ADCSRA |= (1<<ADEN);		// AD Enable
  ADCSRA |= (1<<ADSC);	        // starte gleich die erste Wandlung
            
}
// =================================================================================


// =================================================================================
// ===  Nicht unterbrechbare ISR für ADC3 auf Pin 26/PC3/mega168  ==================
// Routine übernimmt ADC-Wert
ISR(ADC_vect)                   // _VECTOR(21)   
{                                 
  adc3_tmp     = ADC;                   // Hole Wert
  adc3_sum     = adc3_sum + adc3_tmp;   //   ADC-Werte aufsummieren
//adc3_sum    += ADC;                   // Werte aufsummieren für Durchschnitt
  adc3_cnt     = adc3_cnt + 1;          // Hochzählen Counter für ISR-Aufruf
                                             
  if (adc3_cnt >= 12)           // Wenn Counter >= x, dann Messwert ausrechnen
  {                             //   Wenn adc3_counter < x, dann keine Aktion
    adc3_dat  = adc3_sum / 12;  // Gemittelten ADC-Wert ausrechnen
    adc3_sum  = 0;              // adc3_sum und Counter rücksetzen
    adc3_cnt  = 1;                
    PORTC ^=  (1<<PC4);         // Zeitmessung: Port PC4 toggeln
  }      
}           
// =================================================================================


// =================================================================================
// =====  ENDE    Subroutinen  =====================================================
// =================================================================================
Viel Erfolg