Descubra las nuevas características ATtiny 817, el nuevo microcontrolador de Microchip, y descubra cómo puede usar esta solución rica en características para sus aplicaciones.
Manejo de interrupciones en el nuevo ATtiny817
Escrito por: Arild Rodland, marketing de productos para la división MCU08 de Microchip Technology Inc.
El manejo de interrupciones se volvió mucho más inteligente en los nuevos microcontroladores (MCU) de AVR® y el ATtiny817 de Microchip es el primer dispositivo AVR en aprovechar estos cambios.
Las personas familiares con las distintas familias de AVR deben saber que, tradicionalmente, el manejo de interrupciones para dispositivos tinyAVR® y megaAVR® ha sido muy simple, ya que todas las interrupciones tienen una prioridad predefinida, en la que la dirección de vector de interrupción más baja tendrá la mayor prioridad. Para la familia de MCU XMEGA® MCU, el sistema de interrupción cuenta con un controlador programable de niveles múltiples (PMIC), lo que permite al usuario asignar interrupciones a tres niveles de prioridad, lo que hace posible diseñar la cola de prioridades.
El nuevo controlador de interrupción del ATtiny817 es una combinación de los dos. Examinémoslo y descubramos sus novedades.
Prioridad de interrupción
La configuración predeterminada de ATtiny817 se definirá con una tabla de vectores de interrupción con prioridad estática, en la que la dirección de vector de interrupción más baja tendrá la mayor prioridad. Vea la Figura 1. Esto es idéntico a otros tinyAVR.
FIGURA 1: PRIORIDAD DE INTERRUPCIÓN CON ESQUEMA DE PRIORIDAD ESTÁTICA
Existen algunos posibles problemas con la prioridad estática. Primero, si tiene muchas interrupciones con alta prioridad, puede tener una situación en la que una interrupción de alta prioridad bloquea constantemente las interrupciones de baja prioridad. El resultado es un agotamiento de interrupciones. Esto significa que no tiene suficiente tiempo para prestar servicio a todas las interrupciones, y las de menor prioridad jamás recibirán servicio. Para corregirlo, ATtiny817 permite un esquema de prioridad dinámico de turnos rotativos. Si habilita este esquema de turnos rotativos, la última interrupción en recibir servicio recibirá la menor prioridad la próxima vez que ocurra una interrupción. Ver figura 2.
FIGURA 2: ESQUEMA DE PRIORIDAD DINÁMICO DE TURNOS ROTATIVOS
Controlador de interrupción de dos niveles
El esquema de prioridad de turnos rotativos resuelve el agotamiento de interrupción, pero ¿que debe hacer si quiere darle una mayor prioridad a un periférico que la definida en la tabla de vector de interrupción?
Aunque el equipo de diseño definió una prioridad programada muy razonable entre los periféricos, comprendemos que siempre existe la posibilidad de que alguien necesite dar una prioridad de interrupción más alta de lo que está definido por la prioridad de interrupción predeterminada.
En ATtiny817, tenemos la opción de elevar un vector de interrupción seleccionable para que tenga prioridad por sobre todos los otros. Para usar esta características, simplemente escriba la dirección de vector deseada en el registro LVL1VEC y esta interrupción tendrá prioridad.
Tabla de vector compacta
TinyAVR tiene una nueva característica llamada Compact Vector Table (CVT). Esta característica truncará todas las interrupciones en tres vectores. Uno para las interrupciones no enmascarables (para ATtiny817: interrupción de error CRC), uno para todas las interrupciones Level0 (para ATiny817: todas las interrupciones son level0 de forma predeterminada) y uno para interrupciones level1 (para ATtiny817: una interrupción individual puede recibir una mayor prioridad al ingresar su dirección de vector en el registro LVL1VEG).
Esta característica puede ser útil cuando solo usa unas pocas interrupciones. Reducir la tabla de vector a solo tres vectores significa que la tabla de interrupción ocupará menos ubicaciones Flash, lo que esencialmente libera este espacio para su uso para el código de usuario. Sin embargo, tenga en cuenta que si usa este enfoque deberá agregar código adicional en el manipulador de interruptor para descubrir qué interrupción está solicitando servicio. Esto agregará tiempo, tanto para la escritura de código y la prueba de verificación, para completar su diseño. Por este motivo, la tabla de vector compacta es más útil si solo se usan unas pocas interrupciones.
Característica avanzada: si los turnos rotativos no están habilitados, el registro LVL0PRI seguirá activo y definirá el punto de inicio para la interrupción de prioridad más baja, así que si lo desea, puede cambiar la prioridad de forma estática en la tabla de vector. Por ejemplo, puede cambiarla para darle la mayor prioridad a USART. El valor predeterminado de este registro es 0x00, así que después de resetear, el vector de interrupción más bajo tendrá la mayor prioridad, tal como se espera.
Cambiar la prioridad de la tabla de vector
Terminaré este artículo con un truco/característica que no se menciona explícitamente en la hoja de datos. Cuando use la prioridad de turnos rotativos, hay un registro llamado LVL0PRI que contiene todas las direcciones de la última interrupción ejecutada. Esta será la interrupción con la menor prioridad al seleccionar cuál interrupción ejecutar a continuación. Si cambiamos este valor, afectaremos directamente qué interrupciones tienen la más baja y más alta prioridad.
Como se muestra aquí, el nuevo MCU ATtiny187 ofrece potentes características de administración de interrupción que permiten a los diseñadores para controlar la prioridad de interrupción y el tiempo de respuesta para que se ajusten a sus requisitos de diseño. Ahora la única pregunta es, ¿qué creará para aprovechar estas capacidades?