Sida 1 av 1

Helt omöjligt att få igång ADC (AVR) [löst]

Postat: 7 januari 2010, 02:55:21
av jesse
Jag har ju programmerat AVR förr, och aldrig haft problem med ADC:n, men nu fattar jag inte vad jag har missat. Har hållit på i timmar och lyckas bara inte få ut något. Har fått bekräftat (genom att blinka med en lysdiod) att den verkligen genomför ADC-rutinen och att interruptet för "ADC-ready" utförs.

Jag har en Attiny461.
Vcc är 3.00 volt.
Aref är extern 1.24 volt
Jag har 1.24 volt in på ADC4 ingången.
Jag har en justerbar spänning in på ADC5 ingången, ca 0.80 - 1.80 volt.
(en potentiometer just nu)

Hur jag än gör så blir resultatet från ADCn (dvs. ADCL och ADCH) alltid noll!

Det är nog lite onödigt att ta med hela programmet här, men det som är relevant:

Jag vill göra en differentiell mätning mellan ADC5-ADC4 och ställer sålunda in :

Kod: Markera allt

// globala variabler
....
uint8_t volatile ADC_ready;

// ********* DEFAULTVÄRDEN - ADC  *********
// ADCSRA: enable ADC, Interrupt enable, prescale 1/8
#define ADCSRAset (1<<ADEN) | (1<<ADIE) | (0b011<<ADPS0)
// ADCSRB: mux-kanal
#define ADCSRBset (1<<MUX5) // + GSEL + BIN
// ADMUX: aref=extern, kanal sätts senare (admux4:0)
#define ADMUXset  (1<<REFS0) // external reference
 // MCUCR: sleep enable (för Noise reduction mode)
#define MCUCRset (1<<SE)

#define ADC_KANAL54_1X8X   0b01111

....
/* ADC conversion ready interrupt */
ISR(ADC_vect) {	ADC_ready = 1; }

/* ADC conversion rutin */
int16_t ADCread(uint8_t kanal) {
	int16_t adc;

	ADMUX = ADMUXset | kanal;
	ADC_ready = 0; // nolla flagga
	MCUCR = MCUCRset | (0b01 << SM0); // select noise reduction mode
	sleep_cpu(); //  noise reduction mode: start conversion
	while (!ADC_ready); // vänta
	adc  =  ADCL;
	adc |= (ADCH << 8);
	MCUCR = MCUCRset; // återställ MCUCR
	return adc;	
}

i main:
	 int16_t current = 0;
        ...
	// ********* INITIERING AV ADC  *********
	ADCSRA = ADCSRAset;
	ADCSRB = ADCSRBset;
	ADMUX  = ADMUXset;
	DIDR0  = 0xfe;
	DIDR1  = 0xf0;
	MCUCR = MCUCRset;
	sei();

        ...
	current = ADCread( ADC_KANAL54_1X8X );        /* här blir current alltid 0x0000 */

(Jag har även bytt ut processorn mot en annan utan någon skillnad. Den förra var den som råkade få 9 volt på VCC)

Re: Helt omöjligt att få igång ADC (AVR)

Postat: 7 januari 2010, 05:09:14
av stekern
Du måste väl sätta ADSC i ADSRA för att konverteringen skall starta?

Re: Helt omöjligt att få igång ADC (AVR)

Postat: 7 januari 2010, 09:12:18
av jesse
Det har jag försökt med, och även utan att använda sleep, med samma resultat. Men:
ADC Noise Reduction Mode: If the ADC is enabled, a conversion starts automatically when this mode is entered.
Jag har även försökt med andra differentiella ADC-kanaler, bl.a. ADC4-ADC5 och dubbekollat att det verkligen är rätt pinnar som är anslutna.

Re: Helt omöjligt att få igång ADC (AVR)

Postat: 7 januari 2010, 15:55:38
av stekern
Ja, så står det ju faktiskt.

Och du har kontrollerat att aref är 1.24V?

Vad händer om du kör en "single ended" omvandling på ADC4 eller ADC5?

Re: Helt omöjligt att få igång ADC (AVR)

Postat: 7 januari 2010, 18:54:07
av jesse
Med single conversion får jag en del intressanta resultat:

då får jag ut 0x3ff (1023) som resultat.
Om jag då sätter
ref=vcc funkar det.
ref=1.1v internal funkar det.
ref=1.24 volt external blir det alltid 0x3ff.

Det är 1.24 volt på aref-pinnen ( = pinne 17 = PA3) , kommer från en referenskrets med 1 µF keramisk kondensator som avkoppling.

DDRA = 0x01 och PORTA = 0x01 / 0x00 (lysdioden).

så jag fattar fortfarande inte varför den externa referensspänningen inte fungerar?
Jag har ju bytt krets en gång redan, jag kan ju inte ha pajat exakt samma ingång på båda kretsarna. Det borde inte kunna bli några transienter på den ingången, då matningen för 1.24 volten tas från vcc som är 3.00 volt.

Re: Helt omöjligt att få igång ADC (AVR)

Postat: 7 januari 2010, 19:08:12
av thepirateboy
Sid 192 i databladet kanske, AREF External Voltage Reference Single Ended Conversions: 2.0-AVCC Volt

Re: Helt omöjligt att få igång ADC (AVR)

Postat: 7 januari 2010, 19:20:07
av Moore
Jag vet inte hur det är med processorn du använder man jag är tvungen att sätta, ADATE biten i ADCSRA för att välja en trigger-källa innan ADCn sparkar igång, detta är för en atmega32. Kanske kan vara något sådant du råkat ut för?

Re: Helt omöjligt att få igång ADC (AVR)

Postat: 7 januari 2010, 19:50:24
av jesse
Moore: nejdå, den drar igång...
thepirateboy: - du slog huvudet på spiken! Tack! Jävlar också , det sabbar ju hela min konstruktion! :wall:

I olika datablad står det olika saker:

ATiny261/461/861 Automotive : VREF External Reference Voltage 2.56 - VCC
ATtiny261A/461A/861A: AREF External Voltage Reference : Single Ended Conversions 2.0 - VCC,
Differential Conversions 2.0 - VCC-1.0V


Och i det datablad jag hade laddat ner (en äldre version) för ATtiny261V/461V/861V står det inget om begränsningar i aref!

Attiny 461 är "obsolete" hos atmel nu, den bör ersättas med 461A (vilket inte finns på marknaden än?), men databladet har de uppdaterat 10/09 och då med nya data för AREF, samma som i ditt datablad: minst 2.00 volt.

Det blir att bygga om! :cry: