miércoles, 26 de junio de 2013

TEMPORIZADORES

Los temporizadores nos permiten controlar el paso del tiempo en el sistema. Existen dos tipos de temporizadores:

  • Timers: entre otras cosas permiten:
    • Generar eventos transcurrido un determinado tiempo. En consecuencia nos permiten generar interrupciones.
    • Medir intervalos de tiempo. Nos permiten medir el tiempo transcurrido entre dos eventos consecutivos.
    • Generar señales digitales como PWMs.
  • Watchdog: es un temporizador específico que permite:
    • Controlar bloqueos software. Útil para generar un reset (PUC) tras la expiración del tiempo del temporizador.
    • Generar eventos y en consecuencia provocar interrupciones transcurrido un determinado intervalo de tiempo.

La familia MSP430 presenta dos tipos de timers: tipo A y tipo B. Ambos son equivalentes, aunque los del tipo B son algo más versátiles puesto que ofrecen algunas características adicionales que no ofrecen los del tipo A. En el caso del MSP430G2553 existen dos timers tipo A:
  • Timer0_A3.
  • Timer1_A3.
Desde el punto de vista del diagrama de bloques, cada timer está compuesto por varios elementos básicos:
  • Contador: encargado de realizar la cuenta. Cuenta flancos de subida de una señal de reloj, donde ésta se puede seleccionar con los bits de unos registros. El valor de la cuenta también se almacena en un registro.

