- PIC單片機常用模塊與綜合系統設計實例精講
- 夏彬彬 任明全 屈金學編著
- 8287字
- 2019-01-01 14:12:24
2.2 中斷系統
中斷是計算機技術中的一個重要概念。中斷的存在使計算機的工作效率大大提高,幾乎所有微控制器(MCU,或稱單片機)和微處理器(CPU)都配置有中斷功能。下面首先闡述其概念。
2.2.1 中斷的基本概念
中斷是計算機中的一個十分重要的概念,那么什么是中斷呢?不妨先看一下下面這個例子:假如你正在自習室看書,坐在你前面的小張問你一道題;于是你把書折個角,轉身為小張講題;當你正在給他講題時,你的手機響了,于是你讓小張稍等一下,出去接電話;你接電話后,回來繼續給小張講題;講完題,你打開書,從剛才被打斷的地方繼續看下去。這就是我們日常生活中的“中斷”現象。從看書到給小張講題是一次中斷過程,而從給小張講題到出去接電話則是在中斷過程中發生的又一次中斷,也就是所謂的“中斷的嵌套”。計算機技術中的中斷概念與此相似。
在計算機系統中,當CPU正在執行當前程序的過程中,由于某種突發事件的發生,如有鍵按下,使它暫停當前的操作,轉去執行另一段程序,待這段程序執行完畢后,再返回到原來被打斷的地方繼續執行,這就是一次典型的中斷過程。中斷控制方式使CPU在平時可以利用充分的時間去處理主要事件,而當外界有特殊情況需要處理時CPU也不會錯過,這樣的工作效率較高。在編制實時性要求較高的程序中,中斷控制方式顯得特別有用。實際上,在一般的單片機多任務(如數據采集、計算、通信等)的應用程序編制中,中斷編程是必不可少的一部分。
下面介紹幾個關于中斷的基本概念。
(1)中斷源:引起中斷發生的事件被稱為中斷源。
(2)中斷請求:中斷源向CPU發出的請求中斷處理信號。
(3)中斷響應:CPU收到中斷請求后轉相應的事件處理程序。
(4)現場保護:在處理新任務時可能破壞原有的工作現場,所以需要對工作現場和工作環境進行適當的保護,以使執行完新任務后可以回到原來的工作現場繼續工作。
(5)中斷返回:將被打斷的工作斷點找回來,繼續執行原先被打斷的工作。
(6)關中斷:不允許CPU響應中斷。
(7)開中斷:允許CPU響應中斷。
(8)中斷屏蔽:通過設置有關的中斷屏蔽位禁止響應某個中斷。
(9)中斷矢量:即中斷服務程序的入口地址。每個中斷源都有自己固定的“中斷矢量”,不可任意挪用或更改。CPU接到中斷請求時,轉向對應的中斷服務程序的入口地址來執行中斷服務程序。一個中斷矢量可以只對應一個中斷源,也可以對應多個中斷源。當多個中斷源對應一個中斷矢量時,就需要在中斷服務程序中判斷是哪個中斷源發出的中斷申請,進而執行響應的中斷服務程序。
(10)中斷優先級:當幾個中斷源同時向CPU發出中斷申請時,優先級別較高的中斷率先得到響應。
2.2.2 PIC16F87X的中斷源及中斷邏輯
1.PIC16F87X的中斷源
PIC16F87X系列單片機有多達14個中斷源,具體數目根據單片機型號的不同而有所差異,如表2-9所示。中斷控制寄存器INTCON標志著各個中斷源的請求。PIC16F87X系列單片機雖然有著豐富的中斷源,但只有一個中斷矢量(0004h),并且各個中斷源之間沒有優先級的差別,也沒有非屏蔽中斷(如80C196KC中的NMI中斷),所以這也是PIC16F87X系列單片機的一個缺陷。由于PIC單片機所有中斷源均指向0004H這個中斷矢量,所以在進入中斷服務程序時,并不知道是哪個中斷源產生的,所以必須通過檢測所有開放中斷的標志位來判斷究竟是哪個中斷源發出的中斷。此外,從檢查中斷標志位的順序,可以人為地設定中斷源的優先級,先檢查優先級較高的。在多個中斷源同時發出中斷申請時,即可按優先級來逐項處理,或是清除其他優先級別較低的中斷標志位。
表2-9 PIC16F87X系列單片機中斷源一覽表

