Beste mensen

Ik ben bezig met het verkennen van de ADC van een Attiny13, maar nu heb ik een probleem. Ik ben al een hele dag aan het proberen om het ding achtereenvolgens adconversies uit te laten voeren, maar het lukt me niet. De conversie vindt wel plaats als ik de attiny van de voedingsspanning voorzie, maar daarna niet nog steeds weer. PB4 zou de analoge input moeten zijn en bij lage spanning moet PB1 aangaan en bij hogere spanning PB0.

mijn code is als volgt:

//ATTINY 13 pinconnections

#include <avr/io.h>


int main(void)
{
    DDRB=(1<<DDB0)|(1<<DDB1)|(1<<DDB2)|(0<<DDB3)|(0<<DDB4);					//PORTB 0,1,2, is an output 3,4 inputs
	
	PORTB=0;
	
	ADCSRA=(1<<ADEN)|(1<<ADPS0)|(1<<ADPS1);				// activate analog digital converter and set the prescaler to 8														// conversions take to about 1/6000 of a second
	ADMUX=(0<<MUX0)|(1<<MUX1);							// set for adc input 2
	char a,b;
	while(1)
	{	
		ADCSRA|=(1<<ADSC); 								//(re)start ADC conv	
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////		
		// watch adc for brakelight
		while((ADCSRA & (1<<ADSC))!=0); //wait for the adc to complete conversion
		PORTB &= ~((1<<PORTB1)|(1<<PORTB0));
		
		if(ADCL>128)	
		{
			PORTB|=(1<<PORTB0); 	// brakelight
		}		
		if(ADCL>50)
		{		
			PORTB|=(1<<PORTB1);		// backlight
		}
		for(a=0;a!=255;a++)			// delay 
			for(b=0;b!=255;b++);	// delay
        if(PORTB& (1<<PORTB2))
			PORTB&= ~(1<<PORTB2);	// 
        else						//LOOP test led
			PORTB|= (1<<PORTB2);	//
	
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
	}	 
	return(0);  	
}

Ik heb al een extra ledje toegevoegd om te checken of hij wel door de while lus gaat, en dat gebeurd (led wordt getoggeld bij elke keer dat de lus doorlopen wordt)

Ik heb al op internet gezocht en de datasheet al meerdere malen bekeken maar ik krijg het niet juist.

Ik hoop dat jullie kunnen helpen!
Alvast bedankt groet tecnicus

Ook al denk je ADCH niet nodig te hebben, je moet ADCH uitlezen!
Zodra je ADCL uitleest, kan de ADC niets meer in ADCL of ADCH schrijven. Door ADCH uit te lezen, wordt deze barrière opgeheven.

JAAAH!

Dankje het werkt nu! Ik had dat inderdaad ook gelezen en ik heb dat ook geprobeerd, maar ik denk dat ik toen ergens anders in de code nog wat foutjes had zitten, waardoor het toen niet werkte.

Hartstikke bedankt
groetjes Tecnicus

Je doet wel nog wat verkeerd, je leest de least significant bits uit. De ADC is 10 bit, als je maar 8 bit nodig hebt dan moet je de 8 most significant bits uitlezen om je volledige bereik te hebben. (je bereik is anders eigelijk opgedeeld in 4 gedeeltes en je weet nooit in welk deel je zit)

Daarom moet je je resultaat links uitlijnen door de ADLAR (ADC Left Adjust Result) bit te setten:

ADMUX |= (1<<ADLAR);

Op die manier hoef je ook enkel ADCH uit te lezen.
In je code vervang je dan ADCL door ADCH.