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

📄 isr.c

📁 AT90CAN128的CAN通信源码测试成功
💻 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 + -