This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

SCI-A Communication problem

Hello,

I'm using SCI-A to communicate with the PC to receive commands on the DSP.

I don't know why but this code that was working on a different computer doesn't work on the one i have now.

I have the SCI-A configured with a BR 9600. I send data trough the terminal but on the DSP only receive trash.


Did anyone have this problem before?

I attached the code just with the communication.

Thanks.

CodeCom.c
/*
 * Programa de Teste fun��es
 * -Timer config
 * - ADC Config
 * - PWM config
 * - SCI
 * - CAN
 *
 * Vers�o 1.0 (21/07/2016)
 *
 */

#include "F28x_Project.h"     // Device Headerfile and Examples Include File
#include "Math.h"
#include <stdio.h>
#include <string.h>

interrupt void cpu_timer0_isr(void);/* Vers�o 2.1 */

#include "F28x_Project.h"     // Device Headerfile and Examples Include File
#include <stdio.h>
#include <string.h>

interrupt void cpu_timer0_isr(void);
interrupt void sciaRxFifoIsr(void);

void 	InitGpios(void);

void 	scia_config(void);

void 	scia_xmit(char *string);

/**** COMM VARIABLES ****/
char charUSART[20];
int N = 0;


void main(void)
{

	InitSysCtrl();

    CpuSysRegs.PCLKCR2.bit.EPWM2=1;

	InitGpio();
	InitGpios();

    DINT;

    InitPieCtrl();

	IER = 0x0000;
	IFR = 0x0000;

	InitPieVectTable();

//
    EALLOW;  // This is needed to write to EALLOW protected registers
    PieVectTable.TIMER0_INT = &cpu_timer0_isr;
    PieVectTable.SCIA_RX_INT = &sciaRxFifoIsr;
    EDIS;    // This is needed to disable write to EALLOW protected registers

    InitCpuTimers();   // For this example, only initialize the Cpu Timers
	ConfigCpuTimer(&CpuTimer0, 200, 1000000/1000);	//Iniciacializa o timer para a amostragem dos ADC (1000HZ)

    scia_config();

	IER |= 0x101; // Enable CPU INT
	// Enable interrupts required for this example
	PieCtrlRegs.PIECTRL.bit.ENPIE = 1;   	// Enable the PIE block
	PieCtrlRegs.PIEIER9.bit.INTx1 = 1;     	// PIE Group 9, INT1 SCIA_RX interrupt
	PieCtrlRegs.PIEIER1.bit.INTx7 = 1;		//PIE group 1, timer0
	EINT;
	ERTM;


	CpuTimer0Regs.TCR.all = 0x4001;

	while(1)
	{

	}
}


interrupt void cpu_timer0_isr(void)
{

    // Acknowledge this interrupt to receive more interrupts from group 1
    PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
}

interrupt void sciaRxFifoIsr(void)
{
	charUSART[N] = SciaRegs.SCIRXBUF.all;

    if(charUSART[N++] == 0x3B) // caracter terminador ;
    {
    	charUSART[N]='\0';
    	N=0;
    	//receive_completeA=1;
    }


    SciaRegs.SCIFFRX.bit.RXFFOVRCLR=1;   								// Clear Overflow flag
    SciaRegs.SCIFFRX.bit.RXFFINTCLR=1;   								// Clear Interrupt flag

    PieCtrlRegs.PIEACK.all|=PIEACK_GROUP9;       						// Issue PIE ack
}

