El problema es que no puedo leer desde varios canales ADC (atmega8-au). El código funciona bien si solo se usa un canal, por ejemplo. ADC0
, sin embargo, si se utiliza el segundo canal ADC1
, el valor de readADC1
es igual a readADC0
.
¿Qué debo hacer para solucionar el problema? ¿Podría estar relacionado con restablecer los ADMUX
bits?
El código relacionado:
#include <avr/io.h>
unsigned int threshold = 900;
volatile unsigned int sensor_left = 0;
volatile unsigned int sensor_center = 0;
volatile unsigned int sensor_right = 0;
void init()
{
DDRD |= 1 << PORTD0;
DDRD |= 1 << PORTD1;
ADCSRA |= (1 << ADEN);
ADCSRA |= (1 << ADPS2) | (0 << ADPS1) | (0 << ADPS0); //1MHz / 16 = 62.5kHz
}
unsigned int readADC0()
{
ADMUX |= (0 << REFS1) | (1 << REFS0);
ADMUX |= (0 << ADLAR);
ADMUX |= (0 << MUX3) | (0 << MUX2) | (0 << MUX1) | (0 << MUX0);
ADCSRA |= (1 << ADSC);
while (ADCSRA & (1 << ADSC));
return ADC;
}
unsigned int readADC1()
{
ADMUX |= (0 << REFS1) | (1 << REFS0);
ADMUX |= (0 << ADLAR);
ADMUX |= (0 << MUX3) | (0 << MUX2) | (0 << MUX1) | (1 << MUX0);
ADCSRA |= (1 << ADSC);
while (ADCSRA & (1 << ADSC));
return ADC;
}
int main(int argc, char* argv)
{
init();
while (1) {
sensor_left = readADC1();
sensor_center = readADC0(); //false results if enabled
if (sensor_left < threshold) {
PORTD |= 1 << PORTD0;
} else {
PORTD &= ~(1 << PORTD0);
}
if (sensor_center < threshold) {
PORTD |= 1 << PORTD1;
} else {
PORTD &= ~(1 << PORTD1);
}
}
}