cancel
Showing results for 
Search instead for 
Did you mean: 

sleep and wake up

SRAM.11
Associate III

for my code the sleep and wake up is happening simultaneously I need  the wake up  only on if(MV>20) and sleep if(MV<100) for a minute(low power mode)

Please someone help to sort it out 

#include "stm8s.h"
#include "stm8s_clk.h"
#include "stm8s_adc1.h"
#include "stm8s_gpio.h"
#include "stm8s_tim2.h"
#include "main.h"
#include "flash.h"
#include "stm8s_iwdg.h"
//#include "stm8s_awu.h"





volatile unsigned short _500ms_tick;
volatile unsigned short idle_counter;

void Clk_Config(void);
void ADC_Config(void);
void GPIO_Config(void);
void EXTI_Setup(void);
void ADC_Read1(uint16_t *MV);
void ADC_Read2(uint16_t *Vbat);
void ADC_Read3(uint16_t *Ocd);
void ADC_Read4(uint16_t *Temp) ;
	void AWU_Config(void);
main()
{
uint16_t MV=0,Vbat=0,Ocd=0,Temp=0;
	unsigned short i;
	int counting = 0;


	Clk_Config();
	
	ADC_Config();
	
	GPIO_Config(); 
		



	
	while(MV<100)
	{
		ADC_Read1(&MV);
	 delay_ms(100);
		Set_LED(0);
		idle_counter++;
		
		if (idle_counter>=300)
		{
		
		 EnterSleepMode();
		}
		
	}
	
	
	while (1)
	
	{
	ADC_Read1(&MV);
  delay_ms(100);
		
	ADC_Read2(&Vbat);
	delay_ms(100);
	
	ADC_Read3(&Ocd);
		delay_ms(100);
		
	ADC_Read4(&Temp);
  delay_ms(100);
	
    if (MV > 20) //                 Mains Detect
				
     WakeupFromSleep();
		{
       if ((MV < 370) && (Vbat > 227))         // Mains Fail
					{
            En_Emergency(1); 
						Set_LED(0);
												
					}
			   			
        else 
        {
            En_Emergency(0);
						Set_LED(0);
			   }
				
			 
				
		}
		if(MV<=10)
		{
			ADC_Read3(&Ocd);
			delay_ms(100);
			Set_LED(0);
						if(Ocd<93 || Ocd>186)
						{
						Set_LED(1); 
						delay_ms(1000);	
						Set_LED(0); 
						delay_ms(1000);	
						Set_LED(1); 
						delay_ms(1000);	
						Set_LED(0); 
						delay_ms(1000);	
						Set_LED(1);
						delay_ms(1000);	
						Set_LED(0); 				
				
							delay_ms(5000);	
				
						}
				else if(Ocd>93 || Ocd<186)
				{
				Set_LED(0);
				}
			
	}
	
		ADC_Read2(&Vbat);
			if (MV < 250)
			{
				Set_LED(0);
			}
			else if(Vbat>460 || Vbat < 155)
			  {
					Set_Bch(1);
					Set_LED(0);
				}
			else if( Vbat>395)
			  {
					
					Set_LED(1); 
					Set_Bch(0);
				}
			else if(Vbat<383)
				{
						Set_LED(1); 
						Set_Bch(1);
				}
			ADC_Read4(&Temp);
			if(Temp>87 || Temp<425)
			{
				Set_Bch(1);
			}
			else //if(Vbat<87 || Vbat>425)
			{
			 Set_Bch(0);
				Set_LED(1); 
				delay_ms(1000);	
				Set_LED(0); 
				delay_ms(1000);	
				Set_LED(1); 
				delay_ms(1000);	
				Set_LED(0); 
				delay_ms(5000);
			 
			}
			
			

			
			


}
}



void Clk_Config()                          //  INTERNAL CLOCK CONFIGUARATION
	{
	CLK_DeInit();
	
	CLK_HSECmd(DISABLE);
	CLK_LSICmd(DISABLE);
	CLK_HSICmd(ENABLE);
	while(CLK_GetFlagStatus(CLK_FLAG_HSIRDY) == FALSE);
	
	CLK_ClockSwitchCmd(ENABLE);
	CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV2);
	CLK_SYSCLKConfig(CLK_PRESCALER_CPUDIV1);
	
	CLK_ClockSwitchConfig(CLK_SWITCHMODE_AUTO, CLK_SOURCE_HSI, 
	DISABLE, CLK_CURRENTCLOCKSTATE_ENABLE);
	

	CLK_PeripheralClockConfig(CLK_PERIPHERAL_ADC, ENABLE);
	 CLK_PeripheralClockConfig(CLK_PERIPHERAL_TIMER2, ENABLE);
	}

void ADC_Config()                      //              ADC INITIALIZATION
	{
		 ADC1_DeInit();
		
		 ADC1_Cmd(ENABLE);

     ADC1_ITConfig(ADC1_IT_EOCIE, ENABLE);
		
	}
	
void ADC_Read1(uint16_t *MV)
{
	
	  ADC1_Init(ADC1_CONVERSIONMODE_CONTINUOUS,     //   MAINS INPUT
					  ADC1_CHANNEL_5,
					  ADC1_PRESSEL_FCPU_D2, 
					  ADC1_EXTTRIG_GPIO, 
					  DISABLE, 
					  ADC1_ALIGN_RIGHT, 
					  ADC1_SCHMITTTRIG_CHANNEL5, 
					  DISABLE);
    ADC1_StartConversion();
    while (!ADC1_GetFlagStatus(ADC1_FLAG_EOC))
    {
        // Wait for conversion to complete
    }

  *MV= ADC1_GetConversionValue();

}
void ADC_Read2(uint16_t *Vbat)
{
	  ADC1_Init(ADC1_CONVERSIONMODE_CONTINUOUS, //ADC Channel_4 VBATT
					  ADC1_CHANNEL_4,
					  ADC1_PRESSEL_FCPU_D2, 
					  ADC1_EXTTRIG_GPIO, 
					  DISABLE, 
					  ADC1_ALIGN_RIGHT, 
					  ADC1_SCHMITTTRIG_CHANNEL4, 
					  DISABLE);
    ADC1_StartConversion();
    while (!ADC1_GetFlagStatus(ADC1_FLAG_EOC))
    {
        // Wait for conversion to complete
    }

  
	*Vbat=ADC1_GetConversionValue();
}
void ADC_Read3(uint16_t *Ocd)               // ADC Channel_2 OPEN CIRCUIT DETECTION
{
	  ADC1_Init(ADC1_CONVERSIONMODE_CONTINUOUS, 
					  ADC1_CHANNEL_2,
					  ADC1_PRESSEL_FCPU_D2, 
					  ADC1_EXTTRIG_GPIO, 
					  DISABLE, 
					  ADC1_ALIGN_RIGHT, 
					  ADC1_SCHMITTTRIG_CHANNEL2, 
					  DISABLE);
    ADC1_StartConversion();
    while (!ADC1_GetFlagStatus(ADC1_FLAG_EOC))
    {
        // Wait for conversion to complete
    }

  
	*Ocd=ADC1_GetConversionValue();
}
void ADC_Read4(uint16_t *Temp)               // ADC Channel_2 TEMPARATURE MONITORING
{
	  ADC1_Init(ADC1_CONVERSIONMODE_CONTINUOUS, 
					  ADC1_CHANNEL_3,
					  ADC1_PRESSEL_FCPU_D2, 
					  ADC1_EXTTRIG_GPIO, 
					  DISABLE, 
					  ADC1_ALIGN_RIGHT, 
					  ADC1_SCHMITTTRIG_CHANNEL3, 
					  DISABLE);
    ADC1_StartConversion();
    while (!ADC1_GetFlagStatus(ADC1_FLAG_EOC))
    {
        // Wait for conversion to complete
    }

  
	*Temp=ADC1_GetConversionValue();
}

void GPIO_Config(void)
	{
								//GPIO INPUTS
			
		//GPIO_Init(GPIOD,GPIO_PIN_2,GPIO_MODE_IN_FL_NO_IT);			// TEMP SENSE
		GPIO_Init(GPIOD,GPIO_PIN_3,GPIO_MODE_IN_FL_NO_IT);			//VBATT
		GPIO_Init(GPIOD,GPIO_PIN_5,GPIO_MODE_IN_FL_NO_IT);			//MAINS INPUT
		GPIO_Init(GPIOC,GPIO_PIN_4,GPIO_MODE_IN_FL_NO_IT);			// OCD SENSE
		
		
								//GPIO OUTPUTS
								
		GPIO_Init(GPIOA,GPIO_PIN_3,GPIO_MODE_OUT_PP_LOW_FAST);			// MAIN LAMP
		GPIO_Init(GPIOC,GPIO_PIN_3,GPIO_MODE_OUT_PP_HIGH_FAST);			//LED O/P
		GPIO_Init(GPIOC,GPIO_PIN_5,GPIO_MODE_OUT_PP_LOW_FAST);			//BCH
		
	}
void TIM2_Config(void)
{
    TIM2_TimeBaseInit(TIM2_PRESCALER_32768, 244);
    TIM2_ClearFlag(TIM2_FLAG_UPDATE);
    TIM2_ITConfig(TIM2_IT_UPDATE, ENABLE);
    TIM2_Cmd(ENABLE);
		AWU_DeInit();
		
		/* auto wake up at 32ms */
		
}


  
INTERRUPT_HANDLER(TIM2_UPD_OVF_BRK_IRQHandler, 13)
{
    if (TIM2_GetITStatus(TIM2_IT_UPDATE) != RESET)
    {
			
        // Increment the idle_counter every 500ms
        idle_counter++;

        // Enter sleep mode if idle for approximately 30 seconds (60 * 500ms)
        if (idle_counter >= 300)
        {
            EnterSleepMode();
        }
				TIM2_ClearITPendingBit(TIM2_IT_UPDATE);
    }
}

void EnterSleepMode(void)
{
    // Disable TIM2 interrupt
    TIM2_ITConfig(TIM2_IT_UPDATE, DISABLE);

    // Disable ADC peripheral
    ADC1_Cmd(DISABLE);

    // Disable GPIO inputs
    GPIO_Init(GPIOD, GPIO_PIN_3, GPIO_MODE_IN_PU_NO_IT);
    GPIO_Init(GPIOD, GPIO_PIN_5, GPIO_MODE_IN_FL_IT);
    GPIO_Init(GPIOC, GPIO_PIN_4, GPIO_MODE_IN_PU_NO_IT);

   halt();

    // Re-enable ADC peripheral
   ADC1_Cmd(ENABLE);

    // Re-enable GPIO inputs
    GPIO_Init(GPIOD, GPIO_PIN_3, GPIO_MODE_IN_FL_NO_IT);
    GPIO_Init(GPIOD, GPIO_PIN_5, GPIO_MODE_IN_FL_NO_IT);
    GPIO_Init(GPIOC, GPIO_PIN_4, GPIO_MODE_IN_FL_NO_IT);

    // Reset idle counter
    idle_counter = 0;

    // Re-enable TIM2 interrupt
    TIM2_ITConfig(TIM2_IT_UPDATE, ENABLE); 
}

void Inc500mSCounter(void)
{
    if (_500ms_tick < 500)
    {
        _500ms_tick++;
    }
    else
    {
        _500ms_tick = 0;
        idle_counter++;
    }
}
INTERRUPT_HANDLER(EXTI_PORTD_IRQHandler, 6)
{
    uint16_t MV=0;
        // Check if MV > 20
        if (MV > 20)
        {
            // Wake up from sleep mode
            WakeupFromSleep();
        }
		}
void IWDG_Config(void)
	{
		uint8_t WTG_TIME;
	
		IWDG_Enable();
		
	
		IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);
		
		
		IWDG_SetPrescaler(IWDG_Prescaler_128);
		
		
		IWDG_SetReload(0x10);
		
		
		IWDG_ReloadCounter();
		
	}






void WakeupFromSleep(void)
{
	ADC1_Cmd(ENABLE);

    // Re-enable GPIO inputs
    GPIO_Init(GPIOD, GPIO_PIN_3, GPIO_MODE_IN_FL_NO_IT);
    GPIO_Init(GPIOD, GPIO_PIN_5, GPIO_MODE_IN_FL_NO_IT);
    GPIO_Init(GPIOC, GPIO_PIN_4, GPIO_MODE_IN_FL_NO_IT);

    // Reset idle counter
    idle_counter = 0;

    // Re-enable TIM2 interrupt
    TIM2_ITConfig(TIM2_IT_UPDATE, ENABLE);
    
}



0 REPLIES 0