Estoy encontrando un comportamiento extraño con mi comparador atmega2560. Aquí está la fuente simple: mi fuente:
#include <avr/io.h>
void init(void);
volatile uint8_t hc = 0;
void init(void) {
ACSR = (1 << ACIE);
ADCSRB = 0x00;
DDRC = 0xFF;
PORTC = 0xFF;
sei();
}
int main(void) {
init();
while (1) {}
}
ISR(ANALOG_COMP_vect) {
PORTC ^= (1 << PINC1);
if (hc == 0) {
PORTC |= (1 << PINC0);
hc = 1;
}
else {
PORTC &= ~(1 << PINC0);
hc = 0;
}
}
AIN0 está conectado a un DAC externo que produce una onda sinusoidal de 27Hz, 3,3 pk-pk. Mi AIN1 está conectado a una fuente de voltaje variable. PINC0 está conectado al alcance para observar la forma de onda digital, PINC1 está conectado a un LED.
Ahora, variando el voltaje en AIN1 de ~ 0-3.3V, espero que la frecuencia en PINC0 sea la misma en todo el rango.
Sin embargo, ese no es el caso. Tengo "puntos ciegos" donde la frecuencia se sale de los gráficos. La forma de onda comienza a flotar, las frecuencias se vuelven aleatorias e impredecibles. Por ejemplo:
Configuré AIN1 a 2.20V, obtengo la forma de onda correcta. Lo puse a 2,30 V y la forma de onda se distorsiona, con una frecuencia variable.
Otra cosa que noté es que el LED parpadea a una frecuencia constante cuando todo funciona correctamente. Pero cuando tengo este comportamiento aleatorio, el LED comienza a parpadear, como si el ISR o la propia MCU comenzaran a tartamudear.
También he confirmado este mismo comportamiento con el modo de captura de entrada con el comparador, continúo obteniendo estos "puntos ciegos" donde todo simplemente se vuelve loco.
Si alguien tiene alguna idea de lo que está pasando, ¿podría ayudarme? Cualquier entrada es muy apreciada.