Haciendo rutinas de retardo variable

2

Sé cómo escribir rutinas de retardo precisas en el ensamblaje para ejecutarse en un microcontrolador PIC. El problema que tengo es crear retrasos de una longitud arbitraria.

Lo que quiero hacer es aceptar algunos datos que me dicen cuánto demorar, y luego el PIC escribirá un puerto alto o bajo durante ese período de tiempo. Entonces, si tengo un retraso de 1 uS y un retraso de 1 ms, puedo dividir los datos y averiguar cuántas veces necesito llamar a cada función. por ejemplo:

0.123567 Segundos significa que llamaría Delay_1uS 567 veces, luego Delay_1mS 123 veces.

El problema es que todas estas llamadas crean demoras propias, lo que significa que habrá un error en el tiempo de demora total.

Para combatir esto, puedo calcular el retraso incurrido de las llamadas y restarlo del tiempo total de retraso. Sin embargo, ahora el número total de llamadas es menor y, por lo tanto, la demora en que se incurre es menor ... Esto parece un problema de optimización recurrente o de tipo que no sé cómo resolver. ¿Existe una forma de "mejor práctica" para hacer esto?

    
pregunta Tim Mottram

2 respuestas

3

Los bucles de retardo son desagradables, y no deberías usarlos muy a menudo.

Las alternativas incluyen temporizadores, interrupciones periódicas y similares.

Dicho esto, en ocasiones son útiles. Asegúrese de cuidar el WDT en algún lugar durante el bucle o podría tener algunos problemas desagradables.

Hay un generador de código en lenguaje ensamblador aquí que genera rutinas de retardo de ensamblaje de ciclo perfecto (tiempo de retardo) fijado en el montaje, no variable).

No hay ninguna razón por la que no pueda crear un generador de retardo programable de ciclo perfecto en ASM, pero creo que sería un poco complejo. Las interrupciones causan imprecisiones, pero a menudo solo necesita garantizar un tiempo mínimo y, si se ejecuta (digamos) 11 ms en lugar de 10 ms, no es un gran problema.

    
respondido por el Spehro Pefhany
0

En realidad, en mi opinión, la mejor práctica sería utilizar un temporizador que genere una interrupción en un ciclo definido y utilice esta interrupción para sus funciones de retardo. Así que usa el temporizador como temporizador de systick

Si tiene que hacer una demora muy precisa, simplemente use el temporizador con un valor de precalificación y coincidencia adecuados.

    
respondido por el TM90

Lea otras preguntas en las etiquetas