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

📄 intprg.c

📁 一个电表的程序
💻 C
字号:
/***********************************************************************/
/*                                                                     */
/*  FILE        :intprg.c                                              */
/*  DATE        :Wed, Jul 20, 2005                                     */
/*  DESCRIPTION :Interrupt Program                                     */
/*  CPU TYPE    :H8/38004F                                             */
/*                                                                     */
/*  This file is generated by Renesas Project Generator (Ver.3.1).     */
/*                                                                     */
/***********************************************************************/
                  


#include	<machine.h>

#include	"iodefine.h"
#include    "intprg.h"
#include 	"extern.h"

/******************************************************************************/
#define		RX_IN			(IO.PCR4 = 0x05)
#define		Rx_Receive		(IO.PDR4.BIT.B3)
#define		Rx_IntIrq_Flg	(IRR1.BIT.IRRI0)
#define		Ir_Txd			(IO.PDR3.BIT.B7)				//红外数据发送I/O
#define		Cf_IntIrq_Flg	(IRR1.BIT.IRRI1)
#define		Cf_Io_Data		(IO.PDRB.BIT.B3)
#define		Sec_IntIrq_Flg	(IRR1.BIT.IRRTA)		
#define		Power_IntIrq_Flg	(IWPR.BIT.IWPF0)
#define		Power_Io_Data		(IO.PDR5.BIT.B0)
#define		Re_Te			(IO.PDR4.BIT.B0)				//控制RS485发送/接收
#define		Cf_Led			(IO.PDR9.BIT.B3)
#define		Cf_Test			(IO.PDR9.BIT.B1)

/******************************************************************************/
 	
#pragma section IntPRG
// vector 1 Reserved

// vector 2 Reserved

// vector 3 Reserved

// vector 4 IRQ0

void delay_100us(void)
{
	unsigned char i_delay;
	for (i_delay=0;i_delay<10;i_delay++)
	 {
		nop();
	  }
 }

void   Batt_WorkTime(void)
{
   IO.PCR5 = 0xFE;			//POWER作为输入、WP1、SCL1、SDA1作为输出
   if(!Power_Io_Data)		//电源不正常
    {
	    Batt_WorkSec_Cnt += 0x01;
        if(Batt_WorkSec_Cnt > 60)
	     {  
		     Batt_WorkSec_Cnt = 0x00;
		     RBatt_WorkTm_Dtr[0] = Data_BcdAdd(RBatt_WorkTm_Dtr[0]);
		     if(RBatt_WorkTm_Dtr[0] == 0x00)
		      {
		         RBatt_WorkTm_Dtr[1] = Data_BcdAdd(RBatt_WorkTm_Dtr[1]);
		         if(RBatt_WorkTm_Dtr[1] == 0x00)
			      {
			          RBatt_WorkTm_Dtr[2] = Data_BcdAdd(RBatt_WorkTm_Dtr[2]);
                   }
               }
           }
	}
}

__interrupt(vect=4) void INT_IRQ0(void)			//外部中断用作红外接收触发
{
	Rx_IntIrq_Flg 	=	0;
//	RX_IN;
    if(!Rx_Receive)								//查询Rx管脚电平为低
     {
        if (!Rx_Receive)
         {
            delay_100us() ;
          	if(!Rx_Receive)
          	 { 
			 	TMRF.TCFL = 0x00;				//定时器FL计数器清零
		   		Rx_End = 0;
		   		Rx_End_8bit = 0;
		   		Rx_End_10bit = 0;
           		Rx_Int = 1;
           		Rx_Star = 1;
           		Rx_Bit_Count = 0x08;
           		Rx_Bit_Count1 = 0x0a;
           		Rx_Receive_data = 0x00;
         	 }
		 }
     } 
 }


// vector 5 IRQ1
__interrupt(vect=5) void INT_IRQ1(void) 
{
   Cf_IntIrq_Flg = 0;						//清除中断请求标志
   delay_100us();
   if(!Cf_Io_Data)
    {
       delay_100us();
       if(!Cf_Io_Data)
        {
           Cf_Int_Flg = 1;
           Cf_Int_Time = 0x00;
		   Cf_Avail_Cnt = 0x00;
          }
 	 }
 }
