Hallo,

Mein code funktioniert einfach nicht. er ist aus den avr-gcctutorial von mikrocontroller.net abgewandelt.
Der wert der herauskommt ist vermutlich nicht null, nicht größer null und nicht kleiner null
Der Code ist in 3 dateien zerlegt. Programieren tu ich mit Kontrollerlab, hab den aktuellen avr-gcc, mein AVR ist ein Mega 16 mit 14,.... mhz. F_CPU wird von Kontrollerlab definiert und muss nomit nicht im programm stehen.

pinbelegung.h:
Code:
#include <avr/io.h>

void initavr(void) {

	DDRD = 0xF0;
	DDRB = 0xE3;

}
adc.c:
Code:
#include <avr/io.h>
#include <util/delay.h>    // definiert _delay_ms()

void adcstart(void);
void adcstop(void);

void adcstart(void) {
	ADCSRA |= ((1<<ADPS0) | (1<<ADPS1) | (1<<ADPS2) | (1<<ADEN));//ADPS0-2(Vorteiler 128), ADEN (Enable)
	uint8_t kanal = 0;
	ADMUX = kanal;
	ADMUX |= (1<<REFS1) | (1<<REFS0);
	
	ADCSRA |= (1<<ADSC);              	// eine ADC-Wandlung als Dummy zum warmlaufen
	while ( ADCSRA & (1<<ADSC) ) {
	;     					// auf Abschluss der Konvertierung warten 
	}
}

void adcstop(void) {
	ADCSRA &= ~(1<<ADEN);
}

uint16_t adcget(uint8_t kanal) {
	uint8_t i;
	uint16_t ergebnis = 0;

	ADMUX = kanal;            		// Kanal waehlen
	ADMUX |= (1<<REFS1) | (1<<REFS0);	// interne Referenzspannung nutzen 

	ADCSRA |= (1<<ADSC);			// eine Wandlung "single conversion"
	while ( ADCSRA & (1<<ADSC) ) {
	;  					 // auf Abschluss der Konvertierung warten
	}

	    ergebnis=ADC;
	return ergebnis;
}
adc_test.c (Mit main schleife):
Code:
#include <avr/io.h>
#include <util/delay.h>    // definiert _delay_ms()
#include "pinbelegung.h"

uint16_t adcwert = 0;

int main(void)
{
	initavr();
	
	adcstart();
	PORTB |= (1<<PB7) | (1<<PB5) | (1<<PB6);
	
	for(;;) {
		adcwert = adcget(0); // MUX-Bits auf 0b0000 -> Channel 0 
		//adcwert = adcget(2); // MUX-Bits auf 0b0010 -> Channel 2 
		
		if (adcwert==0) {
			PORTB |= (1<<PB7);
		}
		
		else if (adcwert<0) {
			PORTB |= (1<<PB5);
		}
		else if (adcwert>800) {
			PORTB |= (1<<PB6);
		}
		else {
			PORTB &= ~((1<<PB5) | (1<<PB6) | (1<<PB7));
		}
		_delay_ms(100);
	}
	return(0);
	adcstop();
}
Frohe Weihnachten
Thomas