Hoi allemaal,

Ik ben vandaag wat aan het prutsen geweest met een atmega8, en ik krijg de ADC maar niet werkend.
Ik heb alles nu gereduceerd tot een spanningsdeler aan ADC0, voedingspanning aan de AVR, GND en AVCC aan gnd en +5V gehangen. Aref is niet aangesloten.

Nu is dit mijn code:


#include <avr/io.h>
#include <util/delay.h>

int main (void)
{
	DDRD |=	(1<<DDD0)|(1<<DDD1);	//Output on DDD
	DDRC &= 0;			// Input on C
	int value;

	/*while(1)
	{
		PORTD|=	(1<<PD0);
		_delay_ms(500);
		PORTD&= ~(1<<PD0);
		_delay_ms(500);
	}*/
	
	ADMUX |= (1<<ADLAR); //sufficient to read adch (left adjust on) mux3..0 = 0 thus select input0
	ADCSRA|= (1<<ADEN)|(1<<ADPS0)|(1<<ADPS1);//8x prescaling
	ADCSRA|=(1<<ADSC);
	
	while(1)
	{	
		ADCSRA|= (1<<ADSC); //start conversion
		while (ADCSRA & (1<<ADSC));// wacht tot conversie klaar is
		value = ADCH;

		if(value>=125)
			PORTD|=	(1<<PD0);
		else
			PORTD&= ~(1<<PD0);

		PORTD|=	(1<<PD1);
		_delay_ms(500);
		PORTD&= ~(1<<PD1);
		_delay_ms(500);
	}
	return(0);
}

Heeft iemand misschien een idee waar het fout gaat? Want portd0 blijft constant hoog op dit moment. Of heeft misschien iemand code waarvan hij zeker is dat deze werkt? Dan kan ik testen of de AD mss kapot is?

Vriendelijke groet
Tecnicus

Je gebruikt avcc als referentie, dit moet je ook nog aangeven.

ADMUX |= (1<<ADLAR) | (1 << REFS0);

In de datasheet staat dat je ook nog een condensator moet doen aan de aref pin, als je avcc als referentie gebruikt.

[Bericht gewijzigd door Gatze op (37%)]

Hey,

Ik was zo gewend om de adc van een Attiny te gebruiken dat ik niet in de gaten had dat dit hier zo expliciet moet worden aangegeven welke referentie je gebruikt. Maar het werkt perfect nu.
Bedankt!