void InitGpios(void)
{
	EALLOW;

	//LED1 - GPIO6 ( Branco )
	GpioCtrlRegs.GPAMUX1.bit.GPIO12 = 0x0;
	GpioCtrlRegs.GPADIR.bit.GPIO12 = 0x1;
	GpioDataRegs.GPACLEAR.bit.GPIO12 = 1;

	//Sinal COntrolo Transmissao RS485
	GpioCtrlRegs.GPCMUX1.bit.GPIO65 = 0x0;
	GpioCtrlRegs.GPCDIR.bit.GPIO65 = 0x1;
	GpioDataRegs.GPCCLEAR.bit.GPIO65 = 1; // Modo Receive

	//configura os IOs para funcionar como PWM
    GpioCtrlRegs.GPAPUD.bit.GPIO2 = 1;    // Disable pull-up on GPIO2 (EPWM2A)
    GpioCtrlRegs.GPAPUD.bit.GPIO3 = 1;    // Disable pull-up on GPIO3 (EPWM2B)
    GpioCtrlRegs.GPAMUX1.bit.GPIO2 = 1;   // Configure GPIO2 as EPWM2A
    GpioCtrlRegs.GPAMUX1.bit.GPIO3 = 1;   // Configure GPIO3 as EPWM2B

    //SCI-A
	GPIO_SetupPinMux(85, GPIO_MUX_CPU1, 5);
	GPIO_SetupPinOptions(85, GPIO_INPUT, GPIO_PUSHPULL);
	GPIO_SetupPinMux(84, GPIO_MUX_CPU1, 5);
	GPIO_SetupPinOptions(84, GPIO_OUTPUT, GPIO_ASYNC);
	//SCI-B
	GPIO_SetupPinMux(87, GPIO_MUX_CPU1, 5);
	GPIO_SetupPinOptions(87, GPIO_INPUT, GPIO_PUSHPULL);
	GPIO_SetupPinMux(86, GPIO_MUX_CPU1, 5);
	GPIO_SetupPinOptions(86, GPIO_OUTPUT, GPIO_ASYNC);

	EDIS;

}

void scia_config(void)
{

	EALLOW;

 	SciaRegs.SCICCR.all = 0x0007;   // 1 stop bit,  No loopback
                                   // No parity,8 char bits,
                                   // async mode, idle-line protocol
	SciaRegs.SCICTL1.all = 0x0003;  // enable TX, RX, internal SCICLK,
                                   // Disable RX ERR, SLEEP, TXWAKE

	SciaRegs.SCICTL2.bit.TXINTENA =1;			// enable TXRDY interrupt
	SciaRegs.SCICTL2.bit.RXBKINTENA =1;			// enable RXDY/BRKDT interrupt
    //
    // SCIA at 9600 baud
    // @LSPCLK = 50 MHz (200 MHz SYSCLK) HBAUD = 0x02 and LBAUD = 0x8B.
    // @LSPCLK = 30 MHz (120 MHz SYSCLK) HBAUD = 0x01 and LBAUD = 0x86.
    //

	SciaRegs.SCIHBAUD.all    =	0x0002;
	SciaRegs.SCILBAUD.all    =	0x008B;
	SciaRegs.SCICCR.bit.LOOPBKENA = 0 ; // Disable loop back



    SciaRegs.SCIFFTX.all	=	0xC001;
	SciaRegs.SCIFFRX.all	=	0x0021;
	SciaRegs.SCIFFCT.all	=	0x00;

	SciaRegs.SCICTL1.all 	=	0x0023;  // Relinquish SCI from Reset
	SciaRegs.SCIFFTX.bit.TXFIFORESET	=	1;
	SciaRegs.SCIFFRX.bit.RXFIFORESET	=	1;

	EDIS;
}

void scia_xmit( char *string)
{

	int index=0;

	while( string[index] != '\0' ){
		while(	(	(SciaRegs.SCIFFTX.bit.TXFFST!=1	)	&& (SciaRegs.SCICTL2.bit.TXEMPTY!=0	)	)	==0 );
		SciaRegs.SCITXBUF.all	=	string[index];
		index++;
	}
}



interrupt void sciaRxFifoIsr(void);
interrupt void scibRxFifoIsr(void);

void 	InitGpios(void);
void	AdcConfig(void);
void 	InitEPwm2Example(void);
void 	scia_config(void);
void 	scib_config(void);
void 	scia_xmit(char *string);
void 	scib_xmit(int *b);
void    ValidaComando(void);
void 	ReadMeter(void);
void 	enviaCmd(int b);
void	Controlo(void);
void 	SoftStart(void);




//variaveis leitura meter
int ComandoLeituraMeter1[7] = {0x01, 0xd0, 0x10, 0x01, 0x01,  0xc0 , 0x04};
int f = 0, z = 0, y = 0 ;
float ArrayFilter[25], VFiltro = 0.00, SumFilter = 0.00;
char Voltage[4], VoltageAux[4], Current[4], Energy[8];
float auxVolt1 = 0.000, auxVolt2 = 0.000;


/**** COMM VARIABLES ****/
char charUSART[20],charUSARTB[30], ValDC[2];
int i = 0, receive_completeA = 0,receive_completeB = 0, aux =0 , val = 0, N = 0;
int v = 0, j = 0, k = 0;



/**** ADC Variables ****/
int FlagADC = 0;
Uint16 AdcaResult1 = 0, AdcbResult1 = 0, DC_aux=0;
double DC ;
float tensaoSaida = 0.0, tensaoEntrada = 0.00;

/***************** VARIAVEIS COMANDO ****************************/
int AltDC = 0, adj = 0;
int FlagControlo = 0, contaCtrl = 0, FlagPWM = 0;
int DCAux = 33, FlagSoftStart=0,SoftDC=0, ContaSoftStart =0;



/**************** STATIC VARIABLES ******************************/
#define 	EPWM2_TIMER_TBPRD  	3333  // Period register for Epwm
#define 	CPUFREQ_MHZ			200
#define		SAMPLE_FREQ			20



void main(void)
{

	InitSysCtrl();

    CpuSysRegs.PCLKCR2.bit.EPWM2=1;

	InitGpio();
	InitGpios();

    DINT;

    InitPieCtrl();

	IER = 0x0000;
	IFR = 0x0000;

	InitPieVectTable();

//
    EALLOW;  // This is needed to write to EALLOW protected registers
    PieVectTable.TIMER0_INT = &cpu_timer0_isr;
    PieVectTable.SCIA_RX_INT = &sciaRxFifoIsr;
    PieVectTable.SCIB_RX_INT = &scibRxFifoIsr;
    EDIS;    // This is needed to disable write to EALLOW protected registers


    InitCpuTimers();   // For this example, only initialize the Cpu Timers
	ConfigCpuTimer(&CpuTimer0, 200, 1000000/1000);	//Iniciacializa o timer para a amostragem dos ADC (1000HZ)

    scia_config();
    scib_config();

	IER |= 0x101; // Enable CPU INT
	// Enable interrupts required for this example
	PieCtrlRegs.PIECTRL.bit.ENPIE = 1;   	// Enable the PIE block
	PieCtrlRegs.PIEIER9.bit.INTx1 = 1;     	// PIE Group 9, INT1 SCIA_RX interrupt
	PieCtrlRegs.PIEIER9.bit.INTx3 = 1;
	PieCtrlRegs.PIEIER1.bit.INTx7 = 1;		//PIE group 1, timer0
	EINT;
	ERTM;



    EALLOW;
    CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 0;
    EDIS;

    InitEPwm2Example();

    EALLOW;
    CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 1;
    EDIS;



    AdcConfig();


    CpuTimer0Regs.TCR.all = 0x4001;


    while(1)
    {
    	if(FlagADC == 1) // Caso tenha sido dado o comando para iniciar uma leitura do ADC
    	{
        	while(AdcaRegs.ADCINTFLG.bit.ADCINT1 == 0);
        	AdcaResult1 = AdcaResultRegs.ADCRESULT2;
        	AdcbResult1 = AdcbResultRegs.ADCRESULT2;
        	AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1; // Limpa a Flag

        	tensaoSaida = (AdcbResult1 * 27.5)/4096;
        	tensaoEntrada = (AdcaResult1 * 52.50)/4096;
        	Controlo(); //Invoca a fun��o de controlo
        	FlagADC = 0;
    	}

    	if(receive_completeB == 1)
    	{
    		ReadMeter();
    		receive_completeB = 0;

    	}

    	if(receive_completeA ==1)
    	{
    		ValidaComando();
    		receive_completeA = 0;
    	}
    }


}


/************* INTERRUPTS ****************/