下面對表2-9中所列各中斷源的特點作簡要介紹。
(1)外部中斷(INT Pin Interrupt)
外部中斷的引腳為RB0/INT,這是一個邊沿觸發的中斷:當INTEDG(OPTION<6>)==1時,由上升沿觸發;當OPTION<6>)=0時,由下降沿觸發。當RB0/INT引腳上檢測到有效的跳變沿時,系統硬件會自動將外部中斷標志位INTF置1。該中斷可由INTE位屏蔽(INT=0)或使能(INT=1)。注意,執行完外部中斷服務程序后,INTF不會由硬件自動清零,需由用戶編程清零。如果INTE在單片機進入睡眠狀態前已經被置位,則外部中斷INT可以將芯片從睡眠狀態中喚醒。喚醒以后程序的去向取決于全局中斷位GIE。
(2)TMR0溢出中斷(TMR0 Overflow Interrupt)
當定時/計數器Timer0的TMR0寄存器溢出(由0FFh→00h)時,TMR0中斷標志位T0IF(INTCON<2>)被硬件置1,產生中斷。該中斷屏蔽/使能位為T0IE(INTCON<5>),通過對該位的清零或置位可以禁止或允許TMRO中斷。
(3)RB口電平變化中斷(PORTB Change Interrupt)
PORTB<7∶4>引腳具有電平變化中斷功能,其中的任何一個引腳上的電平發生變化都會使中斷標志位RBIF(INTCON <0>)置1,并向CPU申請中斷。為了使讀者對該中斷有個深入的了解,在此給出了PORTB<7∶4>的引腳原理圖,如圖2-7所示。

圖2-7 PORTB<7∶4>的引腳原理圖
由圖2-7可以看出,鎖存器A每個時鐘周期Q1均刷新一次,其輸出電平隨外部引腳電平變化而變化;鎖存器B則只有在對該I/O引腳進行讀操作時才刷新一次;兩個鎖存器的輸出作為或非門C的輸入,一旦鎖存器A和B的輸出不一致(說明該引腳有電平變化),或非門輸出高電平“1”;或非門C的輸出和引腳方向控制寄存器TRIS Latch的輸出作為與門D的輸入,所以只有當該引腳被配置為輸入引腳(TRIS寄存器中對應的位為1),或非門的輸出信號才能通過與門;或非門E的4個輸入端分別接到PORTB<7∶4>上,從而使RB7:RB4中的任何一個引腳上發生了電平變化,都能引起中斷。
注意:1)只有當PORTB<7∶4>被設置為輸入引腳時,才具有電平變化中斷功能,而被設置為輸出的引腳沒有中斷功能。
2)中斷服務程序中對中斷標志位RBIF的清零必須遵循下面的步驟:
① 對PORTB進行一次讀操作。該指令目的是為了結束失配條件(mismatch condition)。
② 對RBIF位清零。
(4)TMR1溢出中斷(TMR1 Overflow Interrupt)
當定時/計數器Timer1的TMR1寄存器對溢出(由0FFFFh→0000h)時,TMR1中斷標志位TMR1IF(PIR1<0>)被硬件置1,產生中斷。該中斷屏蔽/使能位為TMR1IE(PIE1<0>),通過對該位的清零或置位可以禁止或允許CPU響應TMR1溢出中斷。
(5)TMR2溢出中斷(TMR2 Overflow Interrupt)
定時/計數器Timer2的TMR2寄存器按遞增規律計數,從某一起始值(默認狀態為00H)開始遞增,當與周期寄存器PR2內容相同為止,再增加一次則返回到00H,同時產生高位溢出信號,該溢出信號作為后分頻器的計數脈沖。當后分頻器產生溢出時,才會將溢出中斷標志位TMR2IF(PIR1<1>)置1,向CPU提出中斷申請。該中斷屏蔽/使能位為TMR2IE(PIE1<2>),通過對該位的清零或置位可以禁止或允許CPU響應TMR溢出中斷。
(6)CCP1中斷(CCP1 Interrupt)
CCP1模塊在兩種工作模式下可產生中斷:捕捉模式和比較模式。
當CCP1工作在捕捉模式下時,引腳RC2/CCP1上有下列事件發生:出現脈沖上升沿;出現脈沖下降沿;每出現4個脈沖的上升沿,TMR1(TMR1H:TMR1L)的計數值立即被送到CCRP1寄存器(CCPR1H:CCPR1L),CCP1的中斷標志位CCP1IF將被硬件自動置1,向CPU申請中斷。究竟是哪種事件觸發中斷,則由CCP1CON寄存器中的CCP1M3~CCP1M0來決定。
當CCP1工作在比較模式下時,系統將對CCP1寄存器與TMR1寄存器的值進行比較。一旦二者相等,就在RC2/CCP1引腳上輸出下列3種狀態之一:高電平、低電平或保持原來引腳上的電平不變。同時,中斷標志位CCP1IF被硬件自動置1,產生一個比較中斷。究竟輸出哪種狀態,則由CCP1CON寄存器的CCP1M3~CCP1M0來決定。
注意:在CPU響應CCP1中斷后,必須由軟件將中斷標志位CCP1IF清零。
(7)CCP2中斷(CCP2 Interrupt)
CCP2中斷與CCP1中斷類似,只是對應的引腳和寄存器不同,其引腳為RC1/T1OSO/CCP2,寄存器為CCPR2和CCP2CON。
(8)SCI發送中斷(SCI Transmit Interrupt)
在PIC單片機中,SCI(Serial Communications Interface)也就是所謂的USART。USART可以工作在同步或異步模式。USART發送器由發送移位寄存器TSR和發送緩沖寄存器TXREG構成。不論USART工作在哪種模式下,一旦TXREG中的數據送入TSR,中斷標志位TXIF就會被硬件自動置1,并向CPU申請中斷。TXIF置位后不能被軟件清零,只有在下一個要發送的數據送入TXREG后,TXIF才能復位。
(9)SCI接收中斷(SCI Receive Interrupt)
USART接收器主要由接收移位寄存器RSR和接收緩沖寄存器組成。不論USART工作在哪種模式下,一旦RSR將數據裝載到RCREG中,中斷標志位RCIF就會被硬件自動置1,向CPU申請中斷。當RCREG被讀出時,RCIF被清零。
(10)SSP中斷(SSP Interrupt)
不論SSP模塊工作在SPI模式、I2C從動模式還是I2C主控模式,一個發送或接收動作都會將SSP中斷標志位SSPIF置1,從而引起中斷。此外,當SSP工作在I2C主控模式下時,下列事件也會引起SSP中斷:啟動信號完成、停止信號完成、重啟信號完成、應答信號完成、當SSP模塊空閑時出現了啟動信號或停止信號(在多主系統中)。SSPIF被置位后,必須在中斷返回時,用軟件將SSPIF清零。
(11)SSP、I2C總線沖突中斷(I2C Bus Collision Interrupt)
當SSP模塊被配置為I2C模式時,總線沖突會將中斷標志位BCLIF置1,引起I2C總線沖突中斷。
(12)并行從口中斷(Parallel Slave Port Interrupt)
當并行從口發生讀操作或寫操作時,中斷標志位PSPIF將會被置1,引起并行從口中斷。中斷標志位必須被軟件清零。
(13)A/D轉換結束中斷(A/D Conversion Complete Interrupt)
當一次A/D轉換結束后,中斷標志位ADIF將會被硬件自動置1,引起中斷。當把結果寄存器ADRES的值讀走后,ADIF自動清零。
(14)E2PROM寫操作完成中斷(Data E2PROM Write Complete Interrupt)
對E2PROM進行寫操作時,一旦寫操作完成,標志位EEIF被置1,向CPU發出中斷申請。注意,EEIF必須在置位WR控制位(EECON1<1>)之前用軟件清零。
2.PIC16F87X的中斷邏輯
在PIC16F87X系列中,不同型號的單片機所對應的中斷邏輯電路也略有不同,主要體現在中斷源的種類和數量的不同,從如圖2-8所示的PIC16F87X中斷邏輯圖中可看出每一種中斷源都對應著兩個控制位:中斷標志位XXXF(xxx Flag)和中斷使能位XXXE(xxx Enable,或稱中斷屏蔽位)。當某一種中斷源滿足一定的觸發條件時,對應的中斷標志位就會由硬件自動置1,并向CPU提出中斷申請。需要注意的是,中斷標志位的清零及中斷屏蔽位的置1或清零也是由用戶通過程序來完成的。

圖2-8 PIC16F87X中斷邏輯圖
注意:(1)PIC16F870不具備PSPIF、SSPIF、CCP2IF和BCLIF中斷源。
(2)PIC16F871不具備SSPIF、CCP2IF和BCLIF中斷源。
(3)PIC16F872不具備PSPIF、RCIF、TXIF和CCP2IF中斷源。
(4)PIC16F873/876不具備PSPIF中斷源。
(5)PIC16F877具備圖2-8中所有中斷源。
如圖2-8所示,可以把14種中斷源分為兩個級別。第一級別包括3個中斷源:T0IF、INTF和RBIF。該級別的中斷源向CPU提出中斷申請后,要“連闖兩關”才能得到CPU的響應。以INTF為例,當RB0/INT引腳上出現跳變沿(上升沿/下降沿)時,INTF就會被硬件自動置1,向CPU提出中斷申請;“第一關”是外部中斷使能/屏蔽位INTE,如果INTE為1,表明允許INTF中斷,否則INTF在第一關被“斃”;接下來闖“第二關”——全局中斷使能/屏蔽位GIE(Global Interrupt Enable),如果GIE=1,則INF中斷申請被放行,可以得到CPU的響應,否則INTF在第二關被“斃”。第二級別包括剩下的11個中斷源,也就是外圍中斷。這個級別的中斷源要想得到CPU的響應,需“連闖三關”。以ADIF為例,這三關依次是:ADIE→PEIE→GIE,其中PEIE是外設中斷屏蔽位。
2.2.3 與中斷相關的寄存器
與中斷相關的寄存器共有5個,分別是選項寄存器OPTION_REG、中斷控制寄存器INTCON、第一外設中斷標志寄存器PIR1,第一外設中斷屏蔽寄存器PIE1,第二外設中斷標志寄存器PIR2和第二外設中斷屏蔽寄存器PIE2。下面只對各寄存器中與中斷有關的位進行介紹:
1.選項寄存器OPTION_REG(地址為81H/181H)

● bit 6 INTEDG:外部中斷邊沿選擇位。
? 1:RB0/INT引腳上升沿觸發中斷。
? 0:RB0/INT引腳下降沿觸發中斷。
2.中斷控制寄存器INTCON(地址為0BH/SBH/10BH/18BH)

● bit 7 GIE:全局中斷屏蔽位。
? 1:允許所有的未被屏蔽的中斷。
? 0:禁止一切中斷。
● bit 6 PEIE:外圍中斷屏蔽位。
? 1:允許所有的未被屏蔽的外圍中斷。
? 0:禁止所有的外圍中斷。
● bit 5 T0IE:TMR0溢出中斷屏蔽位。
? 1:允許TMR0溢出中斷。
? 0:禁止TMR0溢出中斷。
● bit 4 INTE:外部中斷屏蔽位。
? 1:12B0/INT引腳上升沿觸發中斷。
? 0:12B0/INT引腳下降沿觸發中斷。
● bit 3 RBIE:RB7~RB4電平變化中斷屏蔽位。
? 1:允許PORTB口電平變化中斷。
? 0:禁止PORTB口電平變化中斷。
● bit 2 T0IF:TMR0溢出中斷標志位。
? 1:TMR寄存器已經溢出(必須由軟件清零)。
? 0:TMR寄存器沒有溢出。
● bitl INTF:外部中斷標志位。
? 1:INT引腳出現中斷觸發信號(必須由軟件清零)。
? 0:INT引腳無中斷觸發信號。
● bit0 RBIF:RB7~RB4電平變化中斷標志位。
? 1:RB7~RB4已發生了電平變化(必須由軟件清零)。
? 0:RB7~RB4未發生電平變化。
3.第一外設中斷屏蔽寄存器PIE1(地址為8CH)

● bit 7 PSPIE:并行從口中斷屏蔽位。只有40腳封裝型號具備,對于28腳封裝型號總保持零。
? 1:允許并行從口讀l寫中斷。
? 0:禁止并行從口讀l寫中斷。
● bit ADIE:A/D轉換中斷屏蔽位。
? 1:允許A/D轉換中斷。
? 0:禁止A/D轉換中斷。
● bit 5 RCIE:串行通信接收中斷屏蔽位。
? 1:允許USARTA接收中斷。
? 0:禁止USARTA接收中斷。
● bit4 TXIE:串行通信發送中斷屏蔽位。
? 1:允許USARTA發送中斷。
? 0:禁止USARTA發送中斷。
● bit 3 SSPIE:同步串行端口中斷屏蔽位。
? 1:允許SSP中斷。
? 0:禁止SSP中斷。
● bit 2 CCP1IE:CCP1模塊中斷屏蔽位。
? 1:允許CCP1中斷。
? 0:禁止CCP1中斷。
● bit1 TMR2IE:TMR2溢出中斷屏蔽位。
? 1:允許TMR2溢出中斷。
? 0:禁止TMR2溢出中斷。
● bit 0 TMR1IE:TMR1溢出中斷屏蔽位。
? 1:允許TMR1溢出中斷。
? 0:禁止TMR1溢出中斷。
4.第一外設中斷標志寄存器PIR1(地址為0CH)

● bit 7 PSPIF:并行從口中斷標志位。只有40腳封裝型號具備,對于28腳封裝型號總保持零。
? 1:并行從口發生了讀/寫中斷請求(必須由軟件清零)。
? 0:并行從口未發生讀/寫中斷請求
● bit 6 ADIF:A/D轉換中斷標志位。
? 1:A/D轉換結束。
? 0:A/D轉換未結束。
● bit 5 RCIF:串行通信接收中斷標志位。
? 1:USARTA接收緩沖區滿。
? 0:USARTA接收緩沖區空。
● bit 4 TXIF:串行通信發送中斷標志位。
? 1:USARTA發送緩沖區空。
? 0:USARTA發送緩沖區滿。
● bit 3 SSPIF:同步串行端口中斷標志位。
? 1:發送/接收完畢。
? 0:等待/發送。
● bit 2 CCP1IF:CCP1模塊中斷標志位。
在捕捉模式下:
? 1:發生了TMR1寄存器捕捉中斷請求(必須由軟件清零)。
? 0:未發生TMR1寄存器捕捉中斷。
在比較模式下:
? 1:發生了TMR1寄存器比較輸出中斷請求(必須由軟件清零)。
? 0:未發生TMR1寄存器比較輸出中斷請求。
● bit 1 TMR2IF:TMR2溢出中斷標志位。
? 1:發生了TMR2溢出中斷(必須由軟件清零)。
? 0:未發生TMR2溢出中斷。
● bit 0 TMR1IF:TMR1溢出中斷標志位。
? 1:發生了TMR1溢出中斷(必須由軟件清零)。
? 0:未發生TMR1溢出中斷。
5.第二外設中斷屏蔽寄存器PIE2(地址為8DH)

● bit 6保留位,為0。
● bit 4 EEIE:E2PROM寫中斷屏蔽位。
? 1:允許E2PROM寫中斷。
? 0:禁止E2PROM寫中斷。
● bit 3 BCLIE:總線碰撞中斷屏蔽位(Bus Collision Interrupt Enable bit)。
? 1:允許總線碰撞中斷。
? 0:禁止總線碰撞中斷。
● bit 0 CCP2IE:CCP2中斷屏蔽位。
? 1:允許CCP2中斷。
? 0:禁止CCP2中斷。
6.第二外設中斷標志寄存器PIR2(地址為0DH)

