?? 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 + -