interrupt void cpu_timer0_isr(void)
{
	// Faz toogle a um pino de controlo
	GpioDataRegs.GPATOGGLE.bit.GPIO12 = 1;

	if(FlagControlo ==1 )// Controlo Ligado
	{
		//inicia a convers�o dos valores do ADC
		AdcaRegs.ADCSOCFRC1.all	=	0x003; //SOC0
		//Limmpa a Flag
		AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;

		FlagADC = 1 ;
	}
	if(FlagSoftStart ==1)
	{
		SoftStart();
	}


    // Acknowledge this interrupt to receive more interrupts from group 1
    PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
}

interrupt void sciaRxFifoIsr(void)
{
	charUSART[N] = SciaRegs.SCIRXBUF.all;

    if(charUSART[N++] == 0x3B) // caracter terminador ;
    {
    	charUSART[N]='\0';
    	N=0;
    	receive_completeA=1;
    }


    SciaRegs.SCIFFRX.bit.RXFFOVRCLR=1;   								// Clear Overflow flag
    SciaRegs.SCIFFRX.bit.RXFFINTCLR=1;   								// Clear Interrupt flag

    PieCtrlRegs.PIEACK.all|=PIEACK_GROUP9;       						// Issue PIE ack
}


interrupt void scibRxFifoIsr(void)
{
    charUSARTB[i]	= ScibRegs.SCIRXBUF.all;

    if( charUSARTB[i++] == 0x04)
    {
    	charUSARTB[i]='\0';
    	i=0;
    	receive_completeB=1;

    }

    ScibRegs.SCIFFRX.bit.RXFFOVRCLR=1;   								// Clear Overflow flag
    ScibRegs.SCIFFRX.bit.RXFFINTCLR=1;   								// Clear Interrupt flag

    PieCtrlRegs.PIEACK.all|=PIEACK_GROUP9;       						// Issue PIE ack
}


/*********************** CONFIGURA�OES ************************************/

void InitGpios(void)
{
	EALLOW;

	//LED1 - GPIO6 ( Branco )
	GpioCtrlRegs.GPAMUX1.bit.GPIO12 = 0x0;
	GpioCtrlRegs.GPADIR.bit.GPIO12 = 0x1;
	GpioDataRegs.GPACLEAR.bit.GPIO12 = 1;

	//Sinal COntrolo Transmissao RS485
	GpioCtrlRegs.GPCMUX1.bit.GPIO65 = 0x0;
	GpioCtrlRegs.GPCDIR.bit.GPIO65 = 0x1;
	GpioDataRegs.GPCCLEAR.bit.GPIO65 = 1; // Modo Receive

	//configura os IOs para funcionar como PWM
    GpioCtrlRegs.GPAPUD.bit.GPIO2 = 1;    // Disable pull-up on GPIO2 (EPWM2A)
    GpioCtrlRegs.GPAPUD.bit.GPIO3 = 1;    // Disable pull-up on GPIO3 (EPWM2B)
    GpioCtrlRegs.GPAMUX1.bit.GPIO2 = 1;   // Configure GPIO2 as EPWM2A
    GpioCtrlRegs.GPAMUX1.bit.GPIO3 = 1;   // Configure GPIO3 as EPWM2B

    //SCI-A
	GPIO_SetupPinMux(85, GPIO_MUX_CPU1, 5);
	GPIO_SetupPinOptions(85, GPIO_INPUT, GPIO_PUSHPULL);
	GPIO_SetupPinMux(84, GPIO_MUX_CPU1, 5);
	GPIO_SetupPinOptions(84, GPIO_OUTPUT, GPIO_ASYNC);
	//SCI-B
	GPIO_SetupPinMux(87, GPIO_MUX_CPU1, 5);
	GPIO_SetupPinOptions(87, GPIO_INPUT, GPIO_PUSHPULL);
	GPIO_SetupPinMux(86, GPIO_MUX_CPU1, 5);
	GPIO_SetupPinOptions(86, GPIO_OUTPUT, GPIO_ASYNC);

	EDIS;

}

void AdcConfig(void)
{

	EALLOW;
	AdcaRegs.ADCCTL2.bit.PRESCALE 		= 6; 		//set ADCCLK divider to /4
	AdcbRegs.ADCCTL2.bit.PRESCALE 		= 6; 		//set ADCCLK divider to /4

	// Sequencia de PowerUp
	//power up the ADCs
	AdcaRegs.ADCCTL1.bit.ADCPWDNZ  		= 1;      	// Power up ADC
	AdcbRegs.ADCCTL1.bit.ADCPWDNZ  		= 1;      	// Power up ADC
	//Set pulse positions to late
	AdcaRegs.ADCCTL1.bit.INTPULSEPOS 	= 1; 		// INT pulse generation occurs 1 cycle prior to ADC result latching into its result register
	AdcbRegs.ADCCTL1.bit.INTPULSEPOS 	= 1; 		// INT pulse generation occurs 1 cycle prior to ADC result latching into its result register

	DELAY_US(500);

	//ADC_A
	AdcaRegs.ADCSOC2CTL.bit.CHSEL 		= 2; 		// SOC2 will convert pin A2  		-> ADCINA2 || J7.64
	AdcaRegs.ADCSOC2CTL.bit.ACQPS 		= 19; 		// ADCSOC1CTL = 0x0A86, CHSEL 		-> sample window 7 cycles
	AdcaRegs.ADCSOC2CTL.bit.TRIGSEL		= 1;

	//ADC_B
	AdcbRegs.ADCSOC2CTL.bit.CHSEL 		= 2; 		// SOC2 will convert pin b2  		-> ADCINB2 || J3.26
	AdcbRegs.ADCSOC2CTL.bit.ACQPS 		= 19; 		// ADCSOC1CTL = 0x0A86, CHSEL 		-> sample window 7 cycles
	AdcbRegs.ADCSOC2CTL.bit.TRIGSEL		= 1;


	//AdcaRegs.ADCSOC0CTL.bit.TRIGSEL
	//AdcaRegs.ADCINTSEL1N2.bit.INT1SEL 	= 1; 		//end of SOC1 will set INT1 flag
	AdcaRegs.ADCINTSEL1N2.bit.INT1E 	= 1;   			//enable INT1 flag
	//AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 	= 1; 		//make sure INT1 flag is cleared

	EDIS;
}

void InitEPwm2Example()
{
    // Setup TBCLK
    EPwm2Regs.TBPRD = 0;        // Set timer period 15kHz
    EPwm2Regs.TBPHS.bit.TBPHS = 0;          	// Phase is 0
    EPwm2Regs.TBCTR = 0;                 	   // Clear counter

    // Set Compare values
    EPwm2Regs.CMPA.bit.CMPA = 0;   			 // Set compare A value

    // Setup counter mode
    EPwm2Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; // Count up and down
    EPwm2Regs.TBCTL.bit.PHSEN = TB_DISABLE;        // Disable phase loading
    EPwm2Regs.TBCTL.bit.HSPCLKDIV = 0x00;       // Clock ratio to SYSCLKOUT
    EPwm2Regs.TBCTL.bit.CLKDIV = 0x00;

    // Setup shadowing
    EPwm2Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;
    EPwm2Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
    EPwm2Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO; // Load on Zero
    EPwm2Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;

    // Set actions
    EPwm2Regs.AQCTLA.bit.CAU = AQ_SET;
    EPwm2Regs.AQCTLA.bit.CAD = AQ_CLEAR;
    EPwm2Regs.AQCTLB.bit.CAU = AQ_CLEAR;
    EPwm2Regs.AQCTLB.bit.CAD = AQ_SET;

    // Deadtime
    EPwm2Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE;
    EPwm2Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC;
    //EPwm2Regs.DBCTL.bit.IN_MODE = DBA_ALL;
    EPwm2Regs.DBRED.bit.DBRED = 33;
    EPwm2Regs.DBFED.bit.DBFED = 33;

}


