Ya hemos visto como contabilizar periodos de tiempo utilizando el TIMER0 e interrupciones. Sin embargo, la biblioteca avr-libc provee funciones que nos pueden ayudar a la hora de generar tiempos de espera en nuestros programas.
Para comenzar a utilizar los delays de la biblioteca, es necesario incluir la cabecera util/delay.h,
#include<util/delay.h>
Es natural preguntarse entonces, cómo sabe la biblioteca la frecuencia con la que está trabajando el microcontrolador y así entonces generar las funciones de delay. La respuesta es que no lo sabe, y por ese motivo debemos definir la macro F_CPU indicando la frecuencia en Hz a la que se encuentre trabajando el microcontrolador. En el caso del AVR-MT y el ATtiny 2313, la frecuencia es 10 MHz, por lo tanto
//10MHz #defineF_CPU10000000UL
La macro debe ser definida de manera que cuando se incluya la cabecera con las funciones, se sepa la frecuencia, entonces las instrucciones para el preprocesador se escriben en el siguiente orden,
//10MHz #defineF_CPU10000000UL #include<util/delay.h>
Estamos entonces en condiciones de utilizar las funciones de la biblioteca. Las funciones provistas son de prototipo,
void _delay_us(double __us); void _delay_ms(double __ms);
Donde la primera de ellas se utiliza para producir un retraso de __us microsegundos (10^(-6) s), y la segunda produce un retraso de __ms (10^(-3) s).
Hay varias consideraciones a tener en cuenta. La primera es que se recomienda encarecidamente que los argumentos con los que se llame a las funciones sean constantes en tiempo de compilación, de manera que todo el cálculo se haga en dicha fase. De lo contrario, será necesario realizar el cálculo en el microcontrolador en tiempo de ejecución, y peor aún, el tamaño del código se incrementará bastante.
Otro detalle a tener en cuenta es que la funciones en su documentación establecen claramente los límites para los argumentos, dependiendo de la frecuencia del microcontrolador. En el caso de la función _delay_ms, el máximo delay que se puede generar está dado por 262.14 ms / Freq_CPU (en MHz). En nuestro caso, la frecuencia del microcontrolador es 10 MHz, por lo que el máximo delay que puede generar la función _delay_ms es 262.14/10 = 26.214 ms. Si quisieramos generar un delay aproximado de 50 ms, una alternativa sería,
_delay_ms(25); _delay_ms(25);
En el caso de la función _delay_us, el delay máximo está dado por 768 us / Freq_CPU (en MHz).
Teniendo claras las limitaciones y forma de uso de la biblioteca es muy cómodo comenzar a programar utilizando delays, sin la necesidad de atender interrupciones o contar en el propio programa los ciclos necesarios para un delay dado.