#include <avr/io.h>
#include <util/delay.h>
void init(){
// LED output.
DDRB |= 1<<4;
// Turn on ADC on third pin, continuous mode, prescaler 128.
ADMUX |= (1<<MUX0) | (1<<MUX1);
ADCSRA |= (1<<ADEN) | (1<<ADSC) | (1<<ADATE) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0);
}
int main(){
init();
uint16_t adc = 0;
while(1){
adc = (ADCH << 8) | ADCL;
// adc = (adc + 1) & 1023;
// _delay_ms(1);
if(adc > 512){
PORTB |= 1<<4;
}
else{
// PORTB = 0;
PORTB &= ~(1<<4);
}
}
}
Este es el código que tengo en mi ATtiny13A. Hay un LED conectado al pin B4, y un potenciómetro a B3. Se supone que el código enciende el LED si el valor analógico es mayor que 512 (la mitad del máximo de 1024). Sin embargo, no funciona y el LED parece estar desactivado todo el tiempo.
Normalmente, asumo que hay algo mal en la configuración de los periféricos, pero están sucediendo algunas cosas muy extrañas. Por ejemplo, si cambio PORTB &= ~(1<<4);
por PORTB = 0
(que en este caso debería hacer exactamente lo mismo), el código comienza a funcionar mágicamente como se esperaba. Otra cosa que intenté es cambiar el estado de los LED usando un contador simple al descomentar las dos líneas cerca de _delay_ms
, y nuevamente, el LED comienza a parpadear como se esperaba.
El único momento en que este código no funciona es cuando está exactamente en esta forma, por lo que debe haber algún problema con la combinación de lectura de ADC y escritura de bits del puerto de salida.
¿Por qué sucede esto?