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

📄 isr.c

📁 MST720-DEMO程序
💻 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 + -