ADC no puede leer desde múltiples canales

0

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);
        }
    }
}
    
pregunta sitilge

1 respuesta

1

Creo que el problema es la forma en que establece el valor de ADMUX. Al utilizar | = no puede establecer el valor de un bit en 0, solo en 1. Por lo tanto, cuando desea establecer el valor del bit MUX0 en 0, sigue siendo 1 de la asignación anterior (1 | 0 == 1). Intente configurar cada bit al valor deseado (para esto, puede encontrar montones de tutoriales en línea sobre operaciones bitwise: enlace ).

    
respondido por el Virgil Litan

Lea otras preguntas en las etiquetas