Tratando de descubrir cómo hacer algo como retrasar () en Arduino pero solo para el código AVR directo. ¿Cuál es la forma típica de hacer esperas y cosas así en los chips AVR?
Usted tiene un par de opciones:
1) Usar una interrupción. La configuración es un poco complicada pero libera su dispositivo para hacer otras cosas mientras espera. Consulte la hoja de datos de su AVR para obtener instrucciones sobre cómo configurar una interrupción. Para retrasos mayores que el contador de interrupciones, puede usar un escalador previo u otra variable para contar las interrupciones hasta que se produzca la espera deseada.
2) Use un NOP en un bucle for para realizar su espera. De acuerdo con esta página - http://playground.arduino.cc/Main/AVR , una operación NOP toma 1 ciclo de reloj - 1 ciclo de reloj = 1/frecuencia. A 16 MHz, un NOP tardará 62,5 nS en ejecutarse. use una variable larga sin signo cuando defina su contador de bucle para que no se dé la vuelta.
Su contador de bucle se verá así (volátil asegura que la compilación no optimizará el código):
void delay(unsigned long delay) {
volatile unsigned long i = 0;
for (i = 0; i < delay; i++) {
__asm__ __volatile__ ("nop");
}
}
Editar: habrá algunos gastos generales del bucle for. Puedes determinar esto experimentalmente (fácil) o contando las instrucciones (difícil).
util/delay
(cf. el comentario de
Gorloth ?)strtok()
o malloc()
? ¿ Quieres optimizar un bucle de espera? Creo que si se prefieren o no las interrupciones realmente depende de su aplicación. Muchas veces se necesita una espera de bloqueo, ¿no?
leon heller
Gorloth