● bit 6保留位,為0。
● bit4 EEIF:E2PROM寫操作中斷標志位。
? 1:寫操作完成(必須由軟件清零)。
? 0:寫操作未完成或未進行寫操作。
● bit 3 BCLIF:總線碰撞中斷標志位(Bus Collision Interrupt Flag bit)。
? 1:當SSP被配置為I2C主模式時發生了總線碰撞。
? 0:未發生總線碰撞中斷。
● bit 0 CCP2IF:CCP2中斷標志位。
在捕捉模式下:
? 1:發生了TMR1寄存器捕捉中斷請求(必須由軟件清零)。
? 0:未發生TMR1寄存器捕捉中斷。
在比較模式下:
? 1:發生了TMR1寄存器比較輸出中斷請求(必須由軟件清零)。
? 0:未發生TMR1寄存器比較輸出中斷。
2.2.4 CPU對中斷的處理
不論各種中斷屏蔽位和全局中斷屏蔽位為何值,只要某一中斷源的中斷條件得到滿足,單片機就會向CPU發出中斷申請,并將響應的中斷標志位置1。而該中斷是否能得到CPU的響應,則取決于和它相關的中斷屏蔽位的值。如果該中斷被一路放行,則中斷申請被遞交給CPU。當CPU響應中斷后,全局中斷屏蔽位GIE將自動由硬件清零,以免發生重復響應;然后由硬件自動把當前PC指針值壓入堆棧,并把PC指針指向中斷矢量地址0004H,從而進入中斷服務程序開始執行,步驟為:首先CPU對有關寄存器進行保護,再檢查各個中斷源標志位以確定中斷源發出申請的位置,然后把對應的中斷標志位清零并轉入對應的程序執行。中斷服務程序執行完畢后,再執行中斷返回指令“RETFIE”退出中斷,此時,硬件自動將保存在棧頂的斷點地址彈回到PC指針中,使CPU返回繼續執行被中斷的主程序。
1.中斷響應的延遲
從中斷事件發生(即中斷標志位被置1)到位于地址0004H的中斷服務程序開始執行(即得到CPU的響應)需要一定的時間,該時間被定義為中斷響應的延遲時間,有時被形象地稱為中斷潛伏期(Latency)。同步中斷(如內部中斷)的延遲時間是3個指令周期。異步中斷(如外部中斷、INT中斷和PORTB口電平變化中斷等)的延遲時間為3~3.75個指令周期,在如圖2-9所示的INT引腳及其他外部中斷時序圖中,OSC1是系統時鐘脈沖信號,每4個時鐘周期對應一個指令周期。只有在RC時鐘模式下,CLKOUT引腳才會向外輸送指令周期。INT中斷是邊沿觸發的,但對其脈沖寬度的最小值有要求,關于具體內容可參考PIC16F87X的芯片數據資料。當INT中斷被觸發時,中斷標志位INTF自動被硬件置1。系統在每個指令周期的第二個時鐘周期的上升沿,對INTF的狀態進行一次檢查。若檢測到INTF信號被置1,則CPU在下一個指令周期內將全局中斷屏蔽位GIE清零,禁止一切中斷的打擾。接下來的一個指令周期內,中斷矢量0004H被載入PC指針。緊接著一個指令周期內,CPU開始執行中斷服務程序的第一條指令。可見,從INT引腳發生有效電平跳變到中斷服務程序的第一條指令的執行,大約需要經過3~4個指令周期的潛伏期。注意,單周期和雙周期指令的中斷潛伏期相同。另外,由外部信號,如定時l計數器、捕捉、端口電平變化等觸發的中斷都有類似的時序。

