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.

MSP430f1111a Power comsumption

Hey,

I have a problem programming my MSP430.

I know it is not a question to post here but i really can't figure it out by myself.

I'm helping my friend with his project he started 10 years ago and wasn't doing much on it since then.

Because he is making some kind of battery powered system the programm should be as power efficient as possible. Now problem is that programm was almost completelly written back in the time and i don't know how to transorm it to be more power efficient.

I was trying to make it work in LPM3 or 2 for 1s and then wake up run normally one cycle and then go back to LPM. However anything i do i cannot make it work. It messes with PWM signals, etc. and it just won't work the way it should.

Tnx in advance.

This is code. I know the whole code is not relevant so i bolded things that are running, maybe anyone can find something that could be causing problem.

#include <msp430x11x1.h>
//Indikatorji (delujejo kot stikalo)
char g_chTimerInd; // za vklop pošiljanja blokov PVM impulzov
char g_chLEDTimerInd; // za izklop detekt LED (KO NI VEČ ODBOJA)
char g_chLEDTimer2Ind; // omogoči d++ (samo 2 mses)
char g_chTimerVARInd; // v normalnem delovanju je na 1, ko pride do blokade gre na 0 in onemogoča detind, kar posledično ne dovoljuje odprtje ventila
char g_chTimerVAR2Ind; // za ponovno postavitev t_var
char g_chVARInd; // za omogočanje ponovne postavitve t_var
char g_chTimerPOInd; // za vklop timerja prekinitve odboja (v primeru, da je prišlo do blokade
char g_chTimerPONInd; // za vklop ventila pri samodejnem spiranju
char g_chTimer_SSInd; // za izklop ventila pri samodejnem spiranju (ko poteče čas trajanja samodejnega spiranja t_ss)
char g_chTimer1_p1Ind; // za vklop ventila pri prvem spiranju (v progreamu 1)
char g_chTimer2_p1Ind; // za izklop ventila pri prvem spiranju (v programu 1)
char g_chTimer3_p1Ind; // za vklop ventila pri drugem spiranju (v programu 1)
char g_chTimer4_p1Ind; // za izklop ventila pri drugem spiranju ( v programu 1)
char l_chPR2VentilInd; // za delovanje (vklop izklop) ventila v programu 2
char g_chTimer1_p4Ind; // minimalno potrebna prisotnost v programu 4
char g_chTimer2_p4Ind; // vklop ventila v programu 4
char g_chTimer3_p4Ind; // izklop ventila v programu 4
char l_chPONInd; // lokalni indikator (pomožni za samodejno spiranje)
char g_chSTARTInd; // omogoči vstop v glavno zanko
char g_chDELAYInd; // omogoči začetek štetja zakasnitve za vstop v glavno zanko

char program; // spremenjlivka za izbiro programa delovanja

//glavna števca (timerja ) za celoten sistem

unsigned int g_uiTemp = 0; // števec na interrupt na vsako 1 msec
unsigned int g_uiTemp1 = 0; // števec na interrupt na vsako 1 sec

//števci v msec

unsigned int g_uiTimer; // timer za trajanje delovanja oz. nedelovanja PWMa
unsigned int g_uiLEDTimer; // timer za zakasnitev izklopa detekt LED
unsigned int g_uiLEDTimer2; // timer za omejitev d++ (enkrat v enem PWM impulsu), 2msec

//števci v sec

