Retardo de tiempo AVR sin bibliotecas de Arduino

2

Intentando descubrir cómo hacer algo como delay () en Arduino, pero solo por el código AVR directo. ¿Cuál es la forma típica de hacer esperas y cosas así en los chips AVR?

    
pregunta Adam Haile

1 respuesta

5

Tienes un par de opciones:

1) Usa una interrupción. La configuración es un poco complicada pero libera tu dispositivo para hacer otras cosas mientras está esperando. Consulte la hoja de datos de su AVR para obtener instrucciones sobre cómo configurar una interrupción. Para demoras mayores que el contador de interrupciones, puede usar un escalador previo u otra variable para contar las interrupciones hasta que se haya producido la espera deseada.

2) Use un NOP en un bucle for para realizar su espera. Según esta página - enlace , una operación NOP toma 1 ciclo de reloj - 1 ciclo de reloj = 1 / frecuencia. A 16MHz, un NOP tomará 62.5nS para ejecutarse. use una variable sin signo largo al definir su contador de bucle para que no se desplace.

Su contador de bucles tendrá este aspecto (la volatilidad garantiza 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á algo de sobrecarga desde el bucle for. Puede determinar esto experimentalmente (fácil) o contando las instrucciones (difícil).

    
respondido por el xyzio

Lea otras preguntas en las etiquetas