Tengo un dispositivo en el microcontrolador ATMega16 que se supone que envía constantemente los resultados de las mediciones de ADC a través de USART. El controlador funciona a 16MHz con un cristal externo y el prescaler ADC está configurado a 128. He intentado dos métodos para realizar la conversión de ADC y enviar los resultados.
- El primer método se basa en interrupciones
int main(void) {
...
while (true) {}
}
ISR(ADC_vect) {
USARTSendByte(ADCL);
USARTSendByte(ADCH);
ADCSRA |= 1 << ADSC;
}
- El segundo método se basa en iniciar manualmente la conversión
int main(void) {
...
// main loop
while (true) {
if (adcEnabled) {
ADMUX |= channel;
ADCSRA |= (1 << ADSC);
while (!(ADCSRA & (1 << ADIF))) {
// Do nothing
}
ADCSRA |= (1 << ADIF); // Clear ADIF
USARTSendByte(ADCL);
USARTSendByte(ADCH);
}
}
}
He realizado varias pruebas que consistieron en enviar 32 bloques de 512 bytes (16384 bytes en total) sobre USART y medir el tiempo de transmisión. En el primer caso (interrumpe) el tiempo promedio fue 1623.13ms
. El resultado más pequeño fue 1535 ms y el más grande: 1712 ms. En el segundo caso, el resultado fue 1600.38ms
, que es 22.75ms menos que en el caso anterior, con un resultado mínimo de 1530ms y el mayor resultado de 1679ms.
Entonces, la pregunta es: ¿las interrupciones realmente disminuirán el rendimiento del ADC y por qué sucede eso o los resultados de mis pruebas no fueron concluyentes?