📄 intprg.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 + -