unsigned int g_uiTimerVAR; // timer za maximalno prisotnost (blokada, t_var)
unsigned int g_uiTimerVAR2; // timer ki omejuje postavljanje t_var
unsigned int g_uiTimerPO; // timer za prekinitev odboja, deluje le ko pride do prekoračitve varnostnega časa
unsigned int g_uiTimerPON; // timer za samodejno spiranje (t-pon)
unsigned int g_uiTimer_SS; // timer za trajanje samodejnega spiranja (t-ss)
unsigned int g_uiTimer1_p1; // čas zakasnitve odpiranja ventila (v msec), odboj
unsigned int g_uiTimer2_p1; // čas trajanja prvega spiranja v msec PROGRAM 1
unsigned int g_uiTimer3_p1; // čas zakasnitve odpiranja ventila ko ni več odboja
unsigned int g_uiTimer4_p1; // čas trajanja drugega spiranja (v msec PROGRAM 1)
unsigned int g_uiTimer1_p2; // timer za zakasnitev vklopa ventila PROGRAM 2
unsigned int g_uiTimer2_p2; // timer za zakasnitev izklopa ventila PROGRAM 2
unsigned int g_uiTimer1_p4; // timer za minimalno potrebno prisotnost PROGRAM 4
unsigned int g_uiTimer2_p4; // timer za zakasnitev vklopa ventila PROGRAM 4
unsigned int g_uiTimer3_p4; // timer za trajanje vklopa ventila PROGRAM 4
unsigned int g_uiTimerDelay; // timer za zakasnitev prvega vstopa v glavno zanko
unsigned int g_uiTimerTEST; // timer za vklop impulznega ventila (TEST)
unsigned int g_uiTimerTEST1; // timer za izklop impulznega ventila (TEST)

// te spremenljivke nastavljate v SWITCH-case za vsak program posebej

unsigned int t_var;
unsigned int t_pon;
unsigned int t_SS;
unsigned int t_po;
unsigned int t_pwm;
unsigned int t_nopwm;
unsigned int t1_p1;
unsigned int t2_p1;
unsigned int t3_p1;
unsigned int t4_p1;
unsigned int t1_p2;
unsigned int t2_p2;
unsigned int t1_p4;
unsigned int t2_p4;
unsigned int t3_p4;
unsigned int TEST;
unsigned int TEST1;
/*****************************************************************************************************************************************************/

unsigned int program_1; // spremenljivka ki omogoči delovanje programa 1
unsigned int program_2; // spremenljivka ki omogoči delovanje programa 2
unsigned int program_3; // spremenljivka ki omogoči delovanje programa 3
unsigned int program_4; // spremenljivka ki omogoči delovanje programa 4

int adc; // napetost baterije
int i; // stevec, da lahko kvarc zaoscilira
int d; // stevec detekt signalov
int pr1_dInd; // indikator detekcije za PROGRAM 1
int g_iDETInd = 0; // ko je detekcija je ta spremenljivka na 1
int iTime; // pauza med dvema PWM impulzoma
int TESTInd = 1; // indikator vklopljenosti ventila (0=vklop)
int TEST1Ind; // indikator izklopljenosti ventila (0=izklop)
int g=1;
int SPITimer;

/******************** PODPROGRAM ZA LPM ***************************************/

void SPI( void )
{
if( (P1IN & 0x01) == 1 )
{
SPITimer = 1000;
// P1OUT |= 0x04;
_BIS_SR(LPM3_bits + GIE);
}
}

/******************** PODPROGRAM ZA ODPRTJE VENTILA ***************************/

void ODPRI( void )
{
BATTEST();
if (adc == 1)
{
if (TESTInd==1)
{
P1OUT |= 0x02; // odpri ventil za vodo (P2.4)
g_uiTimerTEST=20;
TESTInd = 0;
TEST1Ind = 1;
TEST = 0;
}
}
/* if (TEST==1)
{
P1OUT &= ~0x02;
}*/
}

/******************** PODPROGRAM ZA ZAPRTJE VENTILA ***************************/

void ZAPRI( void )
{
if(TEST1Ind==1)
{
P2OUT |= 0x10; // zapri ventil za vodo (P1.1)
g_uiTimerTEST1=20;
TESTInd = 1;
TEST1Ind = 0;
TEST1 = 0;
}
/* if (TEST1==1)
{
P2OUT &= ~0x10;
}*/
}

/******************** PODPROGRAM ZA PREVERJANJE NAPETOSTI BATERIJE ************/

void BATTEST( void )
{
CACTL1 = CARSEL + CAREF_2 + CAON + CAIFG;
CACTL2 = P2CA0 + CAF;
CAPD = CAPD1 + CAPD4;
if ((CAOUT & CACTL2))
{
adc=1;
}
else
{
adc=0;
}
CACTL1 = 0x00;
}
/******************** PODPROGRAM ZA UPRAVLJANJE S PWM-om **********************/

