Curso sobre Microcontroladores Familia HC9S08 de Freescale Por Ing. Daniel Di Lella EduDevices www.edudevices.com.ar e-mail: info@edudevices.com.ar Responsable Area Educación ELKO / ARROW www.elkonet.com e-mail: ddilella@elkonet.com Capítulo 4. Entrega Nº 9 Timer / PWM TPM. En las entregas anteriores, se han visto en detalle los aspectos teóricos en el módulo TPM de los HC9S08 en las funciones Timer Overflow, Output Compare, Input Capture y PWM. En la presente entrega se verá una aplicación práctica basada en el MCU MC9S08AW60 contenido en el sistema didáctico EDUKIT08 cuando se utiliza con su placa de personalización PLUGIN_AW. Programa Timer 01 Introducción Llega el momento de tratar el módulo timer 1. Desde el comienzo emplearemos interrupciones con este módulo y lo aplicaremos al destello del LED 1. Dado que es la primera práctica que realizamos con este periférico, trataremos su configuración con el Processor Expert.
El módulo timer 1 El microcontrolador MC9S08AW60 dispone de 2 poderosos timers llamados TPM1 y TPM2. En el EDUKIT08 disponemos del timer 1 para uso interno del programa, en tanto que el timer 2 está vinculado con los pines de PWM. Como consecuencia de lo anterior emplearemos el timer 1 en esta aplicación. Para configurarlo desde el Processor Expert debemos hacer cliq en el recuadro correspondiente: Siempre y cuando nuestro programa se esté valiendo del Processor Expert para inicializar los periféricos. Siendo este el caso surgirá la siguiente ventana que nos permite configurar al timer 1:
El módulo dispone de varias categorías dentro de las cuales podemos citar: Settings: Nos permite elegir entre varias fuentes de reloj para el timer, así como fijar el prescaler y el período en el cual vence la cuenta del timer. Pins: En caso que el timer interactúe con hardware externo, como en la función PWM, puede elegirse el pin con el que se vincula este módulo. Interrupts: Aquí podemos desenmascarar las interrupciones. Lo que buscamos en este ejemplo es producir una interrupción por timer cada 1 segundo. Por lo tanto lo adecuado es buscar una fuente de reloj interna al microcontrolador y nada mejor que el reloj del bus, como señalamos en la figura anterior, bajo el nombre de Clock Source Select. Respecto al prescaler es conveniente que su división sea la mayor posible, pues 1 segundo es un tiempo muy grande para un microcontrolador. También debemos fijar Modulo counter, o sea cuantos pulsos de reloj contará antes de producir una interrupción. Tal vez sea el valor más importante, pues determina el tiempo contado por el microcontrolador. En este programa adoptamos el valor de 39062, que nos arroja un tiempo muy cercano a 1 segundo (en realidad 1,000012 seg.). Por fortuna no debemos enredarnos en cálculos para conocer el tiempo que determina el modulo counter. O la situación inversa, de conocer que modulo counter debe elegirse para arribar a cierto tiempo entre interrupciones. El Processor Expert nos determina ese tiempo en la misma ventana bajo el nombre de Period. Así podemos ir ingresando valores arbitrarios de Modulo counter, y por prueba y error retocando este número hasta obtener el tiempo mas parecido a lo buscado. Respecto a las interrupciones no hay mucho por configurar. Solo podemos decidir si están o no enmascaradas, inclinándonos por lo último para este ejemplo. El Processor Expert nos indica el nombre de la ISR para este periférico, que es isrvtpm1ovf. Es decir interrupción por Timer Overflow. Con ello se completa la configuración, pero permítasenos hacer una aclaración. Observaremos en la ventana de configuración que no es posible deshabilitar al módulo. No existe un bit de TSTOP como si había en la familia HC908. Pero contamos con una forma indirecta de hacerlo. Dejando al timer sin fuente de reloj. Este último puede configurarse desde Clock Source Select. Si abrimos el proyecto Timer01 (que es parte de las númerosas prácticas contenidas en el kit didáctico EDUKIT08 ) encontraremos todas estas opciones ya configuradas.
Descripción del programa Al observar el programa principal, lo encontraremos demasiado simple: _Startup: LDHX #RAMEnd+1 TXS JSR MCU_init Ciclo: BRA ciclo Empezamos cargando el puntero de pila SP y llamamos a la subrutina MCU_init que configura todos los periféricos en particular al timer 1, como ya indicamos. Tras ello el programa queda encerrado en la línea ciclo, o sea colgado. Pareciera como si el programa no cumpliera función alguna. Pero no debemos olvidar que la subrutina MCU_init configuró el timer 1 para que funcione con interrupciones, y salvo que el usuario modifique algo, la subrutina MCU_init siempre desenmascara las interrupciones con la instrucción CLI. En estas condiciones el programa debe ser interrumpido cada 1 segundo y desviar su ejecución a la línea: is tpm1ovf: LDA TPM1SC BCLR TPM1SC_TOF,TPM1SC LDA LED1_PORT EOR #LED1_MASK STA LED1_PORT RTI
Lo primero que debe hacer esta subrutina es atender la interrupción de timer, de otro modo saltaría indefinidamente. No ya cada 1 segundo, sino cada vez que salimos de ella. Este comportamiento no es el buscado y se debería a un mal uso del periférico. Para atender la interrupción de Timer el fabricante nos exige cumplir 2 pasos: Leer el registro TPM1SC. Poner a 0 el bit TOF del registro TPM1SC. De igual forma al procedimiento para atender las interrupciones de timer en la familia HCS08. Luego de esto cambiamos el estado del LED 1 mediante una operación XOR. Requiere esto definir una máscara para aplicar una operación XOR sobre el pin PTA4. LED1_PORT EQU PTAD LED1_MASK EQU $10 Por último retornaremos de la interrupción y al próximo segundo, esta rutina volverá a ejecurarse. Modo de correr el programa. Lo aconsejable en este programa es colocar un Breakpoint al comienzo de la ISR. is tpm1ovf: LDA TPM1SC Ejecutamos el programa y alcanzaremos a la línea anterior. Seguimos ejecutando el programa instrucción por instrucción hasta que veamos que el LED 1 cambia de estado. Llegados a esta situación volvemos a correr el programa y repetir todo el procedimiento. Continuará... Nota de Redacción: El lector puede descargar este capítulo y capítulos anteriores del curso desde la sección Artículos (Curso_HC9S08) en el sitio web de EduDevices (www.edudevices.com.ar )