¿Qué aportan los periféricos independientes del núcleo (CIP) a una aplicación? Permiten a los usuarios automatizar ciertas tareas que normalmente se ejecutan por la unidad de procesamiento central basándose en instrucciones escritas en el software. Los CIP también reducen la cantidad de código que un desarrollador necesita escribir, mientras crean un sistema más receptivo y de bajo consumo. Este video de Microchip profundiza sobre qué son los CIP, cómo se utilizan y cómo benefician a su proyecto.
Hola, esta vez, Marc McComb examinará más de cerca los principales periféricos independientes.
Es posible que sepa que tanto la arquitectura de los microcontroladores PIC como la de los AVR está cargada de periféricos. Muchos de estos son los que se llaman periféricos independientes del núcleo o CIP. Estos periféricos se desarrollaron para automatizar ciertas tareas que normalmente se ejecutan por la unidad de procesamiento central basándose en instrucciones escritas en el software.
Estos periféricos independientes del núcleo tienen ventajas inherentes como la reducción de la cantidad de código que un desarrollador necesita para escribir, a la vez que ayudan a crear un sistema más receptivo y de bajo consumo. Lo que quiero hacer en este video es darle una idea general de lo que los periféricos independientes aportan a una aplicación.
Para esto, voy a usar un ejemplo muy básico en el que quiero alternar entre un pin de puerto de E/S alto y bajo, por lo que básicamente la creación de una salida de onda cuadrada llama a una señal de latidos cardíacos. Ahora para lograr esta señal de latidos, he escrito un código que cambiará la salida de alto a bajo o de bajo a alto cada vez, a través de un bucle que he mostrado aquí usando este diagrama de flujo.
Ahora permítame añadir otra tarea a esta aplicación. Digamos que cada vez que se presiona un botón pulsador conectado a otro pin en el microcontrolador, queremos potenciar un pulso de salida en otro pin de unos dos milisegundos de ancho, algo así como un multivibrador monoestable o único.
Ahora bien, si tuviéramos un microcontrolador con periféricos rudimentarios, necesitaríamos implementar esta tarea adicional usando interrupciones, que podrían verse así. Aquí estoy usando un periférico de temporizador básico y un puerto de entrada/salida de propósito general conectado al botón pulsador. La mayoría de estos periféricos tienen la capacidad de generar interrupciones comunes que se pueden encontrar en la mayoría de los microcontroladores modernos.
La primera interrupción que voy a usar es una que el periférico de E/S puede generar cuando hay un cambio de tensión en un pin asociado. Así que cuando se presiona el botón pulsador, la tensión del pin baja a cero voltios porque tengo el botón pulsador levantado aquí y se activa una interrupción. Cuando se notifica al núcleo que se ha activado una interrupción de puerto de E/S, pasará por un software o, si el microcontrolador está equipado, por una comprobación de prioridad de interrupción de hardware.
Además, esto asegura que no hay ningún otro evento de interrupción que ocurra simultáneamente y que tenga prioridad sobre esta interrupción de puerto de E/S. Si no es así, entonces el núcleo llama a la rutina de servicio de interrupción de puerto de E/S. Dentro de la rutina de servicio, el núcleo se instruye para reajustar el temporizador, cargarlo a un valor específico para permitir que se desborde a exactamente dos milisegundos y el temporizador comience a contar.
El núcleo también se instruye para elevar nuestro pin de salida. Y esto genera el borde de subida de nuestra señal única. Cuando finaliza la rutina de servicio de interrupción de puerto, el núcleo puede volver a lo que estaba haciendo antes, en nuestro caso, cambiando nuestra señal de latidos cardíacos. Así que el núcleo continúa alternando la señal del latido del corazón hasta que el temporizador se desborde en los dos milisegundos configurados y se active una interrupción, al igual que con la priorización de interrupciones del puerto de E/S en el hardware o software, y hasta que no se realicen otras interrupciones de mayor prioridad, se llama a la rutina de servicio de interrupciones del temporizador.
El núcleo, bajo la instrucción del código, borra y detiene el temporizador y después hace que nuestra señal única sea baja. Así que realmente no hay nada muy complejo sobre este código, pero necesitamos recordar que todos estos pasos llevan tiempo, iniciando desde el evento de interrupción, después de reconocimiento, priorización y finalmente de ejecución de la rutina de servicio de hardware asociada, tiempo en el que el núcleo no es capaz de conmutar nuestra señal de latidos.
Demostremos esto. Yo escribí el código para esta aplicación y lo descargué a un microcontrolador. Tengo un osciloscopio conectado a los dos pines de salida. Esta señal azul es nuestra señal del latido del corazón que se genera en el núcleo, cambiando el pin cada vez a través del lazo. Vea lo que sucede cuando presiono el botón pulsador y activo la interrupción del puerto, puede ver aquí que nuestra señal de latidos del corazón ahora tiene algunos pulsos faltantes justo antes y después del borde ascendente del pulso único y durante un corto período de tiempo antes y después del borde descendente del pulso único.
El botón pulsador está presionado por esta parte. Y este retraso antes del primer borde del pulso único es el resultado de una serie de cosas, incluyendo la latencia de interrupción, que es un término que significa el tiempo que transcurre antes de que el núcleo detecte realmente que se ha producido una interrupción. La mayor parte de este retraso, sin embargo, se debe a nuestra priorización de interrupciones y al código de ejecución real dentro de nuestras subrutinas de interrupciones.
También se puede ver un retraso después de que el pulso único llega a su punto más alto antes de que el núcleo vuelva a conmutar la señal de los latidos del corazón. Vemos que tenemos algunos pulsos más aquí y después el temporizador se interrumpe después de dos milisegundos. Una vez más, después del poco tiempo en el que el núcleo detecta realmente que la interrupción ocurrió, deja de generar la señal del latido cardíaco y luego pasa por la priorización y después salta la rutina de servicio de interrupción del temporizador donde finalmente disminuye nuestro pin único.
Así que esto tan solo es una aplicación básica en la que estamos cambiando una E/S en el software. Pero imagine por un segundo que en lugar de conmutar una señal de latidos cardíacos, ésta tal vez es algún tipo de señal de entrada que el núcleo necesita detectar. Por lo que tal vez sería una entrada de usuario, como un sensor táctil capacitivo o incluso algo más urgente como una señal que detecta el sobrecalentamiento en el sistema o el peligro potencial para el usuario.
En resumen, el núcleo puede estar afuera ejecutando alguna interrupción y perder completamente esa señal, causando al usuario problemas, desde una ligera molestia o incluso algún efecto catastrófico en el sistema. Ahora podríamos minimizar esto aumentando nuestra velocidad de operación para que las interrupciones sean atendidas más rápido por el núcleo, pero recuerde, esto también aumenta nuestro consumo de energía. Además, una operación más rápida solo minimizará esta interrupción en la señal de los latidos del corazón, pero no la eliminará por completo.
También podríamos pedir a nuestro diseñador de aplicaciones que dedique más tiempo a probar la aplicación escribiendo diferentes rutinas de software o configurando los otros componentes del sistema para mejorar la situación. Sin embargo, el tiempo es dinero. Por lo tanto, tener que pasar aún más tiempo escribiendo el código o probando diferentes configuraciones de sistemas secundarios conectados a nuestro microcontrolador podría convertirse en una tarea costosa.
Veamos a una solución alternativa usando periféricos independientes del núcleo. Aquí está el ATTINY817, un dispositivo AVR que tiene, entre otros periféricos, un periférico basado en un temporizador llamado Temporizador/Contador Tipo B o TCB para abreviar y otro periférico llamado sistema de eventos. El periférico del sistema de eventos puede usar un evento generado en algún otro lugar del microcontrolador para activar algún otro evento que ocurra en el mismo microcontrolador.
Así, por ejemplo, si una tensión conectada a uno de los pines de entrada de nuestro comparador supera un umbral predeterminado, la salida del comparador podría configurarse para que fuera alta. Al usar el sistema de eventos, podríamos usar esta salida del comparador para desencadenar una conversión de análogo a digital de una tensión en otro pin.
O tal vez algún cambio de señal externa, por ejemplo, cuando se presiona un botón pulsador conectado a un pin de puerto y activa un contador para empezar a contar. Un contador como el Temporizador/Contador Tipo B de 16 bits o el periférico TCB del ATTINY817 tiene un modo de generación de disparo único que emite un pulso de duración definida por el usuario cuando se activa.
Así que lo que voy a hacer es usar esto para generar nuestra salida única. El puerto de E/S conectado al botón pulsador en nuestro diseño se direccionará usando el sistema de eventos al Temporizador/Contador Tipo B de modo que un cambio en la entrada en ese pin desencadenará esta salida de disparo único. La implementación de estas capacidades en nuestra aplicación tendrá el siguiente aspecto.
Recordemos que el núcleo del microcontrolador se utiliza para conmutar la señal de latidos del corazón en el pin de E/S. Sin embargo, esta vez, en lugar de confiar en las interrupciones en el núcleo para conducir nuestro pulso único, vamos a dirigir el evento de cambio en nuestro pin de puerto conectado al botón pulsador a través del sistema de eventos y conectarlo a nuestro Temporizador/Contador Tipo B para que dispare un pulso de salida durante dos milisegundos.
Como se puede ver en este diagrama de bloques, el núcleo ya está liberado de cualquier tarea asociada con la detección de la pulsación del botón pulsador o la ejecución de la salida única, ya que todo esto se hace en el hardware utilizando las capacidades periféricas. Avancé y programé el ATTINY817 con esta aplicación, así que ahora podemos ver nuestras formas de onda.
Nuevamente, aquí está nuestro pin de E/S de conmutación que controla el núcleo. Sin embargo, esta vez la diferencia es que cuando presiono el botón pulsador conectado a la entrada, el pulso de salida de dos milisegundos que los periféricos manejan en el hardware no tiene ningún efecto en la señal de los latidos del corazón, ya que el núcleo nunca se interrumpe. Manejar tareas en hardware usando periféricos en lugar de software significa que el núcleo ahora puede hacer otra cosa en paralelo, como ejecutar el código para el latido de nuestro corazón o incluso pasar a un modo de menor potencia.
Y lo que es más importante, no solo hemos mejorado la capacidad de respuesta de nuestro sistema al deshacernos del software y de las interrupciones que atan el núcleo, sino que también hemos sido capaces de mantener la velocidad de operación más baja para ayudar con el consumo de energía. Hay algo más que quiero mostrarles. Recuerden que queríamos que el pulso de salida tuviera exactamente dos milisegundos de ancho.
Sin embargo, vea la versión basada en interrupciones de software de esta aplicación. Configuramos el temporizador para que genere una interrupción en dos milisegundos exactamente, sin embargo, con las latencias de interrupción y el tiempo que toma ejecutar el código asociado con las rutinas de servicio de interrupción y así sucesivamente, puede ver que nuestro pulso de salida es en realidad 300 microsegundos más largo de lo que queremos que sea.
Observe nuestra forma de onda usando los periféricos del ATTINY817. Como puede ver, la salida es de dos milisegundos de ancho, donde la queremos, ya que esta tarea se maneja en hardware sin la sobrecarga del software e interrumpe inherentemente la introducción. Esta versión de hardware periférico, fue desarrollada aquí bastante rápido con algunas de las herramientas de programación gráfica de Microchip Technology que presentan los periféricos a un nivel muy alto para facilitar el desarrollo de aplicaciones con microcontroladores PIC y AVR.
Abordaré estas herramientas y más en los siguientes videos. Mientras tanto, para más información sobre estos u otros temas, visite www.microchip.com/8bit. Soy Marc McComb, gracias por vernos.