Estoy tratando de conseguir que un simple sensor IR funcione en mi attiny85. Para hacer esto, primero escribí un código para configurar el ADC y para realizar una operación basada en el resultado. Debido a que el código no funcionó como se esperaba, decidí probar si algún código donde simplemente hago una conversión de ADC y luego enciendo un LED funciona. Sin embargo, esto no funcionó. La causa de esto parece ser que el attiny deja de ejecutar código después de la conversión de ADC. Estoy ejecutando el attiny en el reloj interno de 8Mhz y el ADC está conectado a tierra a través de una resistencia de 200 ohmios.
El siguiente código no activa el pin en PB0:
#include <avr/io.h>
#include <util/delay.h>
int main(void) {
DDRB |= _BV(DDB0); //set PB0 to output
ADMUX = _BV(ADLAR) | _BV(MUX1); //set ADC 2, left adjust result
ADCSRA = _BV(ADPS1) | _BV(ADPS2); //prescaler 64
ADCSRA |= _BV(ADEN); //enable ADC
while(1) {
ADCSRA |= _BV(ADSC); //start conversion
while (ADCSRA & _BV(ADSC)); //wait for conversion to end
uint8_t adc_result = ADCH; //adc results (should be 0)
PORTB |= _BV(PORTB0); //set PB0 to high
}
return(0);
}
Cuando yo, sin embargo, pongo el "PORTB | = _BV (PORTB0);" línea al comienzo del bucle, así que antes de la conversión de ADC, la línea se ejecuta y el LED en PB0 se enciende.
También comentando la línea "ADCSRA | = _BV (ADSC);" hace que el código se ejecute bien y hace que PB0 vaya alto. Así que estoy bastante seguro de que la atención de alguna manera se bloquea al ejecutar esa línea.
La desactivación de interrupciones usando "cli ()" tampoco resuelve el problema.