Hi Horsty,

manchmal wundere ich mich, mit wie wenig Kommentar man auskommen kann. Bei mir ist das viel mehr Schreibarbeit *kopfschüttel*. Für eine interruptgetriebene ADC-Erfassung auf Kanal ADC3 habe ich diese beiden Routinen in Betrieb. Wenn Du ADC0 haben willst, wird ADMUX entsprechend geändert. Die Angabe der Spannungsreferenz mit REFS2..0 ist sinnvoll, wenn Du nichts angibst, dann gilt nach Datenblatt "... VCC used as Voltage Reference, disconnected from PB0 (AREF) ...". Meine Angabe REFS0 ist kommentiert, genauer stehts im Datenblatt "... External Voltage Reference at PB0 (AREF) pin, Internal Voltage Reference turned off..." - hängt halt mit meiner Controllerbeschaltung zusammen. Für eine genauere Messung habe ich eine "Statistik" und nehme den Durchschnitt (arithmetisches Mittel ā) von 12 Messungen. WENN Du ein 8bittiges Ergebnis möchtest, dann musst Du entsprechend angepasst coden. Die Variablen sind alle extern und volatile deklariert.
Code:
// =================================================================================
// ===  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
            
  adc3_cnt = 0;                 // ADC-Wert wird x-fach aufaddiert
  adc3_tmp = 0;                 // ADC-x-fach-Speicher
}
// =================================================================================


// =================================================================================
// ===  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_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;                
  }      
}           
// =================================================================================
Viel Erfolg

Anmerkung: uuuups - da war Hubert.G wieder schneller