Actualmente estoy ingresando en la programación de AVR y quiero leer dos valores de dos potenciómetros en las entradas analógicas PB3 / ADC3 PB4 / ADC2. Quiero (solo por ahora) encender dos LED (PB1 y PB2) cuando el valor de la entrada analógica está por encima (límite superior arbitrario) 900.
Aquí está el código con el que trato de hacerlo.
#include <avr/io.h>
#include <stdint.h>
#include <util/delay.h>
//1MHz clock
#define F_CPU 1000000
uint8_t channelPB4 = 0x2;
uint8_t channelPB3 = 0x3;
int main(void){
uint16_t resultAdc1 = 0, resultAdc2 = 0;
//ADC enable
ADCSRA |= (1<<ADEN);
//set prescaler to 128 in order to be in recommended range
ADCSRA |= (1<<ADPS1) | (1<<ADPS0) | (1<<ADPS2);
//read value empty
ADCSRA |= (1<<ADSC);
while (ADCSRA & (1<<ADSC) ) {}
//dummy readout
(void) ((ADCH <<8 ) | ADCL);
DDRB |= (1<<PB1) | (1<<PB2);
while(1){
ADMUX = (ADMUX & 0xf8) | channelPB3;
//start conversion
ADCSRA |= (1<<ADSC);
//wait for completion of conversion
while(ADCSRA & (1<<ADSC)){}
resultAdc1 = (ADCH<<8) | ADCL;
ADMUX = (ADMUX & 0xf8) | channelPB4;
//start conversion
ADCSRA |= (1<<ADSC);
//wait for completion of conversion
while(ADCSRA & (1<<ADSC)){}
resultAdc2 = (ADCH<<8) | ADCL;
if (resultAdc1 > 900){
PORTB |= (1<<PORTB1);
}else if(resultAdc1 < 900){
PORTB &= ~(1<<PORTB1);
}
if(resultAdc2 > 900){
PORTB |= (1<<PORTB2);
}else if(resultAdc2 < 900){
PORTB &= ~(1<<PORTB2);
}
_delay_ms(500);
}
return 0;
}
Pero lo que obtengo es que mis LED están encendidos constantemente. Incluso cuando quito el potenciómetro de la entrada analógica y conecto la entrada analógica a tierra. Mi referencia es VCC, por lo que la tierra debe ser 0 en el rango de 0 a 1023.
¿Puedes ver mi error?
ACTUALIZACIÓN: Esquema (lo siento, no está muy ordenado)