圖2-9 INT引腳及其他外部中斷時序圖
2.中斷現場的保護
現場保護是中斷技術中的一個十分重要的概念,其目的是使CPU執行完中斷服務程序后,再回到原來的“現場”繼續執行。PIC16F87X系列單片機在中斷期間,只有返回地址的PC值被壓入堆棧,而其他關鍵的寄存器(如W寄存器、STATUS寄存器等)的值則需要用戶自己編程來保護。注意,中斷現場的數據不是保存到堆棧中,而是保存到用戶選擇的一些文件寄存器中,即RAM數據存儲器中。Microchip公司為用戶提供了一些實現中斷現場保護功能的通用程序段,下面只給出適用于PIC16F87X系列單片機的一個程序段,對于其他程序段,用戶可參考相關的數據資料。
;********************************************************************** ;中斷現場保護程序(適用于PIC16F87X系列單片機) ;此程序段功能:對W寄存器、STATUS和PCLATH進行保護 ;說明:W_TEMP、STATUS_TEMP、PCLATH_TEMP為臨時寄存器 ;********************************************************************** MOVWF W_TEMP; 復制W寄存器內容到W_TEMP SWAPF STATUS,W;將STATUS高低字節交換后存入W寄存器 CLRF STATUS; 選擇BANKO HOVWF STATUS_TEMP;保存STATUS內容到STATUS_TEMP MOVF PCLATH,W;和下一條指令聯合將PCLATH內容復制到 MOVWF PCLATH_TEMP;PCLAT_STATUS CLRF PCLATH; 將PCLATH指向BANK0 ;中斷服務程序 … MOVF PCLAT_TEMP,W MOVWF PCLATH;恢復PCLATH SWAPF STATU_TEMP,W MOVWF STATUS;恢復STATUS SWAPF W_TEMP,F;將W_TEMP內容高低半字節交換 SWAPF W_TEMP,W;將W_TEMP內容高低半字節交換 :后放入W寄存器
中斷現場保護的步驟總結如下:
① 保存W寄存器。
② 保存STATUS到BANK0。
③ 保存其他重要的寄存器(若有需要)。
④ 執行中斷服務程序。
⑤ 恢復其他重要的寄存器(若有需要)。
⑥ 恢復STATUS寄存器和原來的BANK。
⑦ 恢復W寄存器。
3.中斷編程的幾點注意事項
(1)在中斷服務程序中,一旦確定出發出申請的中斷源,就應把中斷源標志位手工清零;否則,執行中斷返回命令“RETFIE”重開中斷后,由于中斷標志位仍為1,引起CPU重復響應同一個中斷請求。
(2)中斷服務程序開始應該進行現場保護,結束前應該恢復現場。寄存器STATUS、W和PCLATH通常一定要加以保護,其他寄存器的保護由用戶根據需要來保護。
(3)CPU響應一個中斷后,全局中斷屏蔽位GIE被自動清零,不再受理其他一切中斷申請、中斷返回時,GIE自動置1。
(4)如果在處理一次中斷的過程中,還有其他更重要的中斷需要響應,就要用到中斷的嵌套技術,用戶需在中斷程序中將GIE重新置1,允許響應后續中斷。但需注意的是,PIC16F87X的硬件堆棧的深度為8級,因此最多只能嵌套8級中斷,否則會造成堆棧溢出。
(5)PIC16F87X系列單片機的一個缺陷就是14種中斷源共用一個中斷矢量,不存在中斷優先級,對一切中斷均一視同仁。用戶只能通過在中斷服務程序中對中斷源檢查的順序來實現優先級的功能。
(6)在復位狀態下,全局中斷使能位和其他所有中斷屏蔽位都被清零,禁止CPU響應一切中斷。
(7)不論中斷屏蔽位的狀態如何,只要中斷源滿足中斷條件,中斷標志位都會置位。
(8)即使沒有用到中斷,地址0004H也最好寫上一句RETFIE,以使干擾引起誤中斷信號時能迅速返回。
(9)中斷服務程序的最后一條指令必須是中斷返回指令RET。
(l0)在進行查表操作期間必須禁止CPU響應中斷,以避免中斷返回時跳轉到不希望的地址上。
(11)當打算通過中斷喚醒CPU時,相應的中斷使能位必須提前被置為1。在這種情況下,需要在SLEEP指令后設置一條NOP空操作指令。
(12)當CPU正在執行一條對INTCON的“讀—修改—寫”指令時,如果發生了中斷請求,則中斷程序會被執行兩次,至于原因讀者可自行分析。解決辦法為:如果在程序中需要對INTCON的某一中斷屏蔽位進行修改,則應事先將GIE清零,禁止響應一切中斷,修改完成后再將GIE恢復為1。