You are on page 1of 3

#include <msp430.

h>
/*
APS Servo motor
*/
void config_ini(void);
void config_portas(void);
void config_PWM(void);

int i=0;

int main(void) {
config_portas();
config_ini();
config_PWM();
P1IE |= WDTIE;//Habilita a geracao de interrupcao pelo WDT
do{
}while(1);
}

void config_ini(void)
{
WDTCTL = WDTPW | WDTHOLD;
DCOCTL = CALDCO_16MHZ;
BCSCTL1 = CALBC1_16MHZ;
BCSCTL2 = DIVS0 + DIVS1;
BCSCTL3 = XCAP0 + XCAP1;
while(BCSCTL3 & LFXT1OF); // sai do loop quando oscilador LFXT1 estiver
estavel
__enable_interrupt();// seta o bit GIE - permite geracao de interrupcoes
}

void config_portas(void)
{
P1DIR = BIT0 + BIT1 + BIT2 + BIT4 + BIT5 + BIT6 + BIT7;
P1REN = BIT3;
P1OUT = BIT3;
P1SEL |= BIT6; // saida de sinal PWM no pino associado a TA0.1
P1SEL2 &= ~BIT6;//Ainda acho que nao precisa zerar esse bit...

P1IES = BIT3;//Interrup. por borda de descida


P1IFG = 0;//Limpa as flags da porta 1
P1IE = BIT3;//Habilita interrup.
P2DIR = 0xFF;
P2OUT = 0;
}

void config_PWM(void)
{
TA0CTL = TASSEL0 + MC0;//ACLK utilizado e Modo Up selecionado
TA0CCTL1 = OUTMOD0 + OUTMOD1 + OUTMOD2 + OUT;//Seleciona o modo 7 do PWM
TA0CCR0 = 655;//Implica em uma frequencia de saida de 50 Hz
TA0CCR1 = 26;//Implica em 4 por cento do total
}

#pragma vector=PORT1_VECTOR
__interrupt void RTI_P1(void)
{
P1IFG &= ~BIT3;//Limpa flag para impedir interrupcoes consecutivas
P1IE &= ~BIT3;//Desabilita interrupcoes de P1.3
WDTCTL = WDTPW + WDTTMSEL + WDTCNTCL + WDTIS0;//WDIS0 divide SMCLK por
8192, onde SMCLK eh 16MHz/8 = 2MHz. Dessa forma o WDT levar 4 ms
}

#pragma vector=WDT_VECTOR
__interrupt void RTI_WDT(void)
{
WDTCTL = WDTPW + WDTHOLD; // Para o WDT
if((~P1IN) & BIT3)
{
if(TA0CCR1>=78)//78 representa 11.9 por cento porem 74 representa
os 16 cliques necessarios
{
i=1;
}else if(TA0CCR1<=26)
{

i=0;
}
if(i==0)//i=0 contagem crescente
{
TA0CCR1 += 3;
}
if(i==1)//i=1 contagem decrescente
{
TA0CCR1 -=3;
}
}
P1IE = BIT3;
}

// Interrupcao do BIT3 da P1 habilitada

You might also like