10
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

MSP430 timer1

Embed Size (px)

Citation preview

Page 1: 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

Page 2: MSP430 timer1

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:

Page 3: MSP430 timer1

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

Page 4: MSP430 timer1

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.

Page 5: MSP430 timer1

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.

Page 6: MSP430 timer1

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

Page 7: MSP430 timer1

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

Page 8: MSP430 timer1

-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.

Page 9: MSP430 timer1

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;

Page 10: MSP430 timer1

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);

}