MSP430 timer1
-
Upload
pedro-junior -
Category
Documents
-
view
145 -
download
0
Transcript of MSP430 timer1
MSP430- O Uso do timer-
Autor: Pedro Ernesto Veras Junior
Data: 16/11/2012
Orientador: Prof. Geraldo Ramalho
Bolsista Voluntário
Desenvolvimento de condição de máquina
Introdução A maioria dos microcontroladores modernos possui timers na sua programação e isso também
acontece com o MSP430. Dentre as funções timer que estão incluídas no MSP430 podemos
listar: Watchdog timer, Basic timer 1, Timer_A, Timer_B.
Watchdog timer:
tem como principal objetivo proteger o sistema contra falhas do software, tais como ele ficar
num loop infinito não intencional. Em suma, o Watchdog timer, faz com que o MSP430
redefina o MSP430 quando ele atinge seu limite. O comando watchdog é controlado por um
registrador de 16 bits chamado de WDTCTL. Ele será prevenido contra erros de leitura por um
password chamado de WDTPW=0x5A. Sendo assim ocorrerá um reset, quando a instrução em
WDTCTL tiver um valor diferente do password WDTPW. É possível utilizarmos o watchdog só
pra gerar uma interrupção e assim fazer com que ele atue como um temporizador.
Modo watchdog:
Nesse modo se o contador realizar 32.768, 8.192, 512, 64 contagens (conforme a seleção dos
bits WDTISx) será provocado um reset do sistema. Deve-se programar o watchdog de uma
maneira em que nunca seja atingida a contagem final. Com a aplicação funcionando
corretamente nunca será provocado um reset por ele. Se o programa tiver um erro o
watchdog seta o registrador IFG1 (flag WDT1FG) resetando a CPU ao atingir sua contagem
final.
Registradores Watchdog:
São basicamente 3 registradores:
-WDTCTL
-IE1
-IFG1
Como WDTCTL é responsável pelo controle geral do watchdog e possui 16 bits, vamos nos
concentrar a entender cada um de seus bits:
WDTPW- senha para escrita no registrador, seu valor deve ser sempre 0x5A ou então
ocorrerá um reset no sistema.
WDTHOLD- Faz com que o watchdog seja desligado afim de economizer energia.
0-watchdog funcionando
1-watchdog parado
WDTNMIES- seleciona a interrupção NM1 quando WDTNM1 está ativada.
0- Interrupção NM1 na borda de subida do pino
1- interrupção NM1 na borda de descida do pino.
WDTTMSEL- seleciona o modo de funcionamento do watchdog.
0- Modo watchdog
1- Modo temporizador
WDTCNTCL- faz o apagamento da memória do watchdog.
0- Contagem normal
1- contagem apagada
WDTSSEL- seleciona a fonte de clock do watchdog.
0- Clock secundário SMCLK
1- clock auxiliar ACLK
WDTISx- seleciona o intervalo de contagem do watchdog.
00- Clock/32768
01- clock/8192
10-clock/512
11-clock/64
Configuração do watchdog:
Podemos configurar o watchdog timer como mostrado abaixo:
Apagamento de contagem do watchdog:
WDTCTL = WDTPW + WDTCNTCL;
Parando o watchdog:
WDTCTL= WDTPW + WDTHOLD;
Basic timer (Timer 1)
O basic timer tem dois contadores de 8 bits. Sendo eles o BTCNT1 e o BTCNT2. O primeiro
contador serve para gerar um sinal de clock para o módulo LCD e o segundo pode ser utilizado
como um divisor programável que pode gerar interrupções. Pode ser utilizado para gerar um
relógio de tempo real.
BTCNT1
Sua função como dito anteriormente é gerar o sinal que irá ser utilizado para gerar o sinla de
clock para o LCD utilizando o ACLK( clock auxiliar).
A frequencia de saída para o LCD pode ser dada por:
Onde x representa qual o bit usado em BTFRFQx que pode ser 32, 64, 128, 256, para os bits 00,
01, 10, 11.
BTCNT2
O clock desse contador pode vir do ACKL SMCLK ou até mesmo vindo da saída de BTCNT1, em
que o bit usado em BTFRFQx é 11 e então ACLK/256. Quando ele atua com o clock tendo como
saída o primeiro contador, então eles atuam em cascata como um temporizador de 16 bits.
O contador 2 usa BTCTL para seleção da fonte do clock, que é um registrador em que os bits
BTSSEL e BTDIV fazem parte dessa operação.
Interrupção do basic timer:
È utilizado somente um único tipo de interrupção e ela provêm do bit BTIFG do registrador
IFG2, com o vetor de interrupção sendo igual a zero.
Registradores do Basic Timer:
-BTCTL: controle do basic timer
-BTCNT1: contador 1
-BTCNT2: contador 2
-IFG2: registrador em que se encontra o flag de interrupção BTIFG
-IE2: registrador em que se encontra o bit de interrupção para o contador 1, BTIE.
Timer A
O timer A é também um temporizador, mas diferente do Basic timer ele possui 16 bits. Mas se
organizarmos o Basic timer utilizando os dois contadores em cascata teremos também 16 bits
mas com a condição de que ACLK já venha dividido por 256 pois o bit 11 do flag BTFRFQx está
conectado a entrada de BTSSEL.
O timer A funciona basicamente com o contador TAR(16 bits) sendo alimentado por um sinal
de clock vindo do flag TASSELx vindo do registrador TACTL e o sinal pode ainda ser divido por
bits de IDx (1,2,4,8), pertencente ao registrador TACTL.
O MCx controla os modos de contagem do contador TAR, ou seja ele seleciona seu modo de
operação.
MCx modo
00 Contagem parada
01 Contagem de módulo
10 Modo contínuo (0 a 65.536)
11 Contagem progressiva/regressiva
Sendo assim vemos que no modo 1(MCx=01) acontecerá uma interrupção uma vez que a
contagem de módulo atinja o valor especificado em TACCR0. Na interrupção o flag TAIFG é
setado e para calcularmos o período da interrupção de TAIFG:
Já no modo 2 com MCx=10 e sendo o modo 2 um modo continuo em que o contador vai de 0 a
65.536 contagens. Quando ele atinge valor máximo em 0xFFFF a contagem retorna a 0 e o
TAIFG é setado. Assim o período dessa interrupção é calculado como sendo:
No modo 3 MCx= 11, o contador TAR realiza a contagem progressiva desde 0 até o valor
programado em taccr0. Quando ele atinge esse valor ele retorna desse mesmo valor
regressivamente até atingir valor 0, esse processo é repetido continuamente.
O período de tempo dessa interrupção é calculado como sendo:
-Periodo da interrupção pelo TAIFG em segundos.
-Frequencia do clock em Hz.
Prescaler- Fator de divisão do prescaler de entrada do timer.
TACCRO-módulo de contagem armazenado no registrador TACCR0.
Registradores do Timer A
Os registradores do timer A são:
-TACTL
-TA1CTL
-TAR
-TA1R
-TACCTLx
-TA1CCTLx
-TACCRx
-TA1CCRx
-TAIV
-TA1IV
-PxSEL
Objetivos Relatar e detalhar o uso do timer, cálculo de tempo, configuração, modos de interrupção.
Usar o timer do microcontrolador msp430 para uma aplicação funcional no launchpad.
Metodologia A realização do relatório foi feito em três partes. A primeira consistiu numa pesquisa
preliminar acerca do uso do timer. A segunda dedicou-se a um estudo mais detalhado e numa
análise mais ampla sobre o assunto. A fonte de pesquisa foi basicamente livros, materiais
online e vídeo-aula, mas com uma ênfase no livro Microcontroladores MSP430 Teoria e
Prática(Fábio Pereira) e no livro MSP430 Microcontroller basics(John Davies). A terceira foi
obter o código fonte de uma aplicação do uso do timer com o MSP430.
Para compilar o programa foi utilizado o programa IAR da embedded workbench.
Resultados A compilação do IAR mostrou que o programa compilou com sucesso, os Resultados foram em parte comprometidos pela falta da lanchpad para testar o programa. Espera-se que o programa realize a seguinte operação: Acenderá o LED durante 2 segundos, deixará o LED desligado durante 2 segundos, repetindo sempre esse padrão.
Conclusão Após realizar o estudo do timer, conclui-se que é de suma importância aprender sua
configuração, modos de interrupção e o cálculo de tempo. O código fonte do programa foi
concluído, parcialmente testado (apenas compilado no IAR) e assim os objetivos do relatório
foram concluídos.
Código fonte:
#include <msp430g2553.h>
#define LED_0 BIT0
#define LED_1 BIT6
#define LED_OUT P1OUT
#define LED_DIR P1DIR
int x = 0;
unsigned int timerCount = 0;
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // parar o watchdog com WDTHOLD
LED_DIR |= (LED_0 + LED_1); // colocar o p1.0 e p1.6 que sao os leds ligados
LED_OUT &= ~(LED_0 + LED_1); // Seta os LEDs para um estado desligado
P1OUT ^= (LED_0);
CCTL0 = CCIE;
TACTL = TASSEL_2 + MC_2; // TASSEL_2 poe o timer a para o clock auxiliar por que não temos
cristal na launchpad
//MC_2 faz com que o contador conte de 0 até 65.536 continuamente
__enable_interrupt();
__bis_SR_register(LPM0 + GIE); // lpm com interrupcao
}
// Rotina de Interrupção do timer Ao
#pragma vector=TIMER0_A0_VECTOR
__interrupt void Timer_A (void)
{
timerCount = (timerCount + 1) % 32;
//vai contar até 32 pois quero dois segundos
//sabemos que se temos o clock de 1mhz da memoria interna do launchpad
//podemos pegar e descobrir pela formula tempo = numero de contagens / clock
//o que nos da 16 contagens = 1 segundo.
if(timerCount ==0)
P1OUT ^= (LED_0 + LED_1);
}