Other Parts Discussed in Thread: UCD8220
Hi,
I found the application report (SLVA578) which I want.
Can I get the source code related to SLVA578?
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.
Hi,
I found the application report (SLVA578) which I want.
Can I get the source code related to SLVA578?
#include "msp430g2553.h"
unsigned int 	ADC_Readings [5],
				USB_Voltage = 0,
				USB_Current = 0,
				Battery_Voltage = 0,
				Engine_ON_Signal = 0,
				Ignition_ON_Signal = 0,
				ovc=0,
				hiccup=0;
				
unsigned char	Boost_Stage_OFF = 1,counter = 0, 
				Hysterisis_ON = 1, //Initialised Boost stage off from 0 to 1 
				latchoff=0; 
						
#define	USB_I		3
#define USB_V		4 
#define B_V			2
#define L_100		1
#define L_50		0
#define ALLOW_50_LOAD		P2DIR |= BIT5
#define ALLOW_100_LOAD		P2DIR &= ~BIT5	
#define LOAD_SIGNAL			P3IN & BIT0
void Init_Clock (void)
{
	BCSCTL1		= CALBC1_16MHZ;               	// Set DCO ~ 16 Mhz
	DCOCTL		= CALDCO_16MHZ;
	BCSCTL1 	|= DIVA_1;                    	// ACLK/(0:1,1:2,2:4,3:8)
	BCSCTL3 	|= LFXT1S_2;                  	// LFXT1 = VLO
}
void Init_IOs (void)
{
	P3DIR |= BIT3 + BIT2 + BIT5 + BIT6;								//Pin 3.3 as PWM Output
	P3SEL |= BIT3 + BIT2 + BIT5 + BIT6;
	
	P2OUT &= ~BIT5;
	//P2SEL |= BIT5;
	P2DIR |= BIT0;
	P2OUT |= BIT0;
}
void Init_Timer (void)
{
	TA1CCR0		= 161;					// Load the Reference Count -Changed from 80 
	TA1CCTL2	= OUTMOD_7;		
	TA1CCTL1	= OUTMOD_3;
	TA1CCR1 	= 80;					// Count Value Loaded Changed from 40
	TA1CCR2 	= 1;					// Count Value Loaded -same
	TA1CTL		= TASSEL_2 + MC_1 + TACLR ;	//Up-Down Mode , SMCLK , Timer Clear (upmode)
	
	TACCR0		= 20000;					// Load the Reference Count
	TACCTL1		= OUTMOD_6;
	TACCTL2		= OUTMOD_2;		
	TACCR1 		= 11000;					// Count Value Loaded	
	TACCR2 		= 9000;					// Count Value Loaded
	TACTL		= TASSEL_2 + MC_3 + ID_3 + TACLR ;	//Up-Down Mode , SMCLK , Timer Clear
		
}
void Init_ADC (void)
{
	ADC10CTL0 |= SREF_1 + ADC10SHT_2 + REFON + ADC10ON + MSC + ADC10IE + REF2_5V ;
	ADC10CTL1 |= INCH_4 + CONSEQ_1 + ADC10SSEL_0;			// Sequence of channels upto A6
	ADC10AE0  |= 0x1F;										// ADC A0-A4 Enabled.
	ADC10DTC1 = 0x05;
}
void Process(void)
{
	if ((Engine_ON_Signal > 100) &&(Engine_ON_Signal < 900))
	{
		ALLOW_100_LOAD;
	}
	
	if (Ignition_ON_Signal> 1000)
	{
		ALLOW_100_LOAD;		//Change back to 50_load logic changed for testing 
	}
	
	if ((Battery_Voltage > 900) && (Hysterisis_ON)) //Battery thhreshold set to 10.5V
	{
		Boost_Stage_OFF = 0;
		Hysterisis_ON = 0;
		counter = 0;
	}
	
	if (Battery_Voltage < 600 )				//Battery lower threshold 6V
	{
		counter++;
		if (counter > 10) 
		{	
			counter = 0;
			Boost_Stage_OFF = 1;
			Hysterisis_ON = 1;
		}
	}
	
}
unsigned char test = 1,test1;
void main (void)
{
	WDTCTL = WDTPW + WDTHOLD;				// Stop watchdog timer to prevent time out reset
	//while (P3IN & 0x02);
	_delay_cycles (16000);  					//timer voltage rampup
 	Init_Clock ();
	Init_IOs ();
	//while (P3IN & 0x02);					//moved from top
	P2OUT &= ~BIT0;
	//_delay_cycles (16000);  					//timer problem, moved up
  	Init_Timer ();
  	Init_ADC ();
  	ADC10CTL0 &= ~ENC;
	while (ADC10CTL1 & BUSY);               // Wait if ADC10 core is active
	ADC10SA	  = (unsigned int) ADC_Readings;
  	ADC10CTL0 |= ENC + ADC10SC;             // Sampling and conversion start
  	WDTCTL = WDT_MDLY_32; 
  	IE1 |= WDTIE;                         	// enable WDT interrupt
  	_EINT();                              	// Enable interrupts
	__bis_SR_register(GIE);	
  	while (1)
  	{
  		if (latchoff==1)
  		{
  		Boost_Stage_OFF=1;latchoff=1;
  		}
  		else 
  		{
  		Process ();	
 		}
///////////Remove marked code for no OVC Fault - Latch mode
	if (P3IN & 0x02)
	{
		if (ovc>10)
		{
			ovc=0;
			Boost_Stage_OFF=1;
			latchoff=1;
		}
		else
		{
			ovc++;
		}
	}
	else
	{
			ovc=0;
	}
	
///////////Remove marked code for no OVC Fault - Latch mode
		ALLOW_100_LOAD;
		
		if (Boost_Stage_OFF==0) //Boost stage UVLO
		{		
  		//_delay_cycles (160000); //changed from 16000 and moved to else loop
  		//TA1CCR2 += 1;   //Moved to else loop below
  		if (TA1CCR2 > 128)   //Changed from 65
  		{
  			TA1CCR2 = 128;
  			if (P3IN & 0x02)
  			{
  				P2OUT |= BIT0;
  			}	
  			else
	  		{
  				P2OUT &= ~BIT0;
  			}	
  			
  		}
  		else 
  		{
  			TA1CCR2 += 1;    //Moved from Top
  			_delay_cycles (16000); //Moved from Top
  		}
		
		}
		else 
		{
			//TA1CCR2 = 1;
			TA1CCTL2	= OUTMOD_5;	     //PWM reset to 0 
			for(hiccup=0;hiccup<10000;hiccup++)
			_delay_cycles (16000);
			WDTCTL = WDT_MRST_0_064;
		}
		
		  		
  	}
}
#pragma vector=ADC10_VECTOR
__interrupt void ADC10_ISR(void)
{
	ADC10CTL0 &= ~ENC;
	while (ADC10CTL1 & BUSY);               // Wait if ADC10 core is active
   	ADC10SA = (unsigned int)ADC_Readings;
	
	USB_Current 	= ADC_Readings [USB_I];
	USB_Voltage	 	= ADC_Readings [USB_V];
	Battery_Voltage = ADC_Readings [B_V];
	Engine_ON_Signal = ADC_Readings [L_100];
	Ignition_ON_Signal = ADC_Readings [L_50];
	
	
	if (USB_Current > 100)
	{
		TA1CCR1 = 0;
	}
	else
	{
		if (USB_Voltage > 683)
		{
			TA1CCR1 --;
			//if (TA1CCR1 < 60)
			//	TA1CCR1 = 60;
		}
		else
		{
			TA1CCR1 ++;
			//if (TA1CCR1 > 80)
			//	TA1CCR1 = 80;
		}
	}
}
#pragma vector=WDT_VECTOR
__interrupt void watchdog_timer(void)
{
	ADC10CTL0 |= ENC + ADC10SC;             // Sampling and conversion start
}
I got a copy of the code but please note this is not at all guaranteed to function as a production code, as this was intended for testing purposes only to get the push pull stage(inverter stage) to work.
Regards
Peter