¿Es posible tener múltiples rutinas ISR para un solo temporizador en el microcontrolador?

3

Tengo dudas de que el microcontrolador sea compatible con múltiples rutinas de interrupción para un solo temporizador.

Por ejemplo, un temporizador único que interrumpe a 5 ms, 10 ms, 1 segundo, etc. En mi diseño, estoy usando 3 temporizadores: un temporizador se interrumpe cada 1 ms para verificar el estado, otros dos a 50 ms y 1 segundo.

Tengo curiosidad por saber por qué no puedo tener un controlador que tenga más de un ISR y también, en lugar de interrupciones en el desbordamiento del temporizador, por qué no puede interrumpir en su período correspondiente.

    
pregunta tamil_innov

4 respuestas

4

Puede haber algunos que tengan esta capacidad, pero la mayoría no. Deberá mantener un recuento de los ciclos transcurridos y delegar a la rutina apropiada desde allí.

    
respondido por el Ignacio Vazquez-Abrams
1

No, pero hay muchos microcontroladores con varios temporizadores, cada uno de los cuales puede lanzar interrupciones en diferentes intervalos.

Por supuesto, cada temporizador necesitará su propia rutina de interrupción. No parece que quieras tratar tu interrupción de 5 ms como si fuera una interrupción de 1 seg., Pero si no estuvieras en ese tipo de arquitectura, todas las rutinas de interrupción pueden tener el mismo código. Eso, por supuesto, usaría algo de memoria de programa adicional, incluso si solo tiene todas las interrupciones, llame a la misma subrutina.

    
respondido por el Scott Seidman
1

Solo puedo hablar por AVR pero sé que el que usé solo tenía 2-3 temporizadores. Pero no veo la necesidad de usar múltiples temporizadores. Solo puede usar uno donde se configuren el valor de preescalador y de comparación del temporizador donde se lance un ISR de comparación de comparación en algún intervalo de tiempo conocido (por ejemplo, cada 1 ms). Luego puede hacer un seguimiento del tiempo y tener una instrucción de cambio para controlar qué acción desea que se realice.

    
respondido por el Wallace
0

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()

    
respondido por el Nick Alexeev

Lea otras preguntas en las etiquetas