Mi código en ATtiny13A:
#include <avr/io.h>
#include <stdint.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <stdlib.h>
#include "dbg_putchar.h"
void ADC_init()
{
// Set the ADC input to PB4/ADC2
ADMUX |= (1 << MUX1);
//ADMUX |= (1 << ADLAR);
ADMUX |= (1 << REFS0);
// Set the prescaler to clock/128 & enable ADC
// At 9.6 MHz this is 75 kHz.
// See ATtiny13 datasheet, Table 14.4.
ADCSRA |= (1 << ADPS1) | (1 << ADPS0) | (1 << ADEN);
}
int adc_read (void)
{
// Start the conversion
ADCSRA |= (1 << ADSC);
// Wait for it to finish
while (ADCSRA & (1 << ADSC));
uint8_t low = ADCL; // must read ADCL first - it then locks ADCH
uint8_t high = ADCH; // unlocks both
int ADC_val = (high<<8) | low;
return ADC_val;
}
void wyslij_wynik_pomiaru(int wynik)
{
char str[4];
itoa(wynik, str, 10);
dbg_putchar(str[0]);
if (wynik > 9) dbg_putchar(str[1]);
if (wynik > 99) dbg_putchar(str[2]);
if (wynik > 999) dbg_putchar(str[3]);
dbg_putchar('a');
}
int main(void)
{
DDRB = _BV(1);
dbg_tx_init();
ADC_init();
int wynik_poczatkowy = adc_read();
int wynik_nowy;
while(1)
{
wynik_nowy = adc_read();
if (abs(wynik_poczatkowy-wynik_nowy) > 150) {
wynik_poczatkowy = wynik_nowy;
PORTB |= _BV(1); //turn on ESP8266
_delay_ms(5000);
wyslij_wynik_pomiaru(wynik_nowy); //send data
_delay_ms(5000);
PORTB &= ~_BV(1); //turn off ESP8266
_delay_ms(14900);
}
_delay_ms(100);
}
}
Cuando lees el nivel de voltaje del ADC y es menor que 1023, pero constante, entonces todo funciona correctamente: el bucle IF se ejecuta solo una vez, sin embargo, cuando el nivel de voltaje leído en el ADC es igual a 1023, entonces el IF se ejecuta de forma continua (la condición se sigue cumpliendo, pero no debería).
¿Por qué sucede esto y cómo solucionarlo?