Tengo dudas de que el microcontrolador admita múltiples rutinas de interrupción para un solo temporizador.
Por ejemplo, un solo temporizador que interrumpe a los 5 ms, 10 ms, 1 s, etc. En mi diseño, estoy usando 3 temporizadores: un temporizador interrumpe cada 1 ms para verificar el estado, otros dos a los 50 ms y 1 s.
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 coincidencia de período.
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 adecuada a partir de ahí.
No, pero hay muchos microcontroladores con múltiples temporizadores, cada uno de los cuales puede generar interrupciones en diferentes intervalos.
Por supuesto, cada temporizador necesitará su propia rutina de interrupción. No parece que quiera tratar su interrupción de 5 ms como una interrupción de 1 s, pero si estuviera totalmente decidido a ese tipo de arquitectura, todas las rutinas de interrupción pueden tener el mismo código. Eso, por supuesto, consumiría algo de memoria de programa adicional, incluso si solo tiene todas las interrupciones llamando a la misma subrutina.
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. Simplemente puede usar uno donde el preescalador del temporizador y el valor de comparación están configurados donde se lanza un ISR de coincidencia de comparación en algún intervalo de tiempo conocido (cada 1 ms, por ejemplo). Luego puede realizar un seguimiento del tiempo y tener una declaración de cambio para controlar qué acción desea realizar.
El temporizador ISR con período variable es bastante fácil de lograr.
Variante 1. Los temporizadores suelen tener un registro de cuenta atrás, 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 estado para decidir qué valor inicial asignar 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 duración más larga. Por ejemplo, debe hacer 3 cosas diferentes cada 5 ms, 10 ms, 1 s. Establezca el temporizador en 5 ms, dentro del ISR incremente un contador** cada vez que se llame a ISR. En el main()
bucle, compare el contador con los umbrales. Para una duración de 10 ms, el umbral sería 2, para 1 s, el umbral sería 200. Una vez que el contador es igual al umbral, hace lo main()
que debe hacerse en ese intervalo. Lo bueno de este enfoque es que puede tener un temporizador y un ISR, pero varios umbrales (también varios contadores, si es necesario). El tiempo variable se implementaría en el código, en lugar de en el temporizador de hardware.
Tenga en cuenta que este enfoque requiere unmain()
bucle, que siempre se repite más rápido que el intervalo más corto. También se debe considerar la precisión del tiempo. Si eso se convierte en un problema, existen variaciones de este patrón, que pueden funcionar con un main()
ciclo más lento.
** el contador y las banderas son variables globales visibles tanto para ISR como paramain()
akohlsmith
tamil_innov
akohlsmith