⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 power_module.c

📁 一个电表的程序
💻 C
字号:
/*===========================================================================
* 			 2006年。三星仪表SOC芯片开发项目
*
*
* 文件名称:Power_Module.c
* 文件标识:
* 摘    要:
*
*
* 当前版本:Ver 1.0
* 作    者:罗冬生
* 修改内容:
* 修改日期:
* 完成日期:

===============================================================================================*/
#ifndef   _Power_Module_
#define   _Power_Module_

//===============================================================================================

#include "includes.h"

//===============================================================================================

void GotoSleep(void)
{
   //   LCDCON =0;
      /*
      PINMAP0 = 0xFF;
       PINMAP1 = 0xFF;
       PINMAP2 = 0xFF;
    */
    IE_bit.EA   = 0;
    IPSMF = 0;
    //todo:shut down the core
    KYREG = 0xa7;
    POWCON = 0x10;
    asm(" NOP ");
    asm(" NOP ");
    asm(" NOP ");
}

//    电源中断管理程序


#pragma vector=0x43
__interrupt void PSM_ISR(void)
{

  if (IPSMF_bit.FVDC)
  {
    IPSME_bit.EVDCIN =0;                     //关闭Vin(+12v)检测中断
    if (!E2_Op_Flg)            //如果E2PROM正在操作
    {
      SaveData();         //掉电数据保存
      SaveData_Flg = 1;
    }
  }
  if (IPSMF_bit.FPSR)
  {                         //恢复220v供电
    IPSMF_bit.FPSR = 0;
  }
  IPSMF=0;
}

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

    void SaveData(void)
    {
      rPKwhPwrSum_Dtr[0]=DataSum(rPPwrKwh_Dtr,20);
      rNKwhPwrSum_Dtr[0]=DataSum(rNPwrKwh_Dtr,20);
      rPKvarhPwrSum_Dtr[0]=DataSum(rPPwrKvarh_Dtr,20);
      MoveData_Api((unsigned int)(&rUpDownPowerDataBuf[0])+iRAM_Adr,eUpDownPowerDataBuf+e2RAM_Adr,UpSaveDataLen); //装载掉电时的数据
    }
//       正常工作模式RunPSM0(外电源供电)
//  1、
//
//
//
//

 void RunPSM0(void)
 {
//   unsigned char i;
    ClearWatchDog();
    BATPR = 0;                       //Battery switchover was enabled on low Vdd.
    Timer0_Init();                   //BUZHIDAO  用来做什么?
    RTC_Init();                      //RTC初始化

      LcdInit();                     //LCD初始化
      I2C_Init();                    //I2C初始化
      ClearWatchDog();               //喂狗

      SysData_Init();

      MeasurementInit();
      UartInit();


    Disp_Flg = 0;                            // 置停显标志
    LcdSetDisplay(0xff);                     // 清显示屏  (也可以置lcd不使能)
    Disp_Time = 3;



    EnergyModuleInit();                    //能量模块已复位,初始化模块

    IPSMF = 0;                                //电源模块所有中断标志清零
    IPSME = 0;                                //电源模块所有中断使能都关闭

    //IPSME_bit.EVDCIN =1;                     //Vin(+12v)检测中断使能
    //IEIP2_bit.EPSM =1;                       //电源模块中断使能(FVDC中断,PSR中断为不可屏蔽)

 //   PS_FVDC =0;                               //清 CT 供电标志


    IPSMF = 0;                                //电源模块所有中断标志清零
    IPSME = 0;                                //电源模块所有中断使能都关闭

    if (SCON   != 0xD0)
       G_LED = 0;


    IE_bit.EA=1;

 //   DelayMs(255);                 //延时10ms

    P_LED = 1;


    while(PERIPH_bit.VSWSOURCE)

    {
  //      P_LED = 1;
        ClearWatchDog();
        if(IPSMF_bit.FVDC) //VDCIN falling detected   (状态位)
        {
            //todo: backup data and then shut down the core if battery swithover occurs.
            //IPSMF_bit.FVDC = 0;
            //EnergySave();
             P_LED = 0;
             DelayMs(255);
            IE_bit.EA = 0;
            if (!SaveData_Flg)
               SaveData();              //掉电数据保存

            while(IPSMF_bit.FVDC)       //12V input test
            {
               if(IPSMF_bit.FBSO)      //电池供电否?
                {
                    IPSMF = 0;        //software clear the  flag

                    //BATPR = 0x01;//Battery switchover on low VDD and low VDCIN
                    //FlagPSM_bit.FlagBSO = 0;
                    //RTCAlarmDisable();
                    //LcdBlinkEnable();
                   // LcdDisplay();
                    GotoSleep();
                }
                else if(IPSMF_bit.FPSR)     //外电源VDD供电恢复检测
                {
                    IPSMF_bit.FPSR = 0;
                    //SoftReset();
                }

                //G_LED = 0;

            }
            SaveData_Flg = 0;
            IPSME_bit.EVDCIN =1;                     //开启Vin(+12v)检测中断
            IE_bit.EA = 1;
        }
        else
        {                     //以下是正常电源下的工作程序
          TimeModule();
          CommModule();
          SecModule();
          KeyDispModule();
          /*
          TimeModule();
          LcdDispModule();
          CommModule();
          */
       }
    }
 }





/*

   while (!Run_Mode)                         // Run_Mode=0(正常工作模式)
   {
      ClearWatchDog();
      if (PERIPH_bit.VSWSOURCE)               //判断供电方式,220V供电,内循环,电池供电推出模块
      {
         if (IPSMF_bit.FVDC)                  //12v电源是否降低?
         {
            if (PowerDown_Flg)
            {
               ;                                    //掉电数据处理
               PowerDown_Flg = 0;
            }

           // 此处插入电源工作在低电压区模式(12V已低,但VDD5v还有又没有进入电池供电)
         }
         else
         {                     //以下是正常电源下的工作程序
            ClearWatchDog();
            TimeModule();
            LcdDisp_Module();
         }
      }
      else
      {
         Run_Mode = 1;               //Run_Mode = 1,置电池供电工作模式
         if (PowerDown_Flg)
         {
             ;                                    //掉电数据处理
             PowerDown_Flg = 0;
         }
        if (PERIPH_bit.VSWSOURCE)
        {
          ShowXH(Disp_XH_Buffer[0]);           //刷新显示缓冲区的数据
          GotoSleep();

        }
      }
   }
}


*/
 void RunPSM1(void)
 {


    ClearWatchDog();
    RTC_Init();
    TIMECON = (TIMECON & 0x84) | 0x51;     // 24小时,

 //   Timer0_Init();
  //  LcdInit();
    Disp_Flg = 0;                            // 置停显标志
    LcdSetDisplay(0x07);                     // 清显示屏  (也可以置lcd不使能)
    Disp_Time = 3;


       PINMAP0 = 0xFF;
       PINMAP1 = 0xFF;
       PINMAP2 = 0xFF;

 //   I2C_Read (I2C_SlvAdr,0x10,(unsigned int)&TimeBuffer[3]+iRAM_Adr,4);

    TCON_bit.IT0 = 1;                //外部输入0为边沿触发
    TCON_bit.IE0 = 1;                //外部输入0中断使能
    INTPR =0;

    IPSMF = 0;                                //电源模块所有中断标志清零
    IPSME = 0;                                //电源模块所有中断使能都关闭

//    IPSME_bit.EVDCIN =0;// 1;                     //Vin(+12v)检测中断使能
 //   IEIP2_bit.EPSM = 0;                       //电源模块中断使能(FVDC中断,PSR中断为不可屏蔽)

 //   PS_FVDC =0;                               //清 CT 供电标志

    IE_bit.EA=1;
    GotoSleep();

 }


//=======================================================================================
#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -