📄 isr._c
字号:
/********************************************************************
* 函数库说明:中断服务函数 *
* 版本说明: 1.0 Bate *
* 作者: andylee *
* 日期: 2006年10月 *
* 平台: mega16 16M *
* 说明: INT0为CAN控制器事件中断,下跳沿触发 *
********************************************************************/
#include "isr.h"
#include "can.h"
//#define DEBUG_ISR
/*******************************************************************
* int0_isr: CAN控制器中断处理函数 *
* 输入:无 *
* 输出:无 *
*******************************************************************/
#pragma interrupt_handler int0_isr:2
void int0_isr(void)
{
unsigned char Temp,Temp1;
unsigned char reg;
unsigned char can_status;
PORTA&=~(1<<PA0);
PORTA&=~(1<<PA1);
CLI(); //关CPU中断
//----------------------------------------------------------------------------
#ifdef DEBUG_ISR
rprintfStr("interrupt trigger");
rprintfCRLF();
Temp=sja_read_data(ECC);
rprintfStr("ECC= ");
rprintfu08(Temp);
rprintfCRLF();
Temp=sja_read_data(SR);
rprintfStr("SR= ");
rprintfu08(Temp);
rprintfCRLF();
Temp=sja_read_data(IER);
rprintfStr("IER= ");
rprintfu08(Temp);
rprintfCRLF();
Temp=sja_read_data(IR);
rprintfStr("IR= ");
rprintfu08(Temp);
rprintfCRLF();
#endif
//--------------------------------------------------------------------------
//can处理函数
#ifndef DEBUG_ISR
Temp = sja_read_data(IR);
#endif
reg=sja_read_data(IER); //保存SJA1000的中断允许状态
sja_write_data(IER,0x00); //重设中断允许状态为不允许任何中断
if((Temp&0x80) == 0x80) //总线错误中断
{
//---------------------------------------------------------------------------
#ifdef DEBUG
rprintfStr("bus error");
rprintfCRLF();
#endif
//---------------------------------------------------------------------------
sja_write_data(MODE,0x08);
}
if((Temp&0x08) == 0x08) // 数据溢出中断
{
//---------------------------------------------------------------------------
#ifdef DEBUG_ISR
rprintfStr("data overfllow");
rprintfCRLF();
#endif
//---------------------------------------------------------------------------
sja_write_data(CMR,0x0c); //清除数据溢出,释放接受缓冲
}
if((Temp&0x04) == 0x04) // 出错报警中断
{
//--------------------------------------------------------------------------
#ifdef DEBUG_ISR
rprintfStr("error alarm");
rprintfCRLF();
#endif
//--------------------------------------------------------------------------
}
//===========================================================================
// 发送完成中断
if((Temp&0x02) == 0x02)
{
//--------------------------------------------------------------------------
#ifdef DEBUG_ISR
rprintfStr("transmit over");
rprintfCRLF();
#endif
//--------------------------------------------------------------------------
sja_tx_service();
}
//============================================================================
// 接收有效中断
//if((Temp&0x01) == 0x01)
{
//--------------------------------------------------------------------------
sja_rx_service(); //接收消息
can_receive_flag=1; //接收中断,数据保存后标志
#ifdef DEBUG_ISR
rprintfu08(0x55);
Temp1=sja_read_data(SR);
rprintfu08(Temp1);
Temp1=sja_read_data(ECC);
rprintfu08(Temp1);
play_buffer(RxBuffer);
#endif
}
//===========================================================================
PORTA|=(1<<PA0);
PORTA|=(1<<PA1);
sja_write_data(IER,reg); //重新写回中断允许模式
SEI();
}
/*******************************************************************
* isr_init: 初始化中断资源 *
* 输入:无 *
* 输出:无 *
*******************************************************************/
void isr_init(void)
{
//设置INT0下降沿产生中断请求
MCUCR|=(1<<ISC01)|(0<<ISC00);
//使能外部中断0
GICR|=(1<<INT0);
//清零外部中断标志
GIFR=0x00;
}
//----------------------------自带的
void watchdog_init(void)
{
WDR(); //看门狗计数清零
WDTCR=(1<<WDTOE)|(1<<WDE); //使能watchdog,并且,采用2048K分频,典型溢出时间5V时2.2s
WDTCR=(1<<WDE)|(1<<WDP2)|(1<<WDP1)|(1<<WDP0);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -