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; } } }