Interrupciones y Conversor ADC² En esta clase el alumno aprenderá a utilizar las interrupciones y el uso del nuevo modulo computacional del PIC16F1885. Ing. Ariel Coria INTRODUCCIÓN Hay ocasiones en que los sistemas deben responder ante determinadas situaciones con gran velocidad de respuesta. Ante estos eventos, que necesitan el uso del procesador de manera rápida, se utiliza las interrupciones. El PIC16F18855 introduce un nuevo modulo computacional a la salida del modulo ADC que nos permite tomar los resultados de la conversión y realizar un pos procesamiento de los datos. AGENDA Interrupciones Funciones Flags y Registros Interrupciones Rutina de interrupción ISR Conversor ADC con modulo Computacional(ADC²) Características y modos de funcionamiento Ejemplo de conversión en Múltiples canales Maquinas de estados Uso de maquinas de estados para multiplexar canales ADC Interrupciones Interrupciones Una interrupción es un evento que permite interrumpir el flujo normal del programa para ejecutar una rutina especial que atienda esa interrupción. Existen dos métodos detectar la ocurrencia de un evento Por Polling: Continuo checkeo de la ocurrencia del evento en varios puntos del código Interrupciones: Se interrumpe el flujo principal del programa si el evento ocurre La rutina que atiende dicha interrupción se la llama ISR(Interrup Service Rutine) Las interrupciones pueden ser eventos internos o externos al PIC. Todos los periféricos pueden generar eventos que interrumpan al procesador y algunos pueden despertar el Microcontrolador del modo Sleep o de bajo consumo. Todas las Interrupciones tienen las mismas prioridades Interrupciones - Diagrama //=====Main Routine=========== no interrupt void main (void) { Main program code } //==Interrupt Service Routine== void interrupt isr (void) { Main( ) program execution ISR completed interrupt flag set Interrupt Service Routine (ISR) } Execute ISR( ) Interrupciones - Logica TMR0IE TMR0IF Interrupt INTE INTF IOIE IOIF TMR2IE TMR2IF GIE ADIE ADIF Other peripherals PEIE Interrupciones - Registros Las Interrupciones en el PIC cuenta con un Registro de control el cual habilita de manera global las interrupciones y luego dos sets de registros los cuales uno habilitan las interrupciones de periféricos y los otros contienen los flags indicadores de la fuente de interrupción INTCON: bit 7 GIE bit 0 PEIE Enable Bits Description GIE Global Interrupt Enable PEIE Peripheral Interrupt Enable INTEDG Interrupt Edge Select bit INTEDG Debe estar a uno para utilizar cualquier interrupción Debe estar en uno para utilizar las interrupciones de periféricos Interrupciones - Registros Luego tenemos dos SETs de Registros que habilitan las interrupciones de periféricos y otro que contiene los flags, estos se denominan PIE(Peripheral Interrupt Enable) para la habilitación y PIR(Peripheral Interrupt Request) para los indicadores. PIE0 Register (Peripheral Interrupt Enables) TMR0IE IOCIE INTE PIR0 Register (Peripheral Interrupt Requests) TMR0IF IOCIF Enable Flag Descripción TMR0IE TMR0IF TMR0 Overflow Interrupt Flag bit IOCIE IOCIF Interrupt-on-Change Interrupt Flag bit (read-only) INTE INTF INT External Interrupt Flag bit El PIC cuenta con PIE(0-8) y con PIR(0-8) INTF Salvado del contexto Rutina de Interrupción(ISR) Esta rutina es la encargada de ejecutar las tareas necesarias cuando se produce una interrupción. Lo primero que hace es verificar cual fue la fuente de interrupción, luego ejecuta la acción necesaria y termina borrando el flag de interrupción. void interrupt sample_isr (void) { if (INTF) { //Realizar tareas de la interrupcion externa INTF = 0; } if (TMR2IF == 1) { //Realizar tareas de la interupcion por TMR2 TMR2IF = 0; } if (CCP1IF = 1) { //Realizar tareas de la interrupcion por CCP1 CCP1IF = 0; } } Interrupciones - Ejemplo Conversor ADC² ADC con modulo computacional El Microcontrolador PIC16F18855 es uno de los primeros modelos de micro que incluyen el nuevo periférico ADC² el cual agrega a la salida del conversor AD un modulo de pos-procesamiento por Hardware. Con este modulo podemos calcular el valor medio de las conversiones o generar un filtro pasa-bajos. Los modos de Funcionamiento son: Modo Básico Modo Acumulador Modo Promediado Modo Burst Promediado Modo Filtro Pasa Bajo Además posee un modulo Comparación el cual puede calcular el error a la salida y compararlo con un umbral de valores ajustables. ADC con modulo computacional Sección Comparador Conversor 10-bit ADCALC<2:0> Sección Acumulador ADTMOD<2:0> ADERR ADC Threshold Logic ADRES Set Interrupt flag Error ADFILT Average/Filter Calc. 1 0 ADPSIS ADPREV ADSTPT ADUTHR ADLTHR ADC² Modos de Funcionamiento Modo Básico: Este modo mantiene compatibilidad con los módulos ADC de otros micros, en donde se desactivan las funciones de acumulación y promedio. Si es posible utilizar el comparador en este Modo. Modo Acumulador: En este modo, las conversiones se van acumulando en un registro de 16bits llamado ADACC. Por cada conversión, un registro contador incrementara su valor, el ADCNT(los valores que puede tomar van de 0 a 255 donde se satura). El valor acumulado puede desplazarse a derecha, lo que equivale a dividir por 2 en cada corrimiento. El resultado del desplazamiento se almacena en el registro ADFLTR. Modo Average(Promediado): Es similar al modo Acumulador, en los registros ADAC se acumula las conversiones y en ADCNT se cuenta el numero de conversiones. Cuando el ADCNT(cantidad de conversiones) es igual al registro ADRPT(Repeat Setting Registers) en el registro ADFLTR se almacena el valor promedio. Luego el acumulador y el registro ADCNT se resetean para volver a calcular el siguiente valor. ADC² Modos de Funcionamiento Modo Burst Average: Del mismo modo que el modo promediado, aquí también se calcula el promedio de una cantidad de muestras. A diferencia del modo anterior, aquí un simple disparo genera las cantidades de conversiones de manera automática para alcanzar los datos necesarios y calcular el valor promedio. Modo Filtro Pasa-Bajo: un filtro pasa-bajo permite dejar inalterables las señales cuya frecuencia sea menor a una frecuencia de corte y atenúa las señales que estén por encima de esa frecuencia de corte. El valor del registro ADCRS determina el orden del filtro y la frecuencia de corte se calcula mediante una constante radian con la cual se obtiene una caída de ganancia a -3dB. ADC² Umbrales de Comparación La salida del pos-procesamiento puede configurarse para obtener un valor del Error de Calculo y este valor pasar por un comparador al cual puede configurarse los valores umbrales. Por este modulo pasan los siguientes registros: ADRES: ADC Result register ADPREV: ADC Previous Result register ADSTPT: ADC Threshold Setpoint register ADFLTR : ADC Filter register ADC² Interrupción por comparación El valor del Error de calculo obtenido por el modulo es almacenado en el registro ADERR que luego es comparado por el valor de umbral Bajo y Alto. Según como se configure el modulo, el resultado de la comparación se muestra en el bit ADTIF y si esta habilitado, puede generar una interrupción Conversor ADC² - Ejemplo Maquina de Estados Finita (FSM) Maquina de Estados Finita(FSM) Una Máquina de Estado Finita (FSM = Finite State Machine) se basada en la idea de que hay un número finito de estados para un sistema determinado. Las máquinas de estado requieren una Variable de Estado (State Variable - SV). La variable de estado es un apuntador que mantiene un control del estado en que se encuentra el microcontrolador y dirige el flujo del programa al modulo de software correspondiente. La variable de estado puede modificarse en los módulos (o estados) de software por si misma o por una función externa Partes que componen una FSM Una Maquina de estados Finita están compuesto por las siguientes partes: Estados: Son las diferentes situaciones en las que puede encontrarse el sistema. Entradas: Constituyen los acontecimientos o eventos que producen los cambios de estado. Salidas: Respuesta del sistema ante los cambios en entradas. Funciones de Transición de estado: Descripción detallada, para cada estado, de cuál es el siguiente estado y la salida del sistema, cuando se producen las distintas entradas. Representación de una FSM Las formas de representarlos es por medio de diagramas o grafos de estados. Cada Estado se representa por un circulo. Cada transición se representa por flechas. Según sea la maquina, la salida puede estar definida en el estado o en la transición. More: La salida esta definida únicamente por el estado Mealy: La salida esta definida por el estado y las entradas. E A/ S1 E/S B/ S2 Transición entre el estado A y el B desde una maquina de Moore A B Transición entre el estado A y el B desde una maquina de Mealy Diseño de una FSM Comenzar con el diseño de los estados necesarios del sistema. Luego identificar cual será el primer estado En cada uno de los estados se debe responder la siguiente pregunta: ¿Que condición se necesita para salir de este estado y que estado es el siguiente? Dependiendo de lo que suceda en un estado en particular, la variable de estado se incrementa o decrementa con el objetivo de pasar o saltar al siguiente estado. Una vez definidas las interrelaciones de los estados y las entradas, pasar esto a un diagrama, se puede elegir entre un diagrama de Mealy o Moore. Pasar el diagrama a la implementación en lenguaje C. Implementación en Código C La implementación de una maquina de estados en lenguaje C, es muy fácil ya que se hace uso de la sentencia Switch, el siguiente código muestra como se aplica este concepto: switch (state) { case (STATE0): // Ejecucion Estado 0 break; case (STATE1): // Ejecucion Estado 1 break; case (STATE2); // Ejecucion Estado 2 break; // ... y así continuamos default: state = STATE0 //Si por alguna razón un estado //indefinido ocurre } FSM – Multiplexado ADC Ejemplo Diagrama de Estado – Ejemplo ADC Inicio …/Inicio Conversión Convirtiendo …/Iniciar nueva conversión ADC busy/… ADC Libre/Guardar Resultado Conversión, Multiplexar canal Fin Conversión Diagrama de Estado – Ejemplo ADC switch (state) { case (ADC_STATE_START): // Estado 0 break; case (ADC_STATE_CONVERT): // Estado 1 break; case (ADC_STATE_END_CONVERTION); // Estado 2 break; default: state = ADC_STATE_START //Si por alguna razón un // estado indefinido ocurre } CONSULTAS ariel.coria@mcelectronics.com.ar The Microchip name and logo, the Microchip logo, dsPIC, FlashFlex, KEELOQ, KEELOQ logo, MPLAB, PIC, PICmicro, PICSTART, PIC32 logo, rfPIC, SST, SST Logo, SuperFlash and UNI/O are registered trademarks of Microchip Technology Incorporated in the U.S.A. and other countries. All other trademarks mentioned herein are property of their respective companies.