Você está na página 1de 5

#include <msp430.

h>
#define AJ_Freq
1
#define AJ_Dcycle
2
#define AJ_AMP
3
unsigned int freq = 10;
unsigned int Estado=1;
int razao = 0;
int pot = 0;
int i;
#define SYNC_POTDG_1

BIT0

#define POTDG_1_EN
#define POTDG_1_DS

P1OUT &= ~SYNC_POTDG_1;


P1OUT |= SYNC_POTDG_1;

void tx_word_16b_spi(char word_tx_spi);


void
void
void
void

config_ini(void); // Prototipos das funcoes


ini_P1_P2(void);
ini_TA0(void);
ini_USCI_B0_SPI(void);

void main(void) {
config_ini();
ini_P1_P2();
ini_TA0();
ini_USCI_B0_SPI();
IE1 |= WDTIE; // Habilita a geracao de interrupcao pelo WDT
if (Estado==AJ_Freq){
P2OUT |= BIT0;
}else if (Estado==AJ_Dcycle){
P2OUT |= BIT1;
}else if (Estado==AJ_AMP){
P2OUT |= BIT2;
}
do{
/* Sai deste loop para atender as RTIs
* da Porta 1 e WDT.
*
*/
}while(1);
}
void config_ini(void){
WDTCTL = WDTPW | WDTHOLD;

// Stop watchdog timer

// Configuracoes do BCS
// MCLK = DCOCLK ~ 16 MHz
// ACLK = LFXT1CLK = 32768 Hz

DCOCTL = CALDCO_16MHZ;
BCSCTL1 = CALBC1_16MHZ;
BCSCTL2 = DIVS0 + DIVS1; // Fator divisao = 8 para SMCLK
BCSCTL3 = XCAP0 + XCAP1; // Capacitor do cristal ~12.5 pF
while(BCSCTL3 & LFXT1OF); // Sai deste loop quando clock de LFXT1 estiver es
tavel
__enable_interrupt(); // seta o bit GIE - permite geracao de interrupcoes
}
void ini_P1_P2(void){
P1DIR |= SYNC_POTDG_1; //BIT0 configurado como SYNC - sada
P1DIR |= (BIT1 + BIT3 + BIT5 + BIT6 + BIT7);//BIT0, BIT1, BIT3, BIT5, BIT6,
BIT7 configurados como saida
P1DIR &= ~(BIT2 + BIT3 + BIT4); //BIT2 e BIT4 configurados como entrada
P1SEL |= BIT6;
P1SEL2 &= ~(BIT6);
P1OUT &= ~(BIT0 + BIT1 + BIT3 + BIT5 + BIT6 + BIT7);// saidas em nivel logic
o zero
P1REN |= (BIT2 + BIT4); // Resistor do BIT2 e BIT4 habilitado
P1OUT |= (BIT2 + BIT4); // Resistor de pull-up para BIT2 e BIT4
P1IES |= BIT2; // Interrupcao por borda de descida
P1IFG = 0; // limpa as flags da P1, evitando que uma interrupcao ocorra
// de forma indevida
P1REN |= BIT3;
P1OUT |= BIT3;
P1IES |= BIT3;
P1IE |= BIT2 + BIT3; // Interrupcao do BIT2 da P1 habilitada
P2DIR = 0xff; // todos os pinos das porta 2 como saida
P2OUT &= ~(BIT0 + BIT1 + BIT2);
}
void ini_TA0(void){
// Fonte de clock: SMCLK = 2M Hz / 4 = 500000Hz
// Fator Div.4
// Modo UP sem geracao de int.
TA0CTL = TASSEL1 + MC0 + ID1;
// Modo Reset/set
// Saida inicializada em nivel alto
TA0CCTL1 = OUTMOD0 + OUTMOD1 + OUTMOD2 + OUT;
TA0CCR0 = 500; // Para periodo de 1ms
TA0CCR1 = 0;

// razao ciclica de 0 % - led apagado

}
// RT1 da PORTA 1
#pragma vector=PORT1_VECTOR
__interrupt void P1_RTI(void){
if (P1IFG & BIT2){
P1IE &= ~BIT2;
WDTCTL = WDTPW + WDTTMSEL + WDTCNTCL + WDTIS1;
}
if (P1IFG & BIT3)
P1IE &= ~BIT3;
// WDT configurado como temporizador
// Clock = SMCLK ~ 1,875 MHz
// Fator: 512
WDTCTL = WDTPW + WDTTMSEL + WDTCNTCL + WDTIS0;
}
// RTI do WDT
#pragma vector=WDT_VECTOR
__interrupt void WDT_RTI(void){
WDTCTL = WDTPW + WDTHOLD;

// Para o WDT

if (P1IFG & BIT3){


P2OUT = 0;
if (Estado == 3){
Estado=1;
}else{
Estado++;
}
if (Estado==AJ_Freq){
P2OUT |= BIT0;
}else if (Estado==AJ_Dcycle){
P2OUT |= BIT1;
}else if (Estado==AJ_AMP){
P2OUT |= BIT2;
}
}
if((~P1IN)&BIT2){
if(P1IN&BIT4){ //Giro direita
switch (Estado)
{
case AJ_Freq://lGICA PRA ALTERAR O TACCR0
if(freq != 1000){

freq += 10;
TACCR0 = 500000/(freq);
}
TA0CCR1 = (TA0CCR0) * (razao/100.0);
break;
case AJ_Dcycle://TACCR1
if(razao != 100){
razao++;
}
TA0CCR1 = (TA0CCR0) * (razao/100.0);
break;
case AJ_AMP://POT DIGITAL
pot += 1;
if (pot>=250){
pot=255;
}
tx_word_16b_spi(pot);
break;
}
}
else{ //Giro esquerda
switch (Estado)
{
case AJ_Freq:
if(freq != 10){
freq -= 10;
TACCR0 = 500000/(freq);
}
TA0CCR1 = (TA0CCR0) * (razao/100.0);
break;
case AJ_Dcycle:
if(razao != 0){
razao--;
}
TA0CCR1 = (TA0CCR0) * (razao/100.0);
break;
case AJ_AMP:
pot -= 1;
if (pot<=0){
pot=0;
}

tx_word_16b_spi(pot);
break;
}
}
}
P1IFG &= ~ (BIT2 + BIT3); // Limpa flag para nao gerar interrupcoes
P1IE |= BIT2 + BIT3; // Interrupcao do BIT2 e BIT3 da P1 habilitada
}
void ini_USCI_B0_SPI(void){
UCB0CTL1 |= UCSWRST; //desabilita a USCI_B0;
UCB0CTL1 |= UCSWRST; // Desabilita USCI_B0
UCB0CTL0 = UCMSB + UCMST + UCSYNC + UCCKPH;
UCB0CTL1 = UCSSEL1 + UCSWRST;
UCB0BR0 = 4; // Freq. de SCLK = SMCLK/4 = 8 MHz / 4 = 2 MHz.
UCB0BR1 = 0;
P1SEL |= BIT5 + BIT7; // Habilita porta para periferico
P1SEL2 |= BIT5 + BIT7; // Habilita porta para periferico
UCB0CTL1 &= ~UCSWRST; // USCI habilitada
}
void tx_word_16b_spi(char word_tx_spi){
POTDG_1_EN;
//UCB0TXBUF = word_tx_spi >> 8;

// Envia 8 bits mais significat

ivos
UCB0TXBUF = 0x11;
// Envia o comando para escrever no potenciom
etro.
while(UCB0STAT & UCBUSY);
// sai do while quando Shift Regist
er esta vazio
UCB0TXBUF = word_tx_spi; // Envia os 8 bits menos significativos
while(UCB0STAT & UCBUSY);
// sai do while quando Shift Regist
er esta vazio
POTDG_1_DS;
}

Você também pode gostar