Ik heb 2 nieuwe ATtiny45 ictjes in mijn bezit. Deze hebben beide op alle ADC-ingangen hetzelfde probleem, dus aan de AVR zal het waarschijnlijk niet liggen(hoop ik tenminste of juist niet, want dan ligt het niet aan mij).

Kort het doel:
Ik wil de ADC testen met een 1K-potmeter, of gewoon een draadje naar een van de voedingsrails. De ADCH-waarde(8bit) moet direct in OCR0A komen. Hiermee wil ik namelijk PWM maken. Later heb ik de ADC namelijk nodig voor een ander projectje.

Wat er werkt:
De PWM aansturing werkt op beide uitgangen. Met een simpele delay en optellen is duidelijk te zien dat een ledje aan het faden is.

Wat er niet werkt:
De led die op de OCR0A-uitgang zit brand heel zwak(0,02-0,08 volt effectief gemeten met een laagdoorlaat filter voor mijn multimeter)in 4 stappen. Dit komt digitaal over met 4 8 12 16. De laagste ingangswaarde is 5mv, de hoogste bijna de voedingsspanning.

Wat ik snap:
De ADC is 10-bits en ik heb om die reden het ADLAR-bitje geset zodat ik in 1 keer 8-bits kan uitlezen via ADCH.

Hier een stukje code:


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

#define F_CPU 8000000UL


int main() {  
	

  	uint8_t new0=0x00;
	
	//clk factory setting is 8MHz prescaler is 8
	//fuse unprogrammed

	//outputs:
	DDRB|=1<<PB0|1<<PB1;//PB0 is for OC0A and PB1 is for OC0B
	PORTB|=1<<PB2;//pullup 
	//ADC init+conf.
	
	ADCSRA|=1<<ADEN|1<<ADSC;//start conversion, clear flag
	ADMUX|=1<<ADLAR;//Read ADCH to get 8bit accuracy. Normaly: first read ADCL (8bit) then ADCH.
	ADMUX= 1<<MUX1|0<<MUX0|0x00;//10 ADC2 (PB4)

	//timer0 is for pwm:

	TCCR0A|=1<<WGM01|1<<WGM00|1<<COM0A1|1<<COM0B1;//fast pwm, 0xff=top, 
	TCCR0B|=1<<CS00;//systemfrequency
	OCR0A=0x80;//dutycyle 50%
	OCR0B=0x10;//dutycyle 50%
	



	while(1)
		{
		
	
		
		//	TCCR0B&=0<<CS00&0xFF;//off
		ADCSRA|=1<<ADSC|1<<ADIF;//start conversion, clear flag
		while(~ADCSRA&1<<ADIF);//flag sets after conversion
		new0=ADCH;
		//	TCCR0B|=1<<CS00;//systemfrequency
	
		OCR0A=new0;
		OCR0B=OCR0B+10;
		_delay_ms(100);
	
		
		}



return 0;
}


Fijn, eindelijk iemand die netjes bitnamen gebruikt. Dat maakt code zoveel beter leesbaar.

Ik zie zo twee problemen:

  • Je gebruikt geen prescaler instelling voor de ADC. Atmel geeft aan dat deze alleen betrouwbaar met volle resolutie werkt tussen de 50 en 200kHz sample rate. Boven de 1Mhz wordt helemaal afgeraden. Zie ook datasheet hfd. 19.5
  • Het ADLAR bitje wordt direct de regel na het setten alweer ongedaan gemaakt.

He bedankt. Ik zie het nu ook, ik ben een streepje vergeten. De prescaler had ik al op elke mogelijke waarde geprobeerd. Even aanpassen.

edit: Hij werkt! Bedankt.