20.04.2013 Views

Curso de Microcontrolares Familia HC9S08 ... Artículo ... - Edudevices

Curso de Microcontrolares Familia HC9S08 ... Artículo ... - Edudevices

Curso de Microcontrolares Familia HC9S08 ... Artículo ... - Edudevices

SHOW MORE
SHOW LESS

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 )

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!