?? drv_timer0.c
字號:
#include "config_60_61.h"
#include "config_GD61.h"
#include "config_GD60.h"
#include "include_GD60.h"
#include "include_GD61.h"
volatile uint16 mSecondTick; // for delay Function
volatile uint16 U1_ModeSwitchDly = MODE_SWITCH_Dly;
volatile uint16 U2_ModeSwitchDly = MODE_SWITCH_Dly*3/2;
volatile uint16 MP_FailedmSecondCnt; // for main power failed detector
volatile uint16 CommandSendTimer;
extern volatile uint8 GetCurrentDataTick;
extern volatile uint8 U1U2_ReadyTimer ; // DSP get ready time
//extern uint16 DO_Buffer;
extern uint16 DO_HoldingTime;
extern volatile uint16 DO_ResTime[MAX_DO_CHANNEL];
/////////////////////////////////////////////////////////////////////////
int32 CurInputA_II; // after calibration
int32 CurInputA_UU;
int32 CurInputA_WP;
int32 CurInputA_QP;
int32 CurInputA_SP;
int32 CurInputA_PF; // PF = P/S
int32 CurInputB_II; // after calibration
int32 CurInputB_UU;
int32 CurInputB_WP;
int32 CurInputB_QP;
int32 CurInputB_SP;
int32 CurInputB_PF; // PF = P/S
int32 CurInputC_II; // after calibration
int32 CurInputC_UU;
int32 CurInputC_WP;
int32 CurInputC_QP;
int32 CurInputC_SP;
int32 CurInputC_PF; // PF = P/S
/////////////////////////////////////////////////////////////////////////
int32 CurInput_II; // after calibration
int32 CurInput_UU;
int32 CurInput_WP;
int32 CurInput_QP;
int32 CurInput_SP;
int32 CurInput_PF; // PF = P/S
int32 CurInputULevel;
int32 CurInputILevel;
int32 CurOutput_I;
int32 CurOutput_U;
int32 CurOutput_WP;
int32 CurOutput_QP;
int32 CurOutput_SP;
int32 CurOutput_PF;
int32 CurOutputULevel;
int32 CurOutputILevel;
extern uint16 Alarm_I_Delta;
extern uint16 Alarm_I_Standard;
extern uint16 Alarm_U_Standard;
extern uint8 Unit1_Addr;
extern uint8 Unit2_Addr;
extern volatile uint16 LD_AlarmCounter;
extern volatile uint16 LD_AlarmEnTimer;
extern volatile uint16 OutReadyTimer;
//volatile uint16 mSecondTick; // for delay Function
volatile uint32 PPPmSecondTick;
volatile uint8 r_waittingTime0;
volatile uint8 r_waittingTime1;
/////////////////////////////////////////////////////////////////////////////
void DelayMS_(uint16 dly);
void __irq IRQ_Timer0Serving (void);
void TimerInitialize(void);
void GetCurrent_IUPQRLC(void);
void ADC_Init(void);
void SetDO_ResTime(uint8 do_channel);
/****************************************************************************
** 函數名稱 :DelayMS() ;delay 1 mil second
** 函數功能 :長軟件延時
** 入口參數 :dly 延時參數,值越大,延時越久
** 出口參數 :無
****************************************************************************/
void DelayMS_(uint16 dly)
{
mSecondTick=(dly+1); //resolution is 1 mS
while(mSecondTick>1);
}
/****************************************************************************
** 函數名稱 :IRQ_Timer0Serving()
** 函數功能 :定時器0中斷服務程序,取反LED9控制口。
** 入口參數 :無
** 出口參數 :無
*****************************************************************************/
void __irq IRQ_Timer0Serving (void)
{
uint8 i;
if(mSecondTick!=0) mSecondTick--; // ms running,for delay Function
if(r_waittingTime0!=0) r_waittingTime0--;
if(r_waittingTime1!=0) r_waittingTime1--;
PPPmSecondTick++;
if(CommandSendTimer!=0) CommandSendTimer--;
////
if(U1_ModeSwitchDly>0) U1_ModeSwitchDly--;
if(U2_ModeSwitchDly>0) U2_ModeSwitchDly--;
////
for(i=0;i<MAX_DO_CHANNEL;i++){
if(DO_ResTime[i]>0) DO_ResTime[i]--;
}
////
#ifdef POWER_LOST_ALARM //enable the counter for power detecting in pulse mode.
if(MP_FailedmSecondCnt <= MAIN_P0WER_FAILED_MSECOND){ //power failed detecting in pulse mode.
MP_FailedmSecondCnt++; //power failed detector stop at (MAIN_P0WER_FAILED_MSECOND+1).
}
#endif
////
T0IR = 0x01; /* 清除中斷標志*/
VICVectAddr = 0x00; /* 通知VIC中斷處理結束*/
}
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
void TimerInitialize(void)
{
IRQDisable();
/* 定時器0初始化 */
T0TC = 0; /* 定時器設置為0 */
T0PR = 0; /* 時鐘不分頻 */
T0MCR = 0x03; /* 設置T0MR0匹配后復位T0TC,并產生中斷 */
T0MR0 = LPC_FPCLK /1000; /* 1/1000秒鐘定時 */
T0TCR = 0x01; /* 啟動定時器 */
/* 設置定時器0中斷IRQ */
VICVectCntl5 = 0x20|INT_TIMER0; /* 設置定時器0中斷通道分配最高優先級*/
VICVectAddr5 = (uint32)IRQ_Timer0Serving; /* 設置中斷服務程序地址*/
VICIntEnable = 1<<INT_TIMER0; /* 使能定時器0中斷*/
IRQEnable();
}
//////////////////////////////////////////////////////////////////////////
void ADC_Init(void)
{
IRQDisable();
PINSEL1=(PINSEL1&(~(0x03<<18)))|(1<<18); // P0.25連接到AD0.4
PINSEL1=(PINSEL1&(~(0x03<<20)))|(1<<20); // P0.26連接到AD0.5
PINSEL1=(PINSEL1&(~(0x03<<22)))|(1<<22); // P0.27連接到AD0.0
PINSEL1=(PINSEL1&(~(0x03<<24)))|(1<<24); // P0.28連接到AD0.1
PINSEL1=(PINSEL1&(~(0x03<<26)))|(1<<26); // P0.29連接到AD0.2
PINSEL1=(PINSEL1&(~(0x03<<28)))|(1<<28); // P0.30連接到AD0.3
PINSEL0=(PINSEL0&(~(0x03<< 8)))|(0x3<< 8); // P0.04連接到AD0.6
PINSEL0=(PINSEL0&(~(0x03<<10)))|(0x3<<10); // P0.05連接到AD0.7
IRQEnable();
}
////////////////////////////////////////////////////////////////////////
// int32 MB_Read_E_Data(uint8 channel,uint16 addr)
// rIa rIb rIc rIt rUa rUb rUc rPa
// rPb rPc rPt rQa rQb rQc rQt
// rSa rSb rSc rSt rPfa rPfb rPfc rPft
////////////////////////////////////////////////////////////////////////
void GetCurrent_IUPQRLC(void)
{
#ifdef EN_LOAD_ALARM
static uint16 OverDeltaTimes=0;
#endif
if((U1U2_ReadyTimer!=0)||(GetCurrentDataTick!=0)) return;
GetCurrentDataTick=5;
CurInputA_II = MB_Read_E_Data(Unit2_Addr,rIa);
CurInputA_UU = MB_Read_E_Data(Unit2_Addr,rUa);
CurInputA_WP = MB_Read_E_Data(Unit2_Addr,rPa);
CurInputA_QP = MB_Read_E_Data(Unit2_Addr,rQa);
CurInputA_SP = MB_Read_E_Data(Unit2_Addr,rSa);
CurInputA_PF = MB_Read_E_Data(Unit2_Addr,rPfa);
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
CurInputB_II = MB_Read_E_Data(Unit2_Addr,rIb);
CurInputB_UU = MB_Read_E_Data(Unit2_Addr,rUb);
CurInputB_WP = MB_Read_E_Data(Unit2_Addr,rPb);
CurInputB_QP = MB_Read_E_Data(Unit2_Addr,rQb);
CurInputB_SP = MB_Read_E_Data(Unit2_Addr,rSb);
CurInputB_PF = MB_Read_E_Data(Unit2_Addr,rPfa);
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
CurInputC_II = MB_Read_E_Data(Unit2_Addr,rIc);
CurInputC_UU = MB_Read_E_Data(Unit2_Addr,rUc);
CurInputC_WP = MB_Read_E_Data(Unit2_Addr,rPc);
CurInputC_QP = MB_Read_E_Data(Unit2_Addr,rQc);
CurInputC_SP = MB_Read_E_Data(Unit2_Addr,rSc);
CurInputC_PF = MB_Read_E_Data(Unit2_Addr,rPfc);
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
if(CurInputA_WP<0) CurInputA_WP=-CurInputA_WP;
if(CurInputA_QP<0) CurInputA_QP=-CurInputA_QP;
if(CurInputA_PF<0) CurInputA_PF=-CurInputA_PF;
if(CurInputB_WP<0) CurInputB_WP=-CurInputB_WP;
if(CurInputB_QP<0) CurInputB_QP=-CurInputB_QP;
if(CurInputB_PF<0) CurInputB_PF=-CurInputB_PF;
if(CurInputC_WP<0) CurInputC_WP=-CurInputC_WP;
if(CurInputC_QP<0) CurInputC_QP=-CurInputC_QP;
if(CurInputC_PF<0) CurInputC_PF=-CurInputC_PF;
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
CurInput_II = CurInputA_II; CurInput_UU = CurInputA_UU;
CurInput_WP = CurInputA_WP; CurInput_QP = CurInputA_QP;
CurInput_SP = CurInputA_SP; CurInput_PF = CurInputA_PF;
CurInputULevel++; CurInputILevel++;
CurOutput_I = CurInputA_II; CurOutput_U = CurInputA_UU;
CurOutput_WP = CurInputA_WP; CurOutput_QP = CurInputA_QP;
CurOutput_SP = CurInputA_SP; CurOutput_PF = CurInputA_PF;
CurOutputULevel++; CurOutputILevel++;
//////////////////////////////////////////////////////////////////////////////
//// alarm bits setting area, //uint16 StateValue;
// if(((StateValue&LIGHT_ON_FLG_BIT)==LIGHT_ON_FLG_BIT)&&(OutReadyTimer==0)){
if(OutReadyTimer==0){
// attach light state; SP>200/10=20VA, set LIGHT_ON_FLG_BIT.
if(CurInput_SP >200){ StateValue = StateValue| LIGHT_ON_FLG_BIT ;}
else{ StateValue = StateValue&(~LIGHT_ON_FLG_BIT);}
// I alarm
if(CurInput_II < I_ALARM_LOW_LIMIT){ StateValue = StateValue| IIII__ALARM_TYPE; }
else{ StateValue = StateValue&(~IIII__ALARM_TYPE);}
// U alarm
if(CurInput_UU < U_ALARM_LOW_LIMIT){ StateValue = StateValue| UUUU__ALARM_TYPE; }
else{ StateValue = StateValue&(~UUUU__ALARM_TYPE);}
// PF alarm
if(CurInput_PF < PF_ALARM_LOW_LIMIT){ StateValue = StateValue| PFPF__ALARM_TYPE; }
else{ StateValue = StateValue&(~PFPF__ALARM_TYPE);}
// load alarm
//
#ifdef EN_LOAD_ALARM
if((CurOutput_U < (Alarm_U_Standard+100))&& //Alarm_U_Standard -/+ 10.0V
(CurOutput_U > (Alarm_U_Standard-100))){
if (((uint16)CurOutput_I < (Alarm_I_Standard-Alarm_I_Delta))||
((uint16)CurOutput_I > (Alarm_I_Standard+Alarm_I_Delta))){
if(OverDeltaTimes==0) DB_SendString("System go into AlarmState");
if(OverDeltaTimes<=OVER_DELTA_TRIGGER_LEVEL) OverDeltaTimes++;
if(OverDeltaTimes>=OVER_DELTA_TRIGGER_LEVEL) StateValue=StateValue|LOAD__ALARM_TYPE;
}else{
if(OverDeltaTimes!=0) DB_SendString("System recover from AlarmState");
OverDeltaTimes=0;
StateValue = StateValue&(~LOAD__ALARM_TYPE);
}
}
#else
StateValue = StateValue&(~LOAD__ALARM_TYPE);
#endif
}
}
///////////////////////////////////////////////////////////////////////////
void SetDO_ResTime(uint8 do_channel)
{
//char dbuff[100];
/*
sprintf(dbuff,"SetDO_ResTime(), channel=%d",channel);
DB_SendString(dbuff);
*/
if(do_channel<MAX_DO_CHANNEL){
if(DO_ResTime[do_channel]==0){
DO_ResTime[do_channel]=DO_HoldingTime;
}
}else{
DB_SendString("SetDO_ResTime: DO channel out of range.");
}
/*
sprintf(dbuff, "DO_ResTime[0]=%d,DO_ResTime[1]=%d,DO_ResTime[2]=%d,DO_ResTime[3]=%d",
DO_ResTime[0], DO_ResTime[1], DO_ResTime[2], DO_ResTime[3]);
DB_SendString(dbuff);
*/
}
//////////////////////////////////////////////////////////////////////////
// end of file //
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -