Helt omöjligt att få igång ADC (AVR) [löst]
Postat: 7 januari 2010, 02:55:21
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 :
(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)
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 */