void scia_config(void)
{

 	SciaRegs.SCICCR.all = 0x0007;   // 1 stop bit,  No loopback
                                   // No parity,8 char bits,
                                   // async mode, idle-line protocol
	SciaRegs.SCICTL1.all = 0x0003;  // enable TX, RX, internal SCICLK,
                                   // Disable RX ERR, SLEEP, TXWAKE

	SciaRegs.SCICTL2.bit.TXINTENA =1;			// enable TXRDY interrupt
	SciaRegs.SCICTL2.bit.RXBKINTENA =1;			// enable RXDY/BRKDT interrupt
    //
    // SCIA at 9600 baud
    // @LSPCLK = 50 MHz (200 MHz SYSCLK) HBAUD = 0x02 and LBAUD = 0x8B.
    // @LSPCLK = 30 MHz (120 MHz SYSCLK) HBAUD = 0x01 and LBAUD = 0x86.
    //

	SciaRegs.SCIHBAUD.all    =	0x0002;
	SciaRegs.SCILBAUD.all    =	0x008B;
	SciaRegs.SCICCR.bit.LOOPBKENA = 0 ; // Disable loop back



    SciaRegs.SCIFFTX.all	=	0xC001;
	SciaRegs.SCIFFRX.all	=	0x0021;
	SciaRegs.SCIFFCT.all	=	0x00;

	SciaRegs.SCICTL1.all 	=	0x0023;  // Relinquish SCI from Reset
	SciaRegs.SCIFFTX.bit.TXFIFORESET	=	1;
	SciaRegs.SCIFFRX.bit.RXFIFORESET	=	1;

}
void scib_config(void)
{
	EALLOW;

 	ScibRegs.SCICCR.all = 0x0007;   // 1 stop bit,  No loopback
                                   // No parity,8 char bits,
                                   // async mode, idle-line protocol
 	ScibRegs.SCICTL1.all = 0x0003;  // enable TX, RX, internal SCICLK,
                                   // Disable RX ERR, SLEEP, TXWAKE

 	ScibRegs.SCICTL2.bit.TXINTENA =1;			// enable TXRDY interrupt
 	ScibRegs.SCICTL2.bit.RXBKINTENA =1;			// enable RXDY/BRKDT interrupt
    //
    // SCIA at 9600 baud
    // @LSPCLK = 50 MHz (200 MHz SYSCLK) HBAUD = 0x02 and LBAUD = 0x8B.
    // @LSPCLK = 30 MHz (120 MHz SYSCLK) HBAUD = 0x01 and LBAUD = 0x86.
    //

 	ScibRegs.SCIHBAUD.all    =	0x0000;
 	ScibRegs.SCILBAUD.all    =	0x006D;
 	ScibRegs.SCICCR.bit.LOOPBKENA = 0 ; // Disable loop back



 	ScibRegs.SCIFFTX.all	=	0xC001;
 	ScibRegs.SCIFFRX.all	=	0x0021;
 	ScibRegs.SCIFFCT.all	=	0x00;

 	ScibRegs.SCICTL1.all 	=	0x0023;  // Relinquish SCI from Reset
 	ScibRegs.SCIFFTX.bit.TXFIFORESET	=	1;
 	ScibRegs.SCIFFRX.bit.RXFIFORESET	=	1;

 	EDIS;
}



/************** FUNCOES ***********************/
//Transmitir Comando UART A
void scia_xmit( char *string)
{

	int index=0;

	while( string[index] != '\0' ){
		while(	(	(SciaRegs.SCIFFTX.bit.TXFFST!=1	)	&& (SciaRegs.SCICTL2.bit.TXEMPTY!=0	)	)	==0 );
		SciaRegs.SCITXBUF.all	=	string[index];
		index++;
	}
}

//Transmitir CMD UART B
void enviaCmd(int b)
{

	GpioDataRegs.GPCSET.bit.GPIO65 = 1; // Modo Receive

	while(((ScibRegs.SCIFFTX.bit.TXFFST!=1)	&& (ScibRegs.SCICTL2.bit.TXEMPTY!=0	))==0);
	ScibRegs.SCITXBUF.all	=	b;

	GpioDataRegs.GPCCLEAR.bit.GPIO65 = 1;

}

//Tradu��o dos Valores Recebidos do Meter
void ReadMeter(void)
{

	k=0;

	for(v = 5; v<=8 ; v++)
	{
		Voltage[v-5]=charUSARTB[v];
		//tensao = (tensao << 8 ) | Voltage[v-5];
	}

	for(j = 3; j >= 0 ; j--)
	{
		VoltageAux[k] = Voltage[j];
		//corrente = (corrente << 8) | VoltageAux[k];
		k++;
	}



	Voltage[0] |= (Voltage[1]<<8) | (Voltage[0]) ;
	Voltage[1] |= (Voltage[3]<<8) | (Voltage[2]);

	memcpy(&auxVolt1,&Voltage,2);

	//filter(auxVolt1);

}


void ValidaComando(void)
{

	switch(charUSART[0])
	{

		case 0x41: // A - Ajustar PWM [0x41] - A; [0x2E] - . ; [2,3] - Valores do PWM em %
					if(charUSART[1] == 0x2E)
					{
						for(adj = 2; adj <=3; adj++)
						{
							ValDC[adj-2] = charUSART[adj];
						}

						AltDC = atoi(ValDC);
						if(AltDC >= 90)
						{
							AltDC = 90;

						}

						EPwm2Regs.TBPRD = EPWM2_TIMER_TBPRD;
						EPwm2Regs.CMPA.bit.CMPA = AltDC*33 ;

					}
					scia_xmit("Duty Cicle Ajustado");


					break;

		case 0x43: // C - Inicia o controlo
					if(FlagPWM == 1)
					{
			    		FlagControlo = 1;
						scia_xmit("Controlo Ligado");
					}
					else
					{
						scia_xmit("Ligue o PWM Primeiro ");
					}

					break;

		case 0x58: // X - Desliga Controlo / Coloca DC a 10%
					if(FlagControlo == 1)
					{
						FlagControlo = 0;
						EPwm2Regs.CMPA.bit.CMPA = 333;
						scia_xmit("Controlo Desligado");
					}
					else
					{
						scia_xmit("Controlo N�o Ligado");
					}
					break;

		case 0x49: // I - Iniciar - Inicia PWM
					if(FlagControlo == 0)
					{
						FlagPWM = 1;
						EPwm2Regs.TBPRD = EPWM2_TIMER_TBPRD;
						DC = 333;
						EPwm2Regs.CMPA.bit.CMPA = DC;
						scia_xmit("PWM LIGADO \n");
					}
					else
					{
						scia_xmit("Aten��o !! O controlo Est� Ligado! ");
					}

					break;

		case 0x50:  //P - Parar PWM
					EPwm2Regs.TBPRD = 0; //Inicializa o PWM
					EPwm2Regs.CMPA.bit.CMPA = 0;

					scia_xmit("PWM DESLIGADO \n");
					break;

		case 0x53:  //S - SoftStart
					if(charUSART[1] == 0x2E)
					{
						for(adj = 2; adj <=3; adj++)
						{
							ValDC[adj-2] = charUSART[adj];
						}

						SoftDC = atoi(ValDC);
						if(SoftDC >= 90)
						{
							SoftDC = 90;
						}
						FlagSoftStart = 1;
						EPwm2Regs.TBPRD = EPWM2_TIMER_TBPRD;
						EPwm2Regs.CMPA.bit.CMPA = 333 ; // Come�a a 10 %
					}
					break;
	}

}

void Controlo(void)
{
	if(contaCtrl == 4) // Aplica o Algorimo de controlo a cada 5 vezes que entra no controlo
	{
		//algoritmo de controlo
		contaCtrl=0;
	}
	else
	{
		contaCtrl++;
	}

}

void SoftStart(void)
{
	if(ContaSoftStart <= 100)
	{
		ContaSoftStart++;
	}
	else
	{
		if(DCAux < SoftDC)
		{
			DCAux++;
			if(DCAux>=90)
			{
				DCAux = 90;
			}
			EPwm2Regs.CMPA.bit.CMPA = DCAux*33 ;
			ContaSoftStart = 0;
		}
		else
		{
			FlagSoftStart = 0;
		}

	}

}