📄 isr.c
字号:
/******************************************************************************
Copyright (c) 2005 MStar Semiconductor, Inc.
All rights reserved.
[Module Name]: ISR.c
[Date]: 18-Oct-2005
[Comment]:
Interrupt service routines.
[Reversion History]:
*******************************************************************************/
#define _ISR_C_
/********************
* INCLUDE FILES *
*********************/
#include "Project.h"
#include "TypeDef.h"
#include "Ms7X_reg.h"
#include "Global.h"
#include "Mcu.h"
#include "Mcu_reg.h"
#include "Misc.h"
#include "Timer0.h"
#include "Debug.h"
#include "Sync.h"
#include "IR.h"
#include "SI2C.h"
#if ((MARIA_TYPE_SEL == MARIA_2) && ENABLE_VD_DSP)
#include "Maria2_dsp_lib.h"
#endif // ENABLE_VD_DSP
/**********************
* FUNCTION PROTOTYPES *
***********************/
#if IR_ENABLE
void sysISRTimer2(void) interrupt 5 // for IR timer counter interruot
{
ET2 = 0; // disable timer2 interrupt
TR2 = 0; // stop timer2
if (!g_uwIrCycleTimer || g_bIrRepeatStatus)
g_bIrExecute = 0;
TR2 = 1; // start time12
}
////////////////////////////////////////////////////////////////////////////////////////
void sysISRInt1(void) interrupt 2 // for IR interruot
{
TR2 = 0; // stop timer2
g_uwIrPeriodCnt = (((WORD)TH2) * 0x100) + TL2;
TH2 = HIBYTE(IR_TIMER_COUNTER);
TL2 = LOBYTE(IR_TIMER_COUNTER);
TF2 = 0; // clear timer2 overflow flag
ET2 = 1; // enable timer2 interrupt
TR2 = 1; // start timer2
// --------------------------------------------------------------
if (g_bIrExecute == 0) // 1st tigger
{
g_bIrExecute = 1;
g_ucIrBitsCnt = 0;
g_uwIrCycleTimer = IR_CYCLE_TIME;
return;
}
// --------------------------------------------------------------
g_uwIrPeriodCnt -= IR_TIMER_COUNTER; // difference of triggers
if (g_ucIrBitsCnt == 0) // check lead header
{
// check repeat lead code
if (g_bIrRepeatStatus)
{
if (g_uwIrPeriodCnt > (IR_REPAEAT_LEAD_CNT-IR_TOLERANCE_CNT) && g_uwIrPeriodCnt < (IR_REPAEAT_LEAD_CNT+IR_TOLERANCE_CNT))
{
if (g_bIrCheckRepeat)
{
g_bIrRepeat = 1;
g_bIrDetect = 1;
g_uwIrTimer = IR_DELAY_TIME;
}
}
g_bIrExecute = 0;
g_uwIrCycleTimer = IR_CYCLE_TIME;
return;
}
// check genral lead code
if (g_uwIrPeriodCnt > (IR_1ST_LEAD_CNT-IR_TOLERANCE_CNT) && g_uwIrPeriodCnt < (IR_1ST_LEAD_CNT+IR_TOLERANCE_CNT))
{
g_bIrError = 0;
g_bIrRepeat = 0;
g_ucDataCode = 0x00;
g_ucIrDataFifo = 0x00;
}
else // fail lead code
{
g_bIrExecute = 0;
return;
}
}
// --------------------------------------------------------------
else // receive byte code
{
// receive bit
g_ucIrDataFifo >>= 1;
if (g_uwIrPeriodCnt > (IR_LOGIC0_CNT-IR_TOLERANCE_CNT) && g_uwIrPeriodCnt < (IR_LOGIC0_CNT+IR_TOLERANCE_CNT))
g_ucIrDataFifo &= ~_BIT7; // logic 0
else if (g_uwIrPeriodCnt > (IR_LOGIC1_CNT-IR_TOLERANCE_CNT) && g_uwIrPeriodCnt < (IR_LOGIC1_CNT+IR_TOLERANCE_CNT))
g_ucIrDataFifo |= _BIT7; // logic 1
else // mismatch
g_bIrError = 1;
// check bits counter
switch(g_ucIrBitsCnt)
{
case 8: // 1st byte
if (g_ucIrDataFifo != IR_HEADER_CODE0)
g_bIrError = 1;
break;
case 16: // 2nd byte
if (g_ucIrDataFifo != IR_HEADER_CODE1)
g_bIrError = 1;
break;
case 24: // 3rd byte
g_ucDataCode = g_ucIrDataFifo;
break;
case 32: // 4th byte
if (g_ucDataCode != ~g_ucIrDataFifo)
g_bIrError = 1;
if (!g_bIrError)
{
g_bIrRepeatStatus = 1;
g_ucIrCode = g_ucDataCode;
g_uwIrCycleTimer = IR_CYCLE_TIME;
g_bIrDetect = 1;
g_bIrCommand = 1;
g_bIrTime = 0; // IR 1st time repeat
g_bIrCheckRepeat = 0;
g_uwIrTimer = IR_DELAY_TIME;
}
g_bIrExecute = 0;
return;
} // switch
} // if (g_ucIrBitsCnt == 0)
g_ucIrBitsCnt++; // next bit
}
#endif // IR_ENABLE
////////////////////////////////////////////////////////////////////////////////////////
#if RS232DBG
void sysISRUart(void) interrupt 4 // For RS232 debug maseeage
{
if(g_ucUartRxFlag)
{
if(TI)
{
TI=0;
#if USEXDATABUFF
sysTxUartOneByte();
#endif
}
if(RI)
{
RI=0;
#if (RS232DBG&MSG_CMDRECEIVE)
sysRxUartOneByte();
#endif
}
}
else
{
TI=RI=0;
}
}
#endif // RS232DBG
////////////////////////////////////////////////////////////////////////////////////////
void sysISRTimer0(void) interrupt 1 using 1 // For 1ms timer counter
{
BYTE loop;
TR0 = 0;
TH0 = TH_RELOAD_VALUE;
TL0 = TL_RELOAD_VALUE;
TR0 = 1;
#if IR_ENABLE
sysIRDetectTimer0();
#endif
if((g_ucHTtuneTimer > 0) && (g_ucHTtuneCount < 11)) // 20050804 Antony
g_ucHTtuneTimer--; // 20050804 Antony
if(g_ucVDGainTimer > 0)
g_ucVDGainTimer--;
#if ENABLE_VD_COLOR_DETECT
if( g_ucVDColorBurstHandlerTimer )
g_ucVDColorBurstHandlerTimer --;
#endif // ENABLE_VD_COLOR_DETECT
#if 0 //((MARIA_TYPE_SEL == MARIA_2) && ENABLE_VD_DSP)
if(g_bEnableVDDSP)
VD_DSP_Int();
#endif
for (loop=0; loop<NUM_OF_TIMERS; loop++)
{
if (timer_data[loop]>TIMER_ZERO_VALUE)
{
if (timer_data[loop]!=TIMER_INVALID_VALUE)
{
timer_data[loop]--;
}
}
}
}
////////////////////////////////////////////////////////////////////////////////////////
void sysISRInt0(void) interrupt 0 // For SI2C and MARIA interrupt
{
#if SI2C_ENABLE
BYTE ucStatus;
#endif // SI2C_ENABLE
#if SI2C_ENABLE
ucStatus = MCUXFR_11_DDC2BI_FLAG;
if(ucStatus & DATW_INT) // Host write data to Maria
{
if(ucStatus & WORDADR)
g_ucSI2CBuffIndex = 0;
if(g_ucSI2CBuffIndex < 4)
g_ucSI2C_Buff[g_ucSI2CBuffIndex++] = MCUXFR_12_DDC2BI_W_BUF;
else
SI2C_GARBAGE = MCUXFR_12_DDC2BI_W_BUF;
}
else if (ucStatus & DATR_INT)
{
MCUXFR_13_DDC2BI_R_BUF = g_ucSI2C_Buff[3]; //cleatr datr flag
}
else if(ucStatus & STOP_INT) // stop
{
if(g_ucSI2CBuffIndex!=0)
g_bSI2CCommandFlag=1;//Receive one IIC command
}
MCUXFR_11_DDC2BI_FLAG = 0;
#endif // SI2C_ENABLE
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -