Función delay _ms();

Con el ejemplo que nos ocupa en esta entrada, generaremos una función Delay () que nos servirá para hacer retardos de tiempo controlado de una manera muy sencilla.

Con ella podremos hacer esperas más precisas que con el bucle for() que hemos usado en el ejemplo del programa Blinky.

Antes del main() generado anteriormente, pega el siguiente código:

volatile uint32_t msTicks;	/* contador de timeTicks cada 1ms  */
 
void SysTick_Handler(void)
{
	msTicks++;	/* incrementa el contador necesario en Delay () */
}
 
__inline static void _delay_ms(uint32_t del)  //función encargada del delay controlado
{
	uint32_t curTicks;
	curTicks = msTicks;
 
	while ((msTicks - curTicks) < del)
	{
		__WFI();
	}
}
 
void setSYSTICK(void)		// Setup Systick!
{
	if (SysTick_Config(SystemCoreClock / 1000))
	{ 							/* Configura el temporizador del SysTick para interrupciones de 1ms  */
		while (1);                                  /* Capture error */
	}
 
	if ( !(SysTick->CTRL & SysTick_CTRL_CLKSOURCE_Msk) );
 
}

Ahora dentro del While() de tu función main() que hemos modificado en el ejemplo del Blinky, sustituye el bucle for() que por la siguiente línea:

_delay_ms(1000);   //delay 1000ms

Como puedes ver, ahora tu led parpadea con una cadencia de 1000ms, o lo que es lo mismo 1Hz :)

LPCXpresso blinky delay

El valor de retardo máximo que podríamos introducir es de 24 bits, así que tendríamos 2^24 = 16.777.216ms de retardo máximo posible. O lo que es lo mismo, casi 5 horas… seguro que es más que suficiente para todo lo que se te ocurra. En caso de querer hacer retardos muy largos (varios segundos), lo ideal sería poner al micro en modo sleep, lo cual disminuiría el consumo, además de ser una buena práctica. Durante el modo sleep podremos capturar eventos por interrupciones y salir del modo dormido… pero eso ya lo iremos viendo más adelante.

Verás que esta función delay() te será muy útil según vayas generando nuevos programas para el microcontrolador. Con una instrucción muy sencilla tendrás una espera bastante precisa.

Un comentario en “Función delay _ms();

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *