El ISR con temporizador variable es bastante fácil de lograr.
Variante 1. Los temporizadores generalmente tienen un registro de cuenta regresiva, que puede ser actualizado por el código. El valor inicial de la cuenta regresiva se puede actualizar dentro del propio ISR caso por caso. Se puede usar una máquina de estados para decidir qué valor inicial se asigna al contador.
Variante 2. Otra opción es configurar el temporizador para la duración más corta y luego contar las interrupciones si necesita una mayor duración. Por ejemplo, necesita hacer 3 cosas diferentes cada 5 ms, 10 ms, 1 s. Configure el temporizador en 5 ms, dentro del incremento de ISR un contador ** cada vez que se llame a ISR. En el bucle main()
, compare el contador con los umbrales. Para una duración de 10 ms, el umbral sería 2, para 1 segundo, el umbral sería 200. Una vez que el contador sea igual al umbral, el main()
hace lo que debe hacerse en ese intervalo.
Una buena cosa de este enfoque es que puede tener un temporizador y un ISR, pero múltiples umbrales (también contadores múltiples, si es necesario). La temporización variable se implementaría en el código, en lugar de en el temporizador de hardware.
Tenga en cuenta que este enfoque requiere un bucle main()
, que siempre realiza un bucle más rápido que el intervalo más corto. También se debe considerar la exactitud del tiempo. Si eso se convierte en un problema, hay variaciones de este patrón, que pueden funcionar con un bucle main()
más lento.
** el contador y las banderas son variables globales visibles tanto para ISR como para main()