// vector 6 IRQAEC
__interrupt(vect=6) void INT_IRQAEC(void) {/* sleep(); */}
// vector 7 Reserved

// vector 8 Reserved

// vector 9 WKP0_7
__interrupt(vect=9) void INT_WKP0_7(void) 
{
   if(Power_IntIrq_Flg)						//是否为电源中断请求
    {
       IO.PCR5 = 0xFE;			//POWER作为输入、WP1、SCL1、SDA1作为输出
	   if(!Power_Io_Data)
	    {
		  NOP;
		  NOP;
		  NOP;
		  IO.PCR5 = 0xFE;			//POWER作为输入、WP1、SCL1、SDA1作为输出
		  if(!Power_Io_Data)
		   {
		      Power_Flg.BYTE = 0x01;				//确认为电源掉电信号
			 }
		 }
	 }
   IWPR.BYTE = 0x00;
 }    	   
// vector 11 Timer A Overflow
__interrupt(vect=11) void INT_TimerA(void) 
{
   Sec_IntIrq_Flg = 0;						//清除秒中断请求信号
   Time1s_Flg = 1;								//秒标志信号成立		
   Time1s_Flg1 = 1;								//秒标志信号成立	
   Time1s_Flg2 = 1;
   BrochkSec_Cnt ++;							//广播校时成功后秒计数器+1
   Cf_Alt_TmCnt ++;
   Rtc_Add();
   Batt_WorkTime();
 }
// vector 12 Counter Overflow
__interrupt(vect=12) void INT_Counter(void) {/* sleep(); */}
// vector 13 Reserved

