📄 interrupt.c
字号:
{
Com2Var.RxBuff[ Com2Var.RxPoint ] = ComVar.UDR2 ; // 接收数据
Com2Var.RxPoint ++;
Com2Var.OverTimer = 0;
SETBIT(Com2Bits,En500ms);
if(Com2Var.RxPoint >=60) // 检测串口是否溢出
{
SETBIT(Com2Bits,ComRST); // 置位串口错误标志
Com2Var.RxPoint = 0;
}
}
}
else // 停止位无效,非法数据
{
SETBIT(Com2Bits,ComRST); // 置位串口错误标志
}
//---------------------------------------------------------
}
}
}
}
// #endif
//-------------------------------------------------------------------------
if(++TimeVar.CommDelay>=12) // 延迟20ms
{
TimeVar.CommDelay = 0;
// 串口1数据定时发送处理
//-------------------------------------------------------------------------
if(CHKBIT(Com1Bits,EnComTx))
{
if(Com1Var.ComTxStep>=2)
{
if(Com1Var.TxPoint >= Com1Var.TxConst)
{ // 串口转接收在安全性里做
CLRBIT(Com1Bits,EnComTx); // 清楚串口发送控制位
SETBIT(Com1Bits,ComRST); // 发送完毕复位串口为接收状态
}
else // 继续发送缓冲区的数据
{
UDR0 = ComVar.TxAllBuff[Com1Var.TxPoint];
Com1Var.TxPoint++;
}
}
else
{
UDR0 = 0xFE;
Com1Var.ComTxStep++;
}
}
// 串口1超时定时处理
//-------------------------------------------------------------------------
if(CHKBIT(Com1Bits,En500ms))
{
if(++Com1Var.OverTimer >= 5) // 延迟约50ms
{
Com1Var.OverTimer = 0;
CLRBIT(Com1Bits,En500ms);
CLRBIT(UCSR0B,RXCIE0); // 禁止串口接收中断
Com1Var.CommEnd = 0xAA; // 置位接收帧尾标志
}
}
//#ifdef _COM2_HW_EN
// 串口2数据定时发送处理
//-------------------------------------------------------------------------
if(++TimeVar.Com2DelayTimer>1)
{
TimeVar.Com2DelayTimer = 0;
if(CHKBIT(Com2Bits,EnComTx))
{
if(Com2Var.ComTxStep>=2)
{
ComVar.UDR2 = Com2Var.TxBuff[Com2Var.TxPoint];
checkp = 0;
for(i=0;i<8;i++) // 计算偶校验位
{
checkp += ComVar.UDR2>>i;
}
checkp = checkp&0x01;
ComVar.CheckP = checkp;
Com2Var.TxPoint++;
}
else
{
ComVar.UDR2 = 0xFE; // 发送起始的 0xFE
Com2Var.ComTxStep++;
}
if(Com2Var.TxPoint > Com2Var.TxConst)
{
CLRBIT(Com2Bits,EnComTx); // 清除串口发送标志
SETBIT(Com2Bits,ComRST); // 置位串口复位标志,红外接收完毕复位一次
}
else
{
ComVar.Port2BitCnt = 0; // 清零数据位寄存器
TCNT1 = _TCNT1_RELOAD; // 置定时器初始值
SETBIT(Com2Bits,TD2); // 置位发送请求标志
}
}
}
// 串口2超时定时处理
//-------------------------------------------------------------------------
if(CHKBIT(Com2Bits,En500ms))
{
if(++Com2Var.OverTimer >= 10)
{
Com2Var.OverTimer = 0;
CLRBIT(Com2Bits,En500ms);
Com2Var.CommEnd = 0xAA; // 置位接收帧尾标志
SETBIT(TIFR1,ICF1); // 禁止串口2接收
CLRBIT(TIMSK1,ICIE1); // 禁止捕捉中断
}
}
// #endif
}
//-------------------------------------------------------------------------
}
//*****************************************************************************
// 函数 : void Timer0(void) *
// *
// 功能 : Timer0定时中断处理 *
// 注释 : 提供系统15ms时基 *
//*****************************************************************************
/*
#pragma vector=TIMER0_OVF_vect
__interrupt void BasicTimer(void)
{
TCNT0 = _TCNT0_RELOAD; // 重载TCNT0定时
ComVar.Port2BitCnt++; // 串口处理位数加1
//---------------------------------------------------------------------------
if(CHKBIT(Com2Bits,TD2)) // 模拟串口发送处理
{
switch(ComVar.Port2BitCnt)
{
case 1:
TCCR2A = 0x42; // 启动TIMER2 发送起始位(0)
break;
case 10:
ComVar.UDR2 = ComVar.CheckP; // 发送偶校验位
if((ComVar.UDR2&0x01)==1)
{
TCCR2A = 0; // 停止TIMER2
_CLR_IO_TXD2(); // 置高TXD2 停止38k 发送1
}
else
{
TCCR2A = 0x42; // 启动TIMER2 发送0
}
break;
case 11:
TCCR2A = 0; // 停止TIMER2
_CLR_IO_TXD2(); // 置高TXD2 停止38k 发送1 停止位
CLRBIT(Com2Bits,TD2); // 清除发送请求标志 1字节发送完毕
break;
default:
if((ComVar.UDR2&0x01)==1)
{
TCCR2A = 0; // 停止TIMER2
_CLR_IO_TXD2(); // 置高TXD2 停止38k 发送1 停止位
}
else
{
TCCR2A = 0x42; // 启动TIMER2 发送0
}
ComVar.UDR2 = ComVar.UDR2>>1;
break;
}
}
//-------------------------------------------------------------------------
if(CHKBIT(Com2Bits,RD2)) // 模拟串口接收处理
{
if(ComVar.Port2BitCnt< 9) // 读入8bit数据
{
ComVar.UDR2 = (ComVar.UDR2>>1);
if(CHKBIT(PIND,IO_RXD2)) // 检测RX2端口电平
{
ComVar.UDR2 |=0x80;
}
}
else
{
if(ComVar.Port2BitCnt > 9) // 跳过校验位 接收完毕
{
if(CHKBIT(PIND,IO_RXD2)) // 检测停止位
{
CLRBIT(Com2Bits,RD2); // 清除串口接收请求标志
CLRBIT(TIMSK0,TOIE0); // 禁止 TIMER0 中断
//-------------------------------------------------------------
SETBIT(EIFR,INTF0); // 清除INT0中断标志
SETBIT(EIMSK,INT0); // 允许INT0中断
//---------------------------------------------------------
if(Com2Var.CommEnd == 0)
{
Com2Var.RxBuff[ Com2Var.RxPoint ] = ComVar.UDR2 ; // 接收数据
Com2Var.RxPoint ++;
Com2Var.OverTimer = 0;
SETBIT(Com2Bits,En500ms);
if(Com2Var.RxPoint >=60) // 检测串口是否溢出
{
SETBIT(Com2Bits,ComRST); // 置位串口错误标志
Com2Var.RxPoint = 0;
}
}
}
else // 停止位无效,非法数据
{
SETBIT(Com2Bits,ComRST); // 置位串口错误标志
}
//---------------------------------------------------------
}
}
}
}
*/
//*****************************************************************************
// 函数 : void Compactor(void) *
// *
// 功能 : 比较器中断处理 *
// 注释 : 利用比较器提供掉电检测信号 *
//*****************************************************************************
#pragma vector=ANA_COMP_vect
__interrupt void Compactor(void)
{
CLRBIT(ACSR,ACIE); // 禁止比较器中断
PowerVar.SavePow = 0xAA; // 置位掉电保存电量标志
}
//*****************************************************************************
// 函数 : void UartRxInterrupt(void) *
// *
// 功能 : 串口接收中断处理 *
// 注释 : *
//*****************************************************************************
#pragma vector=USART_RX_vect
__interrupt void UartRxInterrupt(void)
{
if(Com1Var.CommEnd != 0xAA)
{
Com1Var.RxBuff[Com1Var.RxPoint] = UDR0; // 接收数据
Com1Var.RxPoint ++;
Com1Var.OverTimer = 0;
SETBIT(Com1Bits,En500ms);
if(Com1Var.RxPoint >=60) // 检测串口是否溢出
{
SETBIT(Com1Bits,ComRST); // 置位复位串口标志
Com1Var.RxPoint = 0;
}
}
}
/*************************** END OF SUB **************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -