Professional Documents
Culture Documents
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...
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;
}