// vector 14 Timer FL Overflow
__interrupt(vect=14) void INT_TimerFL(void) 
{
	TMRF.TCFL =	0x00;
	IRR2.BIT.IRRTFL = 0;
	if(RxTxState_Comm == AtRxState_Comm)			//系统处于接收状态
	 {
        if(Rx_Int)								//红外中断
        {
	      if((Rx_Command_Flg.BYTE & 0xfe) == 0x00)
		   {
		      Rx_Command_Flg.BYTE = 0x00;
			  IENR1.BYTE |= 0x01;				//开启红外接收中断
		    }
		  else
		   {
           	  IENR1.BYTE &= 0xFE;			//关闭红外接收中断
		    }
          if(!Rx_End)						//处于红外1字节接收查询状态
           {
              if(Rx_Star)						//处于红外字节接收位查询状态
               {
                  if(Rx_Receive)				//如Rx管脚为高电平			
                   {
				 	  Rx_Receive_data += cMsbBitTbl[Rx_Bit_Count-1];
                 	  Rx_bit_verf = !Rx_bit_verf; 	//字节校验位取反
                    }
				  Rx_Bit_Count = --Rx_Bit_Count;
				  Rx_Bit_Count1 = --Rx_Bit_Count1;
                  if(Rx_Bit_Count == 0x00)			//字节8位接收完毕
                   {  
				 	  Rx_End = 1;
                      Rx_Star = 0;
					  Rx_End_8bit = 1;				//字节接收处于校验状态
                    }
                 }
		    }
		  else if(Rx_End_8bit)					//为1字节接收校验位
		   {
//  		  Rx_Stop = 1;
              Rx_End_10bit = 1;					//字节接收处于停止状态
			  Rx_End_8bit = 0;
			  if(Rx_Receive == Rx_bit_verf)		//Rx电平与该字节校验位相同
               {
			      Rx_Bit_Count1 = --Rx_Bit_Count1;
			    }
		    }
		  else if(Rx_End_10bit)
		   {
		      Rx_Stop = 1;
		      Rx_Bit_Count1 = --Rx_Bit_Count1;
            }
          if(Rx_Stop) 
			{
			   if(Rx_Bit_Count1 == 0x00)			//该字节接收成功
			    {
			       *BufferTail_Comm = Rx_Receive_data;
				   ++BufferTail_Comm;
				   Tx_Txd_Comm_Flg = 0x33;
				   if(BufferTail_Comm > &BufferInOut_Comm[BufferInOutMax_Comm-1])
					{
				       BufferTail_Comm = BufferInOut_Comm;
				 	 }
                   system_timer_in_13ms = 0x00;
				   TxRxTime_Comm = system_timer_in_13ms;//时钟
                   Rx_Command_Flg.BYTE = 0x00;
			       IENR1.BYTE |= 0x01;
				 }

             }
		  }
         else
		  {
		      IENR1.BYTE |= 0x01;							//开启红外接收中断
			  CKSTPR2.BYTE &=0xfd;				//关闭红外调制信号
           }
      }
    else if (Tx_Flg == 0x68)    
	 {
            IENR1.BYTE &= 0xfe;							//关闭红外接收中断				
		    if(Tx_Bgin)										//为字节发送起始状态
             {
                Tx_Data = *BufferHead_Comm++;				//发送数据送发送字节缓冲
				if(Tx_Data == 0x16)
				 {
				   NOP;
                  }
                TxData_state.BYTE = 0x02;					//红外1字节数据发送标志
                CKSTPR2.BYTE |= 0x02;						//开启38.4kHz调制波								
                Ir_Txd = 0;									//红外发送起始
                Tx_Bit_Len = 0x0f;							//红外发送1字节总位数
              }
            else  if(Tx_Next)
             {
                if((Tx_Data & cMsbBitTbl[Tx_Bit_Len-8]))		//为高电平	
                 {
			        CKSTPR2.BYTE &= 0xfd ;					//关红外调治信号	
                    Ir_Txd = 1;						
                    Tx_Odd = !Tx_Odd;
                  }
                else
                 { 
			        Ir_Txd = 0;
				    CKSTPR2.BYTE |= 0x02;					//开启红外调制信号
                  }
                Tx_Bit_Len = --Tx_Bit_Len;
                if(Tx_Bit_Len == 0x07)						//下一位为发送校验位,置校验标志
                  {
                     Tx_Odd_flg = 1;
                     Tx_Next = 0;
                   }
              }	
            else  if(Tx_Odd_flg)
             {
                if(Tx_Odd)
                 {
                    CKSTPR2.BYTE &= 0xfd;					//关闭红外调制信号	
                    Ir_Txd=1;
                   }
                else
                 {
			        CKSTPR2.BYTE |= 0x02;					//开启红外调制信号
                    Ir_Txd = 0;
                  }
                Tx_Odd_flg = 0;
                Tx_End = 1;
		        --Tx_Bit_Len;
              }  
            else if(Tx_End)
             { 				
			    Ir_Txd = 1;
				CKSTPR2.BYTE &=0xfd;				//关闭红外调制信号
		        --Tx_Bit_Len;
				if((Tx_Bit_Len==0) && (BufferHead_Comm!= BufferTail_Comm))
				 {
		    	    Tx_End = 0;		
				    TxData_state.BYTE = 0x01;		  
				    if(BufferHead_Comm > &BufferInOut_Comm[BufferInOutMax_Comm-1])
				     {
				        BufferHead_Comm=BufferInOut_Comm;
				      }
                     system_timer_in_13ms = 0x00;
				     TxRxTime_Comm=system_timer_in_13ms;//时钟
                  }

              }
	       else
	        {
		       Set_RxState();
             }	    
 
     }
 }
// vector 15 Timer FH Overflow
__interrupt(vect=15) void INT_TimerFH(void) 		//1.67ms中断
{
	TMRF.TCFH =	0x00;
	IRR2.BIT.IRRTFH = 0;
	system_timer_in_13ms++;			// 通讯时钟控制
  	IO.PCR5 = 0xFE;			//POWER作为输入、WP1、SCL1、SDA1作为输出
	if(!Power_Io_Data)								//定时查询掉电信号
	 {
	   delay_100us();
	   IO.PCR5 = 0xFE;			//POWER作为输入、WP1、SCL1、SDA1作为输出
	   if(!Power_Io_Data)
	    {
		    delay_100us();
	        IO.PCR5 = 0xFE;			//POWER作为输入、WP1、SCL1、SDA1作为输出
			if(!Power_Io_Data)
			 { 
		       Power_Flg.BYTE = 0x01;				//确认为电源掉电信号
			  }
		  }
	  }	
    if(Cf_Int_Flg)						//为脉冲产生触发信号  
	 {
	    if(Cf_Star == 0x68) 				//前1个脉冲还未处理
         {
		    Cf_Int_Flg = 0;
          }
        else if(Cf_Alt_TmCnt > Cf_Alt_TmConst)	//脉冲间隔时间计数值大于规定值
		 {
		    Cf_Alt_TmCnt = 0x00;				//脉冲间隔时间计数值清零				
            Cf_Int_Flg = 0;						//清除脉冲中断标志,取消该脉冲认可资格,此功能是为防止通0.0004Ib时产生脉冲
          }	
        else
		 {
           ++Cf_Int_Time;
		   if((!Cf_Io_Data) && (Cf_Int_Time < 0x10))		//1脉冲查询次数为16个,脉冲低电平
		    {
		       ++Cf_Avail_Cnt;
             }
           if((Cf_Int_Time > 0x10) || (Cf_Avail_Cnt > 0x0b))	//当查询次数大于16个或查询到的1脉冲有效认可电平次数大于12
		    {
		       Cf_Int_Flg = 0;
			   Cf_Int_Time = 0x00;
             }
           if(Cf_Avail_Cnt > 0x0b)					//该脉冲认可
		    {
		       Led_Cnt = 0x00;						
			   Cf_Star = 0x68;
			   Led_Flg = 1;
			   Cf_Set = 1;
			   Cf_Avail_Cnt = 0x00;
			   Cf_Alt_TmCnt = 0x00;					//脉冲间隔时间清零
             }
          }
      }
    if((Led_Flg) && (Led_Cnt <48))				//脉冲指示点亮小于80ms
	 {
	    ++Led_Cnt;
		Cf_Led = 0;								//脉冲点亮
		Cf_Test = 0;							//输出1个测试脉冲
      }
	else 
	 {
	    Led_Flg = 0;
		Cf_Led  = 1;							//脉冲灯关闭
		Cf_Test =1;
      }
	
 }
// vector 16 Reserved

// vector 17 Reserved

// vector 18 SCI3
__interrupt(vect=18) void INT_SCI3(void) 
{
   if((SCI3.SSR.BYTE & 0x38) != 0x00)					//表示SCI3中断过程有错误发生
    {
	   SCI3.SSR.BYTE = 0x00;
     }
   else if((SCI3.SSR.BYTE & 0x40) == 0x40)				//表示SCI中断为接收过程
    {
	   if(RxTxState_Comm == AtRxState_Comm)				//系统处于接收状态
         {
           *BufferTail_Comm = SCI3.RDR;
           ++BufferTail_Comm;
		   Tx_Txd_Comm_Flg = 0x55;						//为RS485接收状态
	       if(BufferTail_Comm > &BufferInOut_Comm[BufferInOutMax_Comm-1])
		    {
	           BufferTail_Comm = BufferInOut_Comm;
		     }
           system_timer_in_13ms = 0x00;
	       TxRxTime_Comm=system_timer_in_13ms;//通讯时钟控制
          }
      }
   
   else if((SCI3.SSR.BYTE & 0x80) == 0x80)				//表示SCI中断为发送过程
    {
	   if(Txd_Flg == 0x68)
	    {
		   Txd_Flg = 0x00;
		   Re_Te =1;
         }
       else
	    {
           Re_Te = 0;										//使RS485处于发送端	
         }
	   SCI3.TDR = *BufferHead_Comm;
	    
	   if(Txd_Fe_Cnt !=0)
	    {
		   Txd_Fe_Cnt--;
         }
       else if(((BufferHead_Comm - 1)!= BufferTail_Comm) && (Txd_Fe_Cnt == 0x00))
        { 	      
           if(BufferHead_Comm > &BufferInOut_Comm[BufferInOutMax_Comm-1])
            {
              BufferHead_Comm=BufferInOut_Comm;
             }
           BufferHead_Comm++; 
           system_timer_in_13ms = 0x00;
           TxRxTime_Comm=system_timer_in_13ms;//时钟
         }
       else
	    {
		  Set_RxState();
         }
      }
   SCI3.SSR.BYTE = 0x00;
 }

// vector 19 ADI
__interrupt(vect=19) void INT_ADI(void) {/* sleep(); */}
// vector 20 Direct Transition
__interrupt(vect=20) void INT_Direct_Transition(void) {/* sleep(); */}

⌨️ 快捷键说明

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