?? interruptc.c.bak
字號:
// 中斷服務程序
//--------------------------------------------------------------------
// SMBus中斷服務程序
void SMBUS_ISR (void) interrupt 7
{
switch (SMB0STA)
{
// SMBus狀態碼SMB0STA寄存器
// 主發送器/接收器起始條件已發送
// 在該狀態發送的COMMAND字的R/W位總是為0(W)
// 因為對于讀和寫操作來說都必須先寫存儲器地址
case SMB_START:
SMB0DAT = (COMMAND & 0xFE); // 裝入要訪問的從器件的地址
STA = 0; // 手動清除START位
break;
//主發送器/接收器重復起始條件已發送
// 該狀態只應在讀操作期間出現在存儲器地址已發送并得到確認之后
case SMB_RP_START:
SMB0DAT = COMMAND; // COMMAND中應保持從地址 + R.
AA=1;
STA = 0;
break;
// 主發送器從地址 + WRITE已發送收到ACK
case SMB_MTADDACK:
SMB0DAT = LOW_ADD; // 裝入待寫存儲器地址的高字節
break;
// 主發送器從地址 + WRITE已發送收到NACK
// 從器件不應答發送STOP + START重試
case SMB_MTADDNACK:
STO = 1;
STA = 1;
break;
// 主發送器數據字節已發送收到ACK
// 該狀態在寫和讀操作中都要用到BYTE_NUMBER看存儲器地址狀態 - 如果
// 只發送了HIGH_ADD則裝入LOW_ADD如果LOW_ADD已發送檢查COMMAND
// 中的R/W 值以決定下一狀態
case SMB_MTDBACK:
if (COMMAND & 0x01) // 如果R/W=READ發送重復起始條件
{
//reversec=30;
STA = 1;
STEP = 1;//0表示還未寫地址,1表示地址已寫,2表示讀到第一個字節,3表示讀到第一個字節。。。
}
else
{
if(BYTE_NUMBER>0)
{
SMB0DAT = WORD; // 如果R/W=WRITE裝入待寫字節
BYTE_NUMBER--;
}
else
{
STO = 1;
SM_BUSY = 0; // 釋放SMBus
}
}
break;
// 主發送器數據字節已發送收到NACK
// 從器件不應答發送STOP + START重試
case SMB_MTDBNACK:
STO = 1;
STA = 1;
break;
// 主發送器競爭失敗
// 不應出現如果出現重新開始傳輸過程
case SMB_MTARBLOST:
STO = 1;
STA = 1;
break;
// 主接收器從地址 + READ 已發送收到ACK
// 設置為在下一次傳輸后發送NACK因為那將是最后一個字節唯一
case SMB_MRADDACK:
AA = 1; // 在應答周期ACK
break;
// 主接收器從地址 + READ 已發送收到NACK
// 從器件不應答發送重復起始條件重試
case SMB_MRADDNACK:
STA = 1;
break;
// 收到數據字節ACK已發送
// 該狀態不應出現因為AA已在前一狀態被清0如果出現發送停止條件
case SMB_MRDBACK:
//RECVCHARS[STEP-1]= revolve(SMB0DAT);
RECVCHARS[STEP-1]= SMB0DAT;
STEP++;
if (STEP>(RECVLEN-1)) AA= 0;
break;
// 收到數據字節NACK已發送
// 讀操作已完成讀數據寄存器后發送停止條件
case SMB_MRDBNACK:
//RECVCHARS[STEP-1]= revolve(SMB0DAT);
STEP=0;
STO = 1;
SM_BUSY = 0; // 釋放SMBus
break;
// 在本應用中所有其它狀態碼沒有意義通信復位
default:
STO = 1; // 通信復位
SM_BUSY = 0;
break;
}
SI=0; // 清除中斷標志
}
void RBuf (void) interrupt 4 //using 3
{
unsigned char tchar;
EA=0;
if (RI)
{
if(DataNo<RBUFSIZE)
{
RData[Pos]=SBUF;
Pos++;
Pos%=RBUFSIZE;
DataNo++;
}
else
{
tchar=SBUF;
TestVar=tchar;
}
RI=0;
}
if(TI)
{
TI=0;
if(DataSended>0)
{
if(SData[0]>=DataSended)
{
SBUF=SData[DataSended];
DataSended++;
TestVar4=DataSended;
}
else
{
SData[0] =0;
DataSended =0;
}
}
}
EA=1;
return;
}
void Timer0_ISR (void) interrupt 1 //DA REFRESH TIMER
{
DAC0L=DALOW;
DAC0H=DAHIGH;
}
void Timer2_ISR (void) interrupt 5 //串口超時檢測
{
TR2 =0; //停計數器2
TF2 =0; //清溢出標志位
ES0=0;
if(DataNo>0)
{
DataNo=0 ;
Pos=0;
}
ES0=1;
}
void Timer3_ISR (void) interrupt 14 //定時讀取參數
{
TMR3CN &= ~(0x80); // clear TF3
S_SMBUS=1;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -