El MSP430 está provisto de temporizadores (el número de ellos depende de la versión del microcontrolador) que permiten medir intervalos de tiempo y generar eventos basados en tiempo.
No hay que confundir los timers con los relojes de tiempo real que también equipa el MSP430.
Hay dos tipos de timers, Los Timers_A y los Timers_B. Ambos son muy similares, y aunque los de tipo B poseen alguna característica más que los A, aquí no vamos a profundizar en ello.
Alguna de las características de los timers son:
- Utilizan un contador de 16 bits con cuatro modos de operación.
- Pueden seleccionar y usar diferentes fuentes de reloj.
- Utilizan registros de captura/comparación para su configuración.
- Permiten salidas PWM (Power Width Modulation).
- Pueden usar interrupciones.
Hay dos tipos de bloques bien diferenciados. Rodeado de verde está el bloque contador, y de azul el bloque de captura/comparación, de los que puede haber hasta siete en cada timer.
Bloque contador
El bloque contador dispone de un contador de 16 bits llamado TAxR (donde x será 0 para el timer TA0 y así sucesivamente). Para controlar este bloque se utiliza el registro TAxCTL.- El campo TASSEL nos permite seleccionar la fuente de reloj.
- El campo ID permite dividir la frecuencia del reloj.
- El campo MC permite seleccionar el modo de funcionamiento del contador.
- El campo TACLR pone a cero el contador TAxR.
- El campo TAIE habilita las interrupciones generadas por el timer.
- El campo TAIFG indica si se ha producido una interrupción. Generalmente es un campo para consulta.
- Stop mode (00b): El timer está parado.
- Up mode (01b): El timer cuenta hasta el valor almacenado en el registro TAxCCR0 y vuelve a empezar desde 0.
- Continuous mode (10b): El timer cuenta hasta el valor fijo 0xFFFF y vuelve a contar desde 0.
- Up/Down Mode (11b): El timer cuenta ascendentemente hasta el valor almacenado en el registro TAxCCR0 y después descendentemente hasta 0.
Bloque de captura/comparación
Este bloque se controla mediante el registro TAxCCTLn.Vamos a analizar el uso básico de los contadores, así que nos centraremos en el modo comparación. Así pues, el modo captura no lo analizaremos en este artículo.
El campo CAP nos permitirá seleccionar el modo captura o el modo comparación. Por otro lado, el campo CCIFG del registro TAxCCTLn se activa cuando el valor de la cuenta del registro TAxR alcanza el valor del registro TAxCCRn.
El timer puede generar dos tipos de interrupciones. Por un lado, mediante el bit TAIE del registro TAxCTL podemos generar una interrupción cada vez que el contador alcance el valor 0. El segundo tipo de interrupciones se desencadenan cuando el valor de la cuenta del registro TAxR ha alcanzado el valor almacenado en el registro TAxCCRn (TAxCCRn CCIFG), se habilitan mediante el bit CCIE del registro TAxCCTLn.
Código de ejemplo
Para aclarar conceptos los mejor es analizar un código de ejemplo en el que vamos a poner en práctica lo que se ha visto hasta ahora.
#include <msp430.h>
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // Detiene Watchdog
P1DIR |= BIT0; // P1.0 salida
P1OUT |= BIT0; // Enciende LED
// Configuración TIMER_A:
// TimerA1, ACLK/1,modo up, reinicia TACLR
TA1CTL = TASSEL_1 | TACLR | MC_1;
// ACLK tiene una frecuencia de 32768 Hz
// Carga cuenta en TA1CCR0 0.1seg TA1CCR=(0,1*32768)-1
TA1CCR0 = 3276;
TA1CCTL0 = CCIE; // Habilita interrupción (bit CCIE)
// LPM0, habilitación general de interrupciones
__low_power_mode_0();
__no_operation();
}
// Rutina de interrupción de TIMER1_A0
#pragma vector=TIMER1_A0_VECTOR
__interrupt void TIMER1_A0_ISR(void){
P1OUT ^= 0x01; // conmuta LED en P1.0
}
Este código hace cambiar de estado, cada 0,1 segundos, el LED conectado al puerto P1.0. Para ello se ha programado la interrupción asociada al timer A1. Mediante la siguiente línea se configura el timer A1 para que utilice el reloj ACLK y configuración en modo UP. También se inicializa el contador poniéndolo a cero.
TA1CTL = TASSEL_1 | TACLR | MC_1;La interrupción se produce cuando el contador llega al valor almacenado en el registro TACCR0, así que sabiendo que, en este caso, ACLK funciona a una frecuencia de 32768Hz podemos calcular qué valor hay que almacenar en dicho registro. Si quisiéramos que el LED cambiara de estado cada segundo lo tendríamos fácil. Simplemente haríamos TACCR0=32768-1 (siempre restaremos uno al valor deseado). Esto es así porque ACLK cambia de estado 32768 veces en un segundo. Para que el LED cambie un valor arbitrario de veces n usamos la formula TACCR0=(tiempo en segundos * freq. de reloj en Hz)-1.
Así pues, para que cambie de estado cada 0,1 segundos hacemos TA1CCR0=(0,1*32768)-1=3276.
TA1CCR0 = 3276;Finalmente habilitamos la interrupción del timer mediante el bit CCIE.
TA1CCTL0 = CCIE;Al entrar en modo LPM0 también estamos activando las interrupciones.
En el siguiente vídeo podemos ver el resultado de la ejecución del anterior código.








Comentarios
Publicar un comentario