中斷執(zhí)行程序在PIC單片機(jī)中如何被寫(xiě)出?
什么是PIC中斷程序呢?形象的生活比喻就比如你現(xiàn)在這在看我的文章,突然你的朋友喊你一起去烤地瓜,這時(shí)候你就中斷了看文章和朋友烤地瓜去了,烤完地瓜之后你又回來(lái)看文章??镜毓线@件事就好比中斷程序,他中斷了你看文章這件事。在程序方面來(lái)說(shuō) 當(dāng)CPU在執(zhí)行一個(gè)程序的時(shí)候,突然產(chǎn)生了中斷事件CPU就去執(zhí)行中斷程序了,當(dāng)執(zhí)行完成后CPU又回來(lái)執(zhí)行原先的程序。
具體有哪些事件會(huì)引起中斷可以看:
1,中斷控制寄存器INTCON
2,外設(shè)中斷允許寄存器 PIEX 注 : X可以是1 2 3 4.。。。不同型號(hào)的單片機(jī)數(shù)目不同
3,外設(shè)中斷標(biāo)志寄存器 PIRX 注: X可以是1 2 3 4.。。。不同型號(hào)的單片機(jī)數(shù)目不同
INTCON 中斷控制寄存器講解:
1開(kāi)啟或關(guān)閉 全體的中斷功能(GIE)
2開(kāi)啟或關(guān)閉全體外設(shè)的中斷功能(PEIE)外設(shè)就是在外設(shè)中斷允許/標(biāo)志寄存器里面所寫(xiě)的設(shè)備。
3開(kāi)啟一些中斷事件。
PIEX 與 PIRX 是相互對(duì)應(yīng)的如:當(dāng)把PIE1的TMR1IE設(shè)置為1 定時(shí)器timr1將開(kāi)啟中斷。等到TMR1定時(shí)器溢出后,則會(huì)在PIR1的TMRIF將為1,并且執(zhí)行中斷程序。
中斷服務(wù)程序有一個(gè)特殊的定義方法: void interrupt ISR(void)其中的函數(shù)名“ISR”可以改成任意合法的字母或數(shù)字組合,但其入口參數(shù)和返回參數(shù)類型必須是“void”型,亦即沒(méi)有入口參數(shù)和返回參數(shù),且中間必須有一個(gè)關(guān)鍵詞“interrupt”中斷函數(shù)可以被放置在原程序的任意位置。因?yàn)橐延嘘P(guān)鍵詞“interrupt”聲明,PICC 在最后進(jìn)行代碼連接時(shí)會(huì)自動(dòng)將其定位到0x0004 中斷入口處,實(shí)現(xiàn)中斷服務(wù)響應(yīng)。編譯器也會(huì)實(shí)現(xiàn)中斷函數(shù)的返回指令“retfie”。
一個(gè)簡(jiǎn)單的中斷服務(wù)示范函數(shù)如下:
void interrupt ISR(void) { //中斷服務(wù)程序
if (T0IE && T0IF){ //判TMR0 中斷
T0IF = 0; //清除TMR0 中斷標(biāo)志 //在此加入TMR0 中斷服務(wù)
}
if (TMR1IE && TMR1IF){ //判TMR1 中斷 T
MR1IF = 0; //清除TMR1 中斷標(biāo)志
//在此加入TMR1 中斷服務(wù)
}
} //中斷結(jié)束并返回
PICC 會(huì)自動(dòng)加入代碼實(shí)現(xiàn)中斷現(xiàn)場(chǎng)的保護(hù),并在中斷結(jié)束時(shí)自動(dòng)恢復(fù)現(xiàn)場(chǎng),所以編程員無(wú)需象編寫(xiě)匯編程序那樣加入中斷現(xiàn)場(chǎng)保護(hù)和恢復(fù)的額外指令語(yǔ)句。但如果在中斷服務(wù)程序中需要修改某些全局變量時(shí),是否需要保護(hù)這些變量的初值將由編程員自己決定和實(shí)施。用C 語(yǔ)言編寫(xiě)中斷服務(wù)程序必須遵循高效的原則:
z 代碼盡量簡(jiǎn)短,中斷服務(wù)強(qiáng)調(diào)的是一個(gè)“快”字。
z 避免在中斷內(nèi)使用函數(shù)調(diào)用。 雖然PICC 允許在中斷里調(diào)用其它函數(shù),但為了解決遞歸調(diào)用的問(wèn)題,此函數(shù)必須為中斷服務(wù)獨(dú)家專用。既如此,不妨把原本要寫(xiě)在其它函數(shù)內(nèi)的代碼直接寫(xiě)在中斷服務(wù)程序中。
z 避免在中斷內(nèi)進(jìn)行數(shù)學(xué)運(yùn)算。數(shù)學(xué)運(yùn)算將很有可能用到庫(kù)函數(shù)和許多中間變量,就算不出現(xiàn)遞歸調(diào)用的問(wèn)題,光在中斷入口和出口處為了保護(hù)和恢復(fù)這些中間臨時(shí)變量就需要大量的開(kāi)銷,嚴(yán)重影響中斷服務(wù)的效率。
中檔系列PIC 單片機(jī)的中斷入口只有一個(gè),因此整個(gè)程序中只能有一個(gè)中斷服務(wù)函數(shù)。
1)系統(tǒng)初始化的時(shí)候會(huì)打開(kāi)總中斷控制位(GIE),打開(kāi)某個(gè)中斷控制位,如果是外圍中斷還要打開(kāi)外圍中斷控制位(PEIE);
2)CPU正在執(zhí)行某個(gè)用戶程序時(shí),突然收到一個(gè)隨機(jī)產(chǎn)生的中斷信號(hào),使某個(gè)中斷標(biāo)志位置為1;
3)CPU立刻停止當(dāng)前的程序,并將下一條要執(zhí)行的程序的地址保存起來(lái);
4)CPU自動(dòng)關(guān)閉總中斷控制位(GIE),控制指令指針跳到中斷入口處;
5)從中斷入口跳轉(zhuǎn)至中斷服務(wù)子程序(ISR)。在ISR中程序員應(yīng)該首先保護(hù)中斷現(xiàn)場(chǎng)(保存相應(yīng)重要寄存器的值),
然后根據(jù)中斷標(biāo)志位來(lái)響應(yīng)何種中斷并作出處理;
6)中斷程序執(zhí)行完畢,首先清空中斷標(biāo)志位并恢復(fù)中斷現(xiàn)場(chǎng),執(zhí)行特殊的指令返回原先用戶程序終止處。
要避免上述問(wèn)題,其實(shí)只需要我們?cè)诖a上注意以下兩點(diǎn)便可以避免。
1、在中斷響應(yīng)函數(shù)中,判斷條件除了標(biāo)志位判斷再增加使能判斷,如外部中斷原來(lái)只判斷INTF,現(xiàn)寫(xiě)為INTF&&INTE;
2、在開(kāi)啟一個(gè)中斷前,必須先將其標(biāo)志位清零;
3、PIC每個(gè)中斷響應(yīng)處理函數(shù)內(nèi),必須將其標(biāo)志位清零,雖然某些標(biāo)志位是硬件清零,但是考慮不同芯片型號(hào)設(shè)置不一致,或者遺忘,反正加一條軟件清零不會(huì)出錯(cuò)。