i'm really noob on C programing ...
someone can help me on programming?
#include <msp430g2553.h>
/*
ANALOGICO AUXILIAR (P1.2) SERÁ UTILIZADO PARA MOVER O ROV PARA BAIXO/CIMA (MOTOR_VERT1 E 2)
ESQUERDA/DIREITA (MOTOR_LAT1 E 2)
*/
//-----------------------Entradas----------
#define BOTAOLUZ (P1IN&0x08) //P1.3 LUZ
#define ANA_X (P1IN&0x01) //P1.0 ANALOGICO X
#define ANA_Y (P1IN&0x02) //P1.1 ANALOGICO Y
#define ANA_A (P1IN&0x04) //P1.2 ANALOGICO AUXILIAR
//----------------------Saidas--------------
#define LUZ_ON (P1OUT|=0x80) //P1.7 LUZ =1
#define LUZ_OFF (P1OUT&=~(0x80)) //P1.7 LUZ =0
//motor frontal esquerdo: P2.1 e P2.4 //P2.1 P2.4 PH F1
#define MOTOR_FRONT_E1 0x02
#define MOTOR_FRONT_E2 0x10
//motor frontal direito:P2.0 E P2.5 //P2.0 P2.5 PH F2
#define MOTOR_FRONT_D1 0x01
#define MOTOR_FRONT_D2 0x20
// motor vertical :P2.2
#define MOTOR_VERT1 0x04
//-------------------PWM----------------------
#define PERIODO 20000 //20ms
#define MINIMO 540 //Ton minimo
#define MAXIMO 2340 //Ton maximo
#define PASSO 10*10 // passo=10y , onde y é o grau (º) desejado.
#define LED 0x02 //LED LIGADO NO PINO 2.1
#define PINO_BOTAO 0x08 //botao = P1.3
/**************** Ajuste de configuração do servo *****************
//Oscilador interno (SMCL=DCO) = 1MHz (aproxidamente)
//Divisor do clock = 1 => período de contagem é de 1us = 1/1000000
//Período de 20ms (freq. servo=50Hz=> 1/50=20ms)
//Então o valor a ser ajustado para contar 1us é de 2000 contagens (20ms/1us)
//O registro CCR0 define o período = 2000
//O registro CCR1 define o DC. Para o servo em questão devemos ter os tempos
//ligados relacionados a seguir (valores ajustados na prática)
//Posicao 0 => Ton=5.4ms => 5.4ms/1us = 540 (valor min do CCR1 inicial)
//Posicao 180 => Ton=2,34ms => 2.43ms/1us=2340 (valor max do CCR1)
//Resumindo:
540 _________ 0º
---------> xº = 10x <-----------
2340 _________ 180º
*/
/* Funcionamento do timer no MSP430
CCR0 => PERIODO e CCR1 => Tempo em alta (TON)
QUANDO COMEÇA => PINO = 1 (CONFIGURACAO DO CCTL1)
O TIMER COMEÇA DE ZERO E VAI CONTANDO ATÉ CHEGAR NO VALOR DO CCR1.
QUANDO ATINGIR O VALOR DO CCR1 O PINO SERÁ ZERADO E CONTINUA CONTANDO
ATÉ CHEGAR NO CCR0. QUANDO CHEGAR NO CCR0, O PINO SERÁ SETADO E O PROCESSO
SE REINICIA AUTOMATICAMENTE
*/
unsigned int pwm=MINIMO;
//unsigned char sentido=0;
unsigned int valorad1, pwm1, valorad2, pwm2, valorad3, pwm3;
/************************DECLARAÇÃO DAS FUNÇÕES DEFINIDAS (VOID)*********/
unsigned int LeAD1 (void);
unsigned int LeAD2 (void);
unsigned int LeAD3 (void);
void delayms (unsigned int tempo);
void atualiza_pwm (void);
void config_pwm (void);
void ConfigAD (void);
void config_pwm_frontal_1 (void);
void config_pwm_frontal_2 (void);
void config_pwm_vertical_1 (void);
//void config_pwm_vertical_2 (void);
void config_pwm_lateral_1(void);
void config_pwm_lateral_2 (void);
/***************************************************************************/
char luz=0;
void main (void)
{
WDTCTL = WDTPW + WDTHOLD;
P1REN |=PINO_BOTAO ; //pull-up no botao
ConfigAD();
config_pwm();
LUZ_OFF;
P2DIR= 0x20;
for(;;)
{
delayms(1000); //espera 1 segundo
valorad1=LeAD1();
pwm1=valorad1/100; //fazer uma escala pois tem que ajustar o PWM em funcao do motor
atualiza_pwm();
delayms(1000); //espera 1 segundo
valorad2=LeAD2();
pwm2=valorad2/100; //fazer uma escala pois tem que ajustar o PWM em funcao do motor
atualiza_pwm();
delayms(1000);
valorad3=LeAD3();
pwm3=valorad3/100; //fazer uma escala pois tem que ajustar o PWM em funcao do motor
atualiza_pwm();
/*****************LIGANDO E DESLIGANDO A LUZ******************************/
if(BOTAOLUZ==0 && luz==0)
{
LUZ_ON;
luz=1;
}
else if (BOTAOLUZ==0 && luz==1)
{
LUZ_OFF;
luz=0;
}
/**************************************************************************/
if (0<pwm1 && pwm1<341)
{
config_pwm_frontal_1(); // MOTOR ESQUERDO RODA PRA FRENTE
}
else if (685<pwm1 && pwm1<1023)
{
config_pwm_frontal_2(); // MOTOR DIREITO RODA PRA FRENTE
}
/***************************************************************************/
if (0<pwm2 && pwm2<341)
{
config_pwm_vertical_1();
}
else if (685<pwm2 && pwm2<1023)
{
config_pwm_vertical_2();
}
/*****************************************************************************/
if (0<pwm2 && pwm2<341)
{
config_pwm_vertical_1();
}
else if (685<pwm2 && pwm2<1023)
{
config_pwm_vertical_2();
}
}
}
/***************************FUNÇÕES DO PWM***************************************/
void atualiza_pwm (void)
{
TA1CTL=TA1CTL&~(TAIFG);
while ((TA1CTL&TAIFG)==0); //espera fim da contagem atual (sincronizar)
TA1CCR1=pwm; // P2.1
TA1CCR2=pwm2; // P2.4
}
void config_pwm (void)
{
P2DIR |= MOTOR_FRONT1; //configura só o P2.1(TA0.1) como saída (MOTOR_FRONT1)
P2SEL |= MOTOR_FRONT1; //Faz com que o P2.1 seja uma saida especial(PWM)
TA1CCR0 = PERIODO-1; //Valor que terá que contar para gerar o periodo
TA1CCTL1 = OUTMOD_7; //Inicial=1, contagem=CCR1=>0, contagem=CCR0=>0
TA1CCR1 = pwm; //Ton desejado (em escala de 1us)
TA1CTL=TASSEL_2+MC_1+ID_0; //Clock=SMCLK, liga o timer, clock/1
}
void config_pwm_frontal_1 (void)
{
P2SEL &= ~MOTOR_FRONT_E2; //alterando p/ io comum
P2OUT &= ~MOTOR_FRONT_E2;
P2SEL |= MOTOR_FRONT_E1; //alterando p/ pwm
}
void config_pwm_frontal_2 (void)
{
P2SEL &= ~MOTOR_FRONT_D1;
P2OUT &= ~MOTOR_FRONT_D1;
P2SEL |= MOTOR_FRONT_D2;
}
void config_pwm_vertical_1 (void)
{
P2SEL &= ~MOTOR_VERT1;
P2OUT &= ~MOTOR_VERT1;
P2SEL |= MOTOR_VERT2;
}
void config_pwm_vertical_2 (void)
{
P2SEL &= ~MOTOR_VERT2;
P2OUT &= ~MOTOR_VERT2;
P2SEL |= MOTOR_VERT1;
}
void config_pwm_lateral_1(void)
{
P1SEL &= ~MOTOR_VERT1;
P1OUT &= ~MOTOR_VERT1;
P1SEL |= MOTOR_VERT2;
}
void config_pwm_lateral_2 (void)
{
P1SEL &= ~MOTOR_VERT2;
P1OUT &= ~MOTOR_VERT2;
P1SEL |= MOTOR_VERT1;
}
/*********************************** delay ms*******************************/
void delayms (unsigned int tempo)
{
unsigned int i,j;
for(i=0;i<tempo;i++)
{
for(j=0;j<200;j++); //cada ciclo gasta 5us (aproximado)
//para 1ms = 200 x 5us
}
}
/*********************CONVERSOR AD********************************************/
void ConfigAD (void)
{
P1SEL = P1SEL | ANA_X; //Configura o pino P1.0 como entrada AD0
P1SEL = P1SEL | ANA_Y; //Configura o pino P1.1 como entrada AD1
P1SEL = P1SEL | ANA_A; //Configura o pino P1.2 como entrada AD2
ADC10CTL0 = ADC10SR; //Configura o AD com taxa de amostragem de 50kbps
}
//Funcao que le o conversor AD e converte p/ numero
unsigned int LeAD1 (void)
{
unsigned int ad; //variavel local p/ valor do ad
ADC10CTL1 = INCH_0 + ADC10SSEL_2; //Configura o AD para o canal 0 e clock de conversão o MCLK
ADC10CTL0 = ADC10CTL0 | ADC10ON; //liga o conversor AD
ADC10CTL0 = ADC10CTL0 | (ENC + ADC10SC); //habilita a conversao AD
while ((ADC10CTL0 && ADC10IFG)==0); //espera converter (ADC10IFG=1)
ad = ADC10MEM; //carrega o valor lido (ADout)
return (ad);
}
unsigned int LeAD2 (void)
{
unsigned int ad; //variavel local p/ valor do ad
ADC10CTL1 = INCH_1 + ADC10SSEL_2; //Configura o AD para o canal 0 e clock de conversão o MCLK
ADC10CTL0 = ADC10CTL0 | ADC10ON; //liga o conversor AD
ADC10CTL0 = ADC10CTL0 | (ENC + ADC10SC); //habilita a conversao AD
while ((ADC10CTL0 && ADC10IFG)==0); //espera converter (ADC10IFG=1)
ad = ADC10MEM; //carrega o valor lido (ADout)
return (ad);
}
unsigned int LeAD3 (void)
{
unsigned int ad; //variavel local p/ valor do ad
ADC10CTL1 = INCH_1 + ADC10SSEL_2; //Configura o AD para o canal 0 e clock de conversão o MCLK
ADC10CTL0 = ADC10CTL0 | ADC10ON; //liga o conversor AD
ADC10CTL0 = ADC10CTL0 | (ENC + ADC10SC); //habilita a conversao AD
while ((ADC10CTL0 && ADC10IFG)==0); //espera converter (ADC10IFG=1)
ad = ADC10MEM; //carrega o valor lido (ADout)
return (ad);
}