void PWM( void )
{
if( g_chTimerInd )
{
if( (TACCTL2 & 0xa0) == 0xa0 ) // ali pwm ne dela
{
TACCTL2 = 0x60; // PWM vklopljen
// P2OUT |= 0x08; // P2.3 postavimo na 1
g_uiTimer = 1; // PWM dela 1ms (poslan 1 blok impulzov, 38)
}
else
{
TACCTL2 = 0xa0; // PWM v reset nacinu (PWM ne dela)
// P2OUT &= ~0x08; // P2.3 postavimo na 0
g_uiTimer = iTime;
}
g_chTimerInd = 0;
}
}
// DOPIŠI KOMENTAR IZ LISTA
//{OK}
//********************* PODPROGRAM ZA DETEKCIJO ********************************

void DETEKT( void )
{
if( (P1IN & 0x01) == 0 ) // ali imamo detekt signal na portu P1.0
{
g_uiLEDTimer2 = 2; // omejitev pristevanja varijable d
iTime = t_pwm; // pauza med dvema PWM impulzoma
g_uiLEDTimer = t_pwm + 5; // ne ugasaj LED med dvema PWM pulzoma (5ms rezerve)
g_uiTimerVAR2 = t_pwm + 5; // ne postavljaj t_var med dvema PWM pulzoma
}
else
{
if (g_chVARInd)
{
g_uiTimerVAR=t_var; // postavite t_var na njegovopolno vrednost
g_chTimerPOInd = 1; // vklop timerja za trajanje prekinitve odboja
}
}

if (g_chLEDTimer2Ind) // povecaj d le enkrat v enem PWM pulzu
{
d++;
g_chLEDTimer2Ind = 0;
}

if (d == 4) // stirikratno preverjanje detekcije
{
P1OUT |= 0x04; // P1.2 postavimo na 1
g_uiTimerPO = t_po; // vrne t_po na polno vrednost
d = 0; // na 0, da lahko spet prištevamo do 4
g_uiTimerPON = t_pon; // vrne t_pon na polno vrednost
if (g_chTimerVARInd)
{
g_iDETInd = 1; // če ni dosežena varnostna blokada potem
} // postavi g_iDEInd na 1, drugače ga pa drži na 0
else
g_iDETInd = 0;
}

if (g_chLEDTimerInd ) // če je postavljen indikator za izklop detektLED...
{
P1OUT &= ~0x04; // P1.2 postavimo na 0 (ugasnemo detekt LED
iTime = t_nopwm; // pauza med dvema PWM impulzoma
d = 0; // ce ni zaporednih pulzov vrni d na 0
g_chLEDTimerInd = 0; // spet omogočimo vklop detekt LED
g_iDETInd = 0;
}

if (g_chTimerVAR2Ind) // če je postavljen indikator za ponovno postavitev t_var potem ...
{
g_chVARInd = 1; // omogoči postavitev t_var
}
else
{
g_chVARInd = 0;
}
}
// DOPIŠI KOMENTAR IZ LISTA


/****************** PODPROGRAM ZA SAMODEJNO SPIRANJE **************************/

void SAMODEJNO_SPIRANJE( void )
{
if (g_chTimerPONInd )
{
ODPRI(); // odpri ventil za vodo (P1.1)
g_uiTimer_SS = t_SS; // drzi ga odprtega t_ss sekund
g_chTimerPONInd = 0;
l_chPONInd=1; // ko je samodejno spiranje v teku je ta indikator na 1
}
if (g_chTimer_SSInd )
{
ZAPRI(); // zapri ventil za vodo (P1.1)
g_chTimer_SSInd = 0;
g_uiTimerPON = t_pon;
l_chPONInd=0;
}
}


// DOPIŠI KOMENTAR IZ LISTA