Registros utilizados con los temporizadores (analizamos el Timer0_A3, el Timer1_A3 presenta las mismas características):
  • TA0R (Timer_A Register).
    • Son registros de 16 bits donde se almacena el valor de la cuenta.
    • El valor de ese registro se incrementa/decrementa por cada flanco de subida de la señal de reloj.
    • El que se incremente o decremente la cuenta depende del modo de operación que se elija (stop, up, continuous, up/down).
    • Se trata de un registro de lectura/escritura.
    • En caso de desbordamiento (cuando la cuenta llega a 0xFFFF o 0x0000 y se incrementa o decrementa respectivamente) puede generar una interrupción. 
  • TA0CCR0, TA0CCR1, TA0CCR2 (Timer_A Captura/compare).
    • Nos permite establecer un límite en la cuenta.
  • TA0CTL (TACTL Timer_A Control).
    • El bit TAIFG se pone a 1 cuando ocurre un desbordamiento en la cuenta el registro TAR, es decir se llega a 0x0000 o 0xFFFF. Al ser el registro TA[0|1]R de lectura escritura, podemos poner 0x0000 o 0xFFFF en dicho registro. Si se hace manualmente, este flag no se activa.
    • Los bits TASSEL0 y TASSEL1 nos permiten determinar cuál va a ser la señal de reloj con la cual va a trabajar el microcontrolador:
      • 00 ==> TACLK.
      • 01 ==> ACLK.
      • 10 ==> SMCLK.
      • 11 ==> INCLK.
    • Los bits ID0 e ID1 nos permiten dividir la frecuencia de la señal que se seleccione con los bits TASSEL0 y TASSEL1:
      • 00 ==> /1.
      • 01 ==> /2.
      • 10 ==> /4.
      • 11 ==> /8.
    • Los bits MC0 y MC1 nos permiten determinar el modo de operación, es decir, la forma en la cual el temporizador realiza la cuenta. Se tienen los siguientes modos:
      • 00 ==> modo parado (STOP).
        • Contador (registro TA0R) detenido. Si se cambia el modo de operación, el contador empieza a contar (en forma ascendente o descendente) a partir del valor de la cuenta en la cual se quedó, es decir trabajar en este modo de operación no implica modificar el registro TAR. 
      • 01 ==> modo ascendente (UP).
        • El contador cuenta a través del registro TAR desde 0 hasta el valor almacenado en el registro TA0CCR0. Tras esto la cuenta se reinicia.
        • Cuanta TA0CCR0+1 ciclos de reloj.
        • Cuando se llega al final de la cuenta (TA0CCR0), se activa el flag CCIFG del registro TA0CCTL0. La interrupción se genera cuando la cuenta cambia del valor TA0CCR0 a 0.
        • Al utilizar el registro TA0CCR0 para el funcionamiento, no se puede utilizar para otras funcionalidades.
        • Si se selecciona el modo UP cuando TAR > TA0CCR0, TAR se pone a 0 de forma automática.
      • 10 ==> modo continuo (COUNTINUOUS).
        • En este modo de operación, el registro T0AR cuenta desde 0x0000 hasta 0xFFFF que es el valor máximo del registro TA01.
        • Se cuentan 0x10000 = 65536 ciclos de reloj.
        • En este caso no se utiliza el registro TA0CCR0 y por tanto se puede usar para otras funcionalidades.
        • Se genera una interrupción cuando la cuenta pasa de 0xFFFF a 0x0000.
        • Cada vez que la cuenta alcanzar el valor TA0CCR0, TA0CCR1 o TA0CCR2, se genera una interrupción CCIFG, donde CCIFG es un flag del registro TA0CCTL0, TA0CCTL1 o TA0CCTLL2, función de cuál sea el registro TA0CCRx que se active.
      • 11 ==> modo ascendente/descendente (UP/DOWN).
        • El registro TA0R cuenta repetidamente desde 0 hasta el valor almacenado en el registro TA0CCR0 (cuenta ascendente) y de nuevo a 0 (cuenta descendente).
        • Se cuenta dos ciclos de la señal de reloj.
        • Al utilizar el registro TA0CCR0 para su funcionamiento, dicho registro no se puede utilizar para otras funcionalidades.
        • Ojo porque la interrupción en modo descendiente se genera cuando la cuenta pasa de 0x0001 a 0x0000, es decir contamos primero ascendentemente hasta el valor de TA0CCR0 y luego descendentemente hasta 0x0001. Cuando se pasa a 0x0000 se genera la interrupción y de nuevo se vuelve a contar ascendentemente.
    • El bit TACLR nos permite inicializar el contador:
      • Inicializa la cuenta a 0 escribiendo 0x0000 en el registro TAR.
      • Acto seguido el bit TACLR se pone a 0 automáticamente.
      • En caso de que el modo de operación seleccionado sea ascendente/descendente, inicializa la cuenta a ascendente.
      • La cuenta también se puede inicializar a un valor determinado escribiendo dicho valor en el registro TA0R.
  • Activación y desactivación del contador.
    • El contador comienza su funcionamiento si se cumplen todas las condiciones siguientes:
      • La señal de reloj fuente está activa.
      • El modo de operación no es STOP (MC0 = 0 y MC1 = 0).
      • En el modo de operación ascendente o ascendente/descendente, el valor del registro TA0CCR0 es distinto de 0x0000.
    • El contador detiene su funcionamiento cuando se cumple alguna de las siguientes condiciones:
      • La señal de reloj fuente está inactiva.
      • El modo de operación está parado.
      • En el modo de operación ascendente/descendente, el valor del registro TA0CCR0 es 0x0000.
  • Consideraciones sobre el contador.
    • Al detener el contador se mantiene el estado actual del mismo, de forma que al reanudar su funcionamiento continúa su operación a partir de dicho estado.
    • Si se detiene el contador escribiendo el valor 0x0000 en el registro TA0CCR0, al reanudar el funcionamiento cambiando el valor de dicho registro, se inicializa la dirección de la cuenta a ascendente en el modo de operación ascendente/descendente.
  • Cambio de configuración.
    • Antes de modificar la configuración del contador es recomendable detener el timer para evitar operaciones erróneas. Para detener el timer se tienen varias alternativas como hemos visto antes.
    • Si se realiza la modificación sin parar el timer se tienen las siguientes consecuencias:
      • Si se trabaja en modo ascendente: TAR > TA0CCR0 ==> TAR se inicializa a 0x0000.
  • Bloque comparador: compuesto por dos subsistemas:
    • Captura/comparación: contiene registros que en combinación del registro TA0R implementan las siguientes funcionalidades:
      • Almacenar el valor actual de la cuenta al detectar determinados eventos.
      • Comprobar el valor actual de la cuenta para generar determinados eventos.
    • Unidad de salida.
      • Contiene un módulo de salida (OUT0, OUT1 y OUT2) que en combinación con el TAR, TA0CCR0, TA0CCR1 y TA0CCR2 nos permite generar señales digitales en los pines del microprocesador.
  • Bloque captura/comparación.
    • Se puede trabajar con tres bloques de dos registros (TA0CCRx y TA0CCTLx) donde x varía entre 0, 1 y 2.
    • Estos bloques trabajan a la vez con el contador.
    • La elección de la forma de trabajo para estos dos registros, es decir, si trabajan en modo captura o comparación se hace a través del bit CAP del registro TA0CCTLx:
      • Un 0 indica comparación.
      • Un 1 indica captura.
    • MODO CAPTURA.
      • Cuando sucede un determinado evento, el valor del registro TA0R se almacena en el registro TA0CCRx.
      • Ese evento es un cambio de nivel (flanco) de determinadas señales que pueden ser o bien externas o internas.
      • Cuando se produce ese evento, trabajando en modo captura, se activa el flag de interrupción CCIFG del registro TA0CCTLx.
      • La señal a capturar (puede ser interna o externa al microcontrolador) se puede seleccionar mediante los bits CCIS0 y CCIS1 (Captura Compare Imput Select) del registro TA0CCTLx:
        • 00 ==> bit CCIxA.
        • 01 ==> bit CCIxB.
        • 10 ==> GND.
        • 11 ==> VCC.
      • Donde CCI0A y CCI1A se corresponden con los puertos P1.1 y P1.2.
      • Los bits CM0 y CM1 del registro TA0CCTLx nos permiten seleccionar el flanco a detectar:
        • 00 ==> no hay captura.
        • 01 ==> captura el flanco ascendente.
        • 10 ==> captura el flanco descendnete.
        • 11 ==> captura en ambos flancos.
      • El bit CCI permite leer el valor instantáneo de la señal a capturar.
      • El bit SCS permite sincronizar la entrada con el reloj del contador/temporizador, es decir, nos permite hacer una captura síncrona con al señal de reloj del contador (1) o asíncrona con la señal de reloj del contador (0). Esto se utiliza para resolver el problema que se tiene en caso de que el flanco de subida de la señal de reloj (se incremente la cuenta) se produzca en el momento en el cual cambia la señal que genera el evento. Si SCS se encuentra a nivel alto, la captura se hace en el flanco de bajada de la señal de reloj y por tanto no habría problemas.
      • El bit SCCI del registro TA0CCTLx contiene el valor digital sincronizado de la señal a capturar. Es decir contiene el valor instantáneo de la señal a capturar sincronizado con la señal de reloj del temporizador, o lo que es lo mismo, ese valor sólo cambia en los flancos de bajada de la señal del temporizador.
      • En el modo comparación el registro TA0CCRx se almacena la cuenta que se pretende lleva a cabo y en el modo captura se registra el valor que tiene TAR cuando se produce un determinado evento.
    • MODO COMPARACIÓN.
      • El proceso de comparación se utiliza para comprobar si el valor de la cuenta (registro TAR) coincide con un valor establecido (almacenado en uno de los registro TA0CCRx).
      • Cuando suceda que el valor almacenado en estos registros es igual al de la cuenta se deben generar ciertos eventos (interrupciones).
      • Cuando el valor del registro TAR coincide con el valor establecido en el registro TA0CCRx se realizan las siguientes operaciones:
        • En el bit SSCI se almacena el valor instantáneo de la señal CCI. Esa señal se determina mediante los bits CCIS0 y CCIS1.
        • La señal EQUx se pone a 1.
        • Se activa el flag de interrupción CCIFG del registro TA0CCTLx.

3 comentarios: