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