/************************************** PODPROGRAM ZA SAMODEJNO IZBIRO PROGRAMOV *************************************************/
void IZBIRA_PROGRAMA (void )
{
/* if ( P2IN ==0x00 ) // P2.2 (pin 10) P2.0 ( pin8 )
program = 1; // 0 0

if ( P2IN ==0x01 )
program = 2; // 0 1

if ( P2IN ==0x04 )
program = 3; // 1 0

if ( P2IN ==0x05 )
program = 4; // 1 1
*/
}


// DOPIŠI KOMENTAR IZ LISTA

/************************************** PODPROGRAM ZA INICIALIZACIJO PARAMETROV *************************************************/
void INICIALIZACIJA_PARAMETROV ( void )
{
WDTCTL=WDTPW+WDTHOLD; // Stop WDT
P1OUT &= ~0x02; // ob spremembi programa je ventil izklopljen
g_iDETInd = 0;
switch ( program )
{
case 1: // program 1
t_var = 10000; // čas max prisotnosti v msec
t_po = 2000; // minimamlni čas prekinitve odboja, ko je sistem v blokadi
t_pon = 1800; // samodejno izpiranje vsakih 0000 sec
t_SS = 5; // trajanje samodejnega spiranja v sec
t_pwm = 100; // pavza med dvema PWM impulzoma, ko imamo odboj (v ms)
t_nopwm = 500; // pavza med dvema PWM impulzoma, ko nimamo odboja (v ms)
t1_p1 = 1000; // čas zakasnitve odpiranja ventilav msec, ko imamo odboj
t2_p1 = 2000; // čas trajanja prvega spiranja v msec
t3_p1 = 2000; // čas zakasnitve odpiranja ventila, ko ni več odboja v msec
t4_p1 = 5000; // čas trajanja drugega spiranja v msec
program_1 = 1; // vkluči program 1
program_2 = 0; // izkluči program 2
program_3 = 0; // izkluči program 3
program_4 = 0; // izkluči program 4
break;

case 2: // program 3
t_var = 7000; // čas max prisotnosti v msec
t_po = 1200; // minimamlni čas prekinitve odboja, ko je sistem v blokadi
t_pon = 1800; // samodejno izpiranje vsakih 0000 sec
t_SS = 10; // trajanje samodejnega spiranja v sec
t_pwm = 100; // pavza med dvema PWM impulzoma, ko imamo odboj (v ms)
t_nopwm = 200; // pavza med dvema PWM impulzoma, ko nimamo odboja (v ms)
t1_p2 = 1000; // čas zakasnitve odpiranja ventilav msec, ko imamo odboj
t2_p2 = 2000; // čas zakasnitve zapiranja ventilas v msec
program_2 = 1; // vkluči program 2
program_1 = 0; // izkluči program 1
program_3 = 0; // izkluči program 3
program_4 = 0; // izkluči program 4
break;

case 3: // program 3
t_var = 15000; // čas max prisotnosti v msec
t_po = 2000; // minimamlni čas prekinitve odboja, ko je sistem v blokadi
t_pon = 1800; // samodejno izpiranje vsakih 0000 sec
t_SS = 2; // trajanje samodejnega spiranja v sec
t_pwm = 100; // pavza med dvema PWM impulzoma, ko imamo odboj (v ms)
t_nopwm = 500; // pavza med dvema PWM impulzoma, ko nimamo odboja (v ms)
program_3 = 1; // vkluči program 3
program_1 = 0; // izkluči program 1
program_2 = 0; // izkluči program 2
program_4 = 0; // izkluči program 4
break;

case 4: // program 4
t_var = 60000; // čas max prisotnosti v msec
t_po = 2000; // minimamlni čas prekinitve odboja, ko je sistem v blokadi
t_pon = 1800; // samodejno izpiranje vsakih 0000 sec
t_SS = 10; // trajanje samodejnega spiranja v sec
t_pwm = 100; // pavza med dvema PWM impulzoma, ko imamo odboj (v ms)
t_nopwm = 1000; // pavza med dvema PWM impulzoma, ko nimamo odboja (v ms)
t1_p4 = 2000; // čas minimalne potrebne prisotnosti v msec
t2_p4 = 1000; // čas zakasnitve odpiranja ventilas v msec, ko ni več odboja v msec
t3_p4 = 5000; // čas spiranja v msec
program_4 = 1; // vkluči program 4
program_1 = 0; // izkluči program 1
program_2 = 0; // izkluči program 2
program_3 = 0; // izkluči program 3
break;
default: break;
}
}

// DOPIŠI KOMENTAR IZ LISTA

/******************************************************************************/
/**************************** GLAVNI PROGRAM **********************************/
/******************************************************************************/

void main( void )
{
WDTCTL = WDTPW + WDTHOLD; // Stop WDT

P1SEL |= 0x08; // postavitev PWM na portu P1.3 (pin)16
P1DIR |= 0x0e; // postavitev P1.3, P1.1 in P1.2 kot output (00001011)
P2DIR |= 0x10; // postavitev P2.4 kot output (00001000)
P1OUT &= ~0x0e; // na začetku ventil izklopljen
P2OUT &= ~0x10;
_BIC_SR( OSCOFF );

BCSCTL1 |= XTS; // high frequency oscilator
do
{
IFG1 &= ~OFIFG;
for( i = 0; i < 0xff; i++ ); // potrebna zakasnitev,
} while( (IFG1 & OFIFG) != 0 ); // da lahko kvarc zaoscilira

BCSCTL2 = 0xc8; // MCLK = LFXT1CLK, SMCLK = LFXT1CLK

TACTL = TASSEL_1 + TACLR; // ACLK, clear TAR
TACTL |= MC_1; // Start Timer_A in up mode
CCR0 = 107; // (105 je najboljse) PWM perioda 38kHz
CCTL0 = CCIE; // CCR0 interrupt enabled

CCR2 = 53; // PWM duty cycle 50% (107/2)
TACCTL2 = 0xa0; // PWM reset (PWM ne dela)

_EINT(); // omogocimo globalno prekinitev

__enable_interrupt();

/******************* ZAČETNA INICIJALIZACIJA SPREMENLJIVK *****************************/
//* ZARADI VARNOSTI POSTAVIMO VSE INDIKATORJE IN TIMERJE NA 0 (razen nujno potrebnih)
t_po = 0;
g_chLEDTimerInd = 0;
g_chLEDTimer2Ind = 0;
g_chTimerInd = 1; // takoj omogocimo timer za PWM
g_chTimer2_p4Ind = 0;
g_chTimer3_p4Ind = 0;
g_chTimer1_p1Ind = 0;
g_chTimer2_p1Ind = 0;
g_chTimer3_p1Ind = 0;
g_chTimer4_p1Ind = 0;
g_chTimerVARInd = 1; // takoj omogoči detekcijo (samo v začetku programa izklopi varnost) !!!!! popravi testno Darko
g_chSTARTInd = 0;
g_uiTimer = 0;
g_uiTimer1_p1 = 0;
g_uiTimer2_p1 = 0;
g_uiTimer3_p1 = 0;
g_uiTimer4_p1 = 0;
g_uiTimer1_p2 = 0; // postavitev timerjev na 0
g_uiTimer2_p2 = 0; // da se ne zgodi da bi na zacetku programa zaceli
g_uiTimer2_p4 = 0; // nekaj steti ko se nebi smeli
g_uiTimer3_p4 = 0;
g_uiLEDTimer = 0;
g_uiLEDTimer2 = 0;

program_1 = 0;
program_2 = 0;
program_3 = 1;
program_4 = 0;
program = 3;

iTime = 500; // za zacetek 100ms pauze med dvema PWM impulzoma
g_chDELAYInd = 1; // takoj omogočimo začetek štetja zakasnitve glavne zanke
g_uiTimerDelay = 1; // dvo-sekundna zakasnitev za prvi vstop v glavno zanko


//IZBIRA_PROGRAMA//;
//INICIALIZACIJA_PARAMETROV (); //sWITCH-CASE
//Itime = t_nopwm
while(!g_chSTARTInd)
{
P1OUT &= ~0X01;
P2OUT &= ~0X08;
}
while(1)
{
g_iDETInd = 0;
INICIALIZACIJA_PARAMETROV(); // Switch-case

/************** V TO ZANKO SKOCI, CE JE OMOGOCEN PROGRAM 1 ********************/
while( program_1 && program == 1 )
{
WDTCTL = WDT_ARST_1000; // Watchdog nastavljen na 1000ms

IZBIRA_PROGRAMA();
PWM();
DETEKT();
SAMODEJNO_SPIRANJE();

if (g_iDETInd) // ce je detekcija
{
g_uiTimer3_p1 = t3_p1; // postavljaj t3_p1
}
else // ce ni detekcije
{
g_uiTimer1_p1 = t1_p1; // postavljaj t1_p1
}

//prvo spiranje
if (g_chTimer1_p1Ind && g_chTimerVARInd)
{
ODPRI(); // odpri ventil za vodo (P1.1)
g_uiTimer2_p1 = t2_p1; // drzi ga odprtega t2_p1
g_chTimer1_p1Ind = 0;
}

if (g_chTimer2_p1Ind)
{
ZAPRI(); // zapri ventil za vodo (P1.1)
g_chTimer2_p1Ind = 0;
g_uiTimerPON = t_pon;
}

//drugo spiranje
if (g_chTimer3_p1Ind && g_chTimerVARInd)
{
ODPRI(); // odpri ventil za vodo (P1.1)
g_uiTimer4_p1 = t4_p1; // drzi ga odprtega t4_p1
g_chTimer3_p1Ind = 0;
}

if (g_chTimer4_p1Ind)
{
ZAPRI(); // zapri ventil za vodo (P1.1)
g_chTimer4_p1Ind = 0;
g_uiTimerPON = t_pon;
}
}

/************** V TO ZANKO SKOCI, CE JE OMOGOCEN PROGRAM 2 ********************/
while( program_2 && program == 2 )
{
WDTCTL = WDT_ARST_1000; // Watchdog nastavljen na 1000ms
IZBIRA_PROGRAMA();
PWM();
DETEKT();
SAMODEJNO_SPIRANJE();

if (g_iDETInd) // ce je detekcija
{
g_uiTimer2_p2 = t2_p2; // postavljaj t2_p2
}
else // ce ni detekcije
{
g_uiTimer1_p2 = t1_p2; // postavljaj t1_p2
}

if (l_chPR2VentilInd)
ODPRI(); // odpri ventil za vodo (P1.1)
else
{
if (!l_chPONInd) // če samodejno izpiranje ni v teku potem

ZAPRI(); // zapri ventil za vodo (P1.1)
}
}

/************** V TO ZANKO SKOCI, CE JE OMOGOCEN PROGRAM 3 ********************/
while( program_3 && program == 3 )
{
WDTCTL = WDT_ARST_1000; // Watchdog nastavljen na 1000ms

IZBIRA_PROGRAMA();
PWM();
SPI();
DETEKT();
//SAMODEJNO_SPIRANJE();//
// SPI();

if (g_iDETInd) // stirikratno preverjanje detekcije
{
ODPRI();
}
else if (!l_chPONInd)
{
ZAPRI();
}
// SPI();
}

/************** V TO ZANKO SKOCI, CE JE OMOGOCEN PROGRAM 4 ********************/
while( program_4 && program == 4 )
{
WDTCTL = WDT_ARST_1000; // Watchdog nastavljen na 1000ms

IZBIRA_PROGRAMA();
PWM();
DETEKT();
SAMODEJNO_SPIRANJE();

if (g_iDETInd) // stirikratno preverjanje detekcije
{
g_uiTimer2_p4 = t2_p4;
}

else
g_uiTimer1_p4 = t1_p4;

if (g_chTimer2_p4Ind && g_chTimerVARInd && g_chTimer1_p4Ind)
{
ODPRI(); // odpri ventil za vodo (P1.1)
g_uiTimer3_p4 = t3_p4; // drzi ga odprtega za čas t3_4
g_chTimer2_p4Ind = 0;
}
if (g_chTimer3_p4Ind)
{
ZAPRI(); // zapri ventil za vodo (P1.1)
g_chTimer3_p4Ind = 0;
g_uiTimerPON = t_pon;
g_chTimer1_p4Ind = 0;
}
}
}
}
//************ VSI TIMERJI, KI SE NAHAJAJO V PROGRAMU (interrupt) **************

void Timer_A ( void ) __interrupt[TIMERA0_VECTOR]
{
g_uiTemp += 1;
if( g_uiTemp < 38 ) // interrupt zakasnimo tako da se izvede le na vsako 1ms
return;

//------------------------------------------------------------------------------
if( g_uiTimer > 0 )
{
g_uiTimer -= 1;
if( g_uiTimer == 0 ) // timer za trajanje delovanja oz. nedelovanja PWMa
g_chTimerInd = 1;
}

if (g_uiLEDTimer > 0)
{
g_uiLEDTimer--;
if (g_uiLEDTimer == 0) // timer za zakasnitv izklopa detect LED diode
g_chLEDTimerInd = 1;
}

if (g_uiLEDTimer2 > 0)
{
g_uiLEDTimer2--;
if (g_uiLEDTimer2 == 0) // timer, ki omogoca samo 1x d++ v enem PWM impulzu
g_chLEDTimer2Ind = 1;
}

if (g_uiTimerVAR2 > 0)
{
g_chTimerVAR2Ind = 0;
g_uiTimerVAR2--;
if (g_uiTimerVAR2 == 0) // timer za pravilno postavljanje t_var
g_chTimerVAR2Ind = 1;

}
//----------------------------------------------------------------------------

if (SPITimer > 0)
{
SPITimer--;
if (SPITimer == 0)
{
// P1OUT &= ~0x04;
_BIC_SR_IRQ(LPM2_bits);
}
}

//----------------------------------------------------------------------------

if (g_uiTimer1_p1 > 0)
{
g_uiTimer1_p1--;
if (g_uiTimer1_p1==0) // timer za zakasnitev vklopa ventila
{
g_chTimer1_p1Ind=1;
}
} // PROGRAM 1 (prvo spiranje)
if (g_uiTimer2_p1 > 0)
{
g_uiTimer2_p1--;
if (g_uiTimer2_p1==0) // timer za trajanje vklopa ventila
{
g_chTimer2_p1Ind=1;
pr1_dInd=1;
}
}

//-----------------------------------------------------------------------------

if (g_uiTimerTEST > 0)
{
g_uiTimerTEST--;
if (g_uiTimerTEST==0)
{
TEST=1;
P1OUT &= ~0x02;
}
}

if (g_uiTimerTEST1 > 0)
{
g_uiTimerTEST1--;
if (g_uiTimerTEST1==0)
{
TEST1=1;
P2OUT &= ~0x10;
}
}

//--- ------------- --------- --------

if (g_uiTimer3_p1 > 0)
{
g_uiTimer3_p1--;
if (g_uiTimer3_p1==0 && pr1_dInd) // timer za zakasnitev vklopa ventila
{
g_chTimer3_p1Ind=1;
}
} // PROGRAM 1 (drugo spiranje)
if (g_uiTimer4_p1 > 0)
{
g_uiTimer4_p1--;
if (g_uiTimer4_p1==0) // timer za trajanje vklopa ventila
{
g_chTimer4_p1Ind=1;
pr1_dInd=0;
}
}
//------------------------------------------------------------------------------

g_uiTimer1_p2--;
if (g_uiTimer1_p2 == 0) // timer za zakasnitev vklopa ventila
l_chPR2VentilInd = 1;
// PROGRAM 2
g_uiTimer2_p2--;
if (g_uiTimer2_p2 == 0) // timer za zakasnitev izklopa ventila
l_chPR2VentilInd = 0;

//------------------------------------------------------------------------------

if (g_chTimer1_p4Ind && (g_uiTimer2_p4 > 0))
{
g_uiTimer2_p4--;

if (g_uiTimer2_p4==0) // timer za zakasnitev vklopa ventila
{
g_chTimer2_p4Ind=1;
}
} // PROGRAM 4

if (g_uiTimer3_p4 > 0)
{
g_uiTimer3_p4--;
if (g_uiTimer3_p4==0) // timer za trajanje vklopa ventila
{
g_chTimer3_p4Ind = 1;
}
}

if (g_uiTimer1_p4 > 0)
{
g_uiTimer1_p4--;
if (g_uiTimer1_p4==0) //
{
g_chTimer1_p4Ind = 1;
}
}

// -------------------------------------------------------darko vnos ----------------------------------------------

if (g_uiTimerVAR > 0) // timer za maximalno prisotnost (t-var)
{
g_uiTimerVAR--;
if (g_uiTimerVAR == 0)
{
g_chTimerVARInd = 0;
}
}

if (g_chTimerPOInd && (g_chTimerVARInd == 0))
{
g_uiTimerPO--; // timer za prekinitev odbija ( deluje le kopride do prekoračitve varnostnega časa )
if (g_uiTimerPO ==0)
{
g_uiTimerVAR = t_var;
g_chTimerVARInd = 1;
g_uiTimerPO = t_po;
g_chTimerPOInd = 0;
}
}
//----------------------------------------------------------konec vnosa Darko --------------------------------------


//****************** timerji ki odstevajo na vsako 1sec ************************

if (++g_uiTemp1 == 1000)
{
if (g_uiTimerVAR > 0) // timer za max prisotnost (t_var)
{
g_uiTimerVAR--;
if (g_uiTimerVAR == 0)
{
g_chTimerVARInd = 0;
}
}
//------------------------------------------------------------------------------
if (g_chTimerPOInd && (g_chTimerVARInd == 0))
{
g_uiTimerPO--; // timer ta prekinitev odboja (deluje le ko
if (g_uiTimerPO == 0) // pride do prekoracitve varnostnega casa)
{
g_uiTimerVAR = t_var;
g_chTimerVARInd = 1;
g_uiTimerPO = t_po;
g_chTimerPOInd = 0;
}
}
//------------------------------------------------------------------------------
if (g_uiTimerPON > 0)
{
g_uiTimerPON--; // timer za samodejno spiranje (t_pon)
if (g_uiTimerPON == 0)
{
g_chTimerPONInd = 1;
g_uiTimerPON = t_pon;
}
}
if (g_uiTimer_SS > 0)
{
g_uiTimer_SS--; // timer za trajanje samodejnega spiranja (t_ss)
if (g_uiTimer_SS == 0)
{
g_chTimer_SSInd = 1;
}
}
//------------------------------------------------------------------------------

if (g_chDELAYInd )
{
g_uiTimerDelay--; // timer za prekinitev odboja ( deluje le ko pride do prekoračitve varnostnega časa)
if (g_uiTimerDelay == 0)
{
g_uiTimerDelay = 2;
g_chSTARTInd = 1;
g_chDELAYInd = 0;
}
}
g_uiTemp1 = 0; // postavitev sekundnega timerja na 0
}
g_uiTemp = 0; // postavitev milisekundnega timerja na 0
}
/******************************************************************************/
/********************* KONEC GLAVNEGA PROGRAMA ********************************/
/******************************************************************************/

  • I know the code is long and not really optimized and i'm sorry for that. 

    I don't need very sophisticated solution to lower the consumption, the simplest solution will do it.

  • You could start by changing your post and use the ‘insert code’ button (please re-post it from the source with indentation). It will greatly increase the chance that someone will bother reading it.
    The comments in, well, whatever language this is, do not help too to understand what’s going on..

    I see lots of redundant code which surely can be streamlined. And the code never sends the CPU into a low power mode. You said you tried without success.
    Main purpose of LPM is to not wait for a hardware event by idling/looping around. If the hardware event can trigger an interrupt, go into LPM in main code, and the ISR for the event will wake it when the event happened. In the meantime, the CPU will not consume energy for doing nothing. That’s the main idea. Start with LPM0, as this will simply halt the CPU and does not interfere with anything else.

**Attention** This is a public forum