mal eine zusammengestellte hilfe.

winavr-c-programm:

Code:
#include <stdio.h>
#include <stdlib.h>
#include <avr/io.h>
#include <stdint.h>
#include <string.h>
#include <avr/pgmspace.h>
#include "adc.h"

#define delay_us_(us)  _delayFourCycles_( ( ( 1*(F_CPU/4000) )*us)/2005 )

static inline void _delayFourCycles_(uint16_t z)
{
	uint16_t i;
	
    for (i=0; i<z; i++)
    asm volatile("nop");
}

static inline void delay_ms_(uint16_t z)
{
	uint16_t i;
	
	for (i=0; i<z; i++)
    delay_us_(999);
}	
				
int main(void)
{

uint16_t x=0;
char buffer[7];

ADCinit;
ADCprescaler_16;
//Aktivierung des ADC, festlegen eines Prescalers von 16 
  
while (1)
	{
	ADCchannel_1;
	//Aktivierung des Pins , an ihm soll die zu messende Spannung liegen
		
	ADCstart;
	//Start einer Konvertierung
	
	x=getadc();	
    itoa( x , buffer, 10);
    //routine zum senden an ein display oder RS232 
    delay_ms_(200);
	}
}

die adc.h :

Code:
#define ADCchannel_init   DDRA=0x00                 // ADC Port als Eingang deklarieren
#define ADCinit           ADCSRA|=_BV(ADEN)         // Teilt dem Board mit das der jeweilige Port für ADC verwendet wird
#define ADCdisable        ADCSRA &=~_BV(ADEN)       // machs das vorherige wieder rückgänig
#define ADCstart          ADCSRA|=_BV(ADSC)         // startet eine konvertierung auf dem gewünschten Kannal/Pin
#define ADCfree           ADCSRA|=_BV(ADATE)        // schaltet den freilaufenden Modus ein
#define ADCvintern        ADMUX|=_BV(REFS0)     // interne Spannungsversorgung
#define ADCinterrupt_on   ADCSRA|=_BV(ADIE)                // ADC interrupt wird freigeschalten
#define ADCprescaler_2    ADCSRA |=_BV(ADPS0)              // gewünschter Teilungsfaktor/Prescaler 
#define ADCprescaler_4    ADCSRA|=_BV(ADPS1)
#define ADCprescaler_8    ADCSRA=_BV(ADPS1) | _BV(ADPS0)
#define ADCprescaler_16   ADCSRA|=_BV(ADPS2)
#define ADCprescaler_32   ADCSRA=_BV(ADPS2) | _BV(ADPS0)
#define ADCprescaler_64   ADCSRA=_BV(ADPS2) | _BV(ADPS1)
#define ADCprescaler_128  ADCSRA=_BV(ADPS2) | _BV(ADPS1) | _BV(ADPS0)
#define ADCprescaler_reset ADCSRA = ~_BV(ADPS2) & ~_BV(ADPS1) & ~_BV(ADPS0)        
#define ADCchannel_1                                      //gewünschter Kannal z.B bei ATmega32 PINA0 - PINA7
#define ADCchannel_2      ADMUX|=_BV(MUX0)                // bei nicht freilaufen muss ADCchannel_x vor
#define ADCchannel_3      ADMUX|=_BV(MUX1)                // ADCstart kommen dann kann man mit getadc() der 
#define ADCchannel_4      ADMUX= _BV(MUX1) | _BV(MUX0)    // Adcwert des gewählten Kannals auslesen
#define ADCchannel_5      ADMUX|=_BV(MUX2)
#define ADCchannel_6      ADMUX= _BV(MUX2) | _BV(MUX0)
#define ADCchannel_7      ADMUX= _BV(MUX2) | _BV(MUX1)
#define ADCchannel_8      ADMUX= _BV(MUX2) | _BV(MUX1) | _BV(MUX0)
#define ADCchannel_reset  ADMUX= ~_BV(MUX2) & ~_BV(MUX1) & ~_BV(MUX0)

uint16_t getadc(void)
{
   while (ADCSRA & _BV(ADSC)) {}
   return ADC;
}