新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > PIC16F87X單片機中斷系統應用須關注的問題

        PIC16F87X單片機中斷系統應用須關注的問題

        作者: 時間:2012-04-10 來源:網絡 收藏

        在圖2中,第1行是時鐘脈沖信號,每4個時鐘周期對應1個指令周期。第2行就是指令周期信號。該信號只有在RC 振蕩模式下,從OSC2腳上可以向片外送出。第3行是外部引腳INT送入的脈沖信號。外部信號INT是用邊沿觸發的。假設預先設定的是 INT信號上升沿有效的話,則該信號的上升沿將會在1個時鐘周期后引發中斷標志位INTF被置位。第4行代表INTF信號。每個指令周期內的第2個時鐘脈沖上升沿時,該信號被抽檢1次。一旦檢測到INTF信號被設置為“1”,則CPU會在接下來的1個指令周期內,將全局中斷屏蔽位GIE清零。第5行是全局中斷屏蔽位GIE。在GIE信號被清零的下一個指令周期內,程序計數器PC被置入中斷向量0004H,見圖2中第6行。同時在該指令周期內完成到中斷服務程序的跳轉,并且實現提取該子程序的首條指令,即指令(0004H),見圖2中第7行。在其后的1個指令周期內,正式開始執行中斷服務程序的第1條指令,見圖2中第8行。自INT引腳輸入有效信號,到中斷服務程序的第1條指令得到執行,大約需要3~4個指令周期的延時。更精確的延遲時間取決于中斷事件的發生時機。

        以上描述的只是1次中斷從申請到得到CPU的響應的延遲時間。下面分析從CPU響應1次中斷到該中斷得到有效處理的延遲時間。由于具有中斷功能的PIC系列(低檔產品PIC16C5X和PIC12C5X系列不具備中斷功能),采用的是“多源中斷”的設計方案(即1個中斷向量對應著多個中斷源),只有惟一的1個中斷向量,或者說只有1個中斷服務程序入口地址。這就意味著,此類的中斷服務程序只能編寫1個。這類單片機的硬件結構得到了簡化,那么,相應的軟件設計上就得多開銷一些。在1個中斷服務程序中,若想對多個中斷源作出處理,就必須在進入中斷服務程序后,首先執行調查具體中斷源的一條或多條指令,其后才能對查到的中斷源作出有針對性的服務。如此以來,就形成了1次中斷從CPU響應到進入針對性處理的延遲時間。該時間有長有短,它會隨著被開放的中斷源的個數的增加而增加。最好情況是只有1個中斷源被開放,這時不需要檢測中斷源就可以立即進入針對性處理;最壞情況是所有中斷源全部開放,此時用在檢測中斷源上的時間會最長。

        另外,PIC單片機中采用的是硬件堆棧結構。其好處是既不占用程序存儲器空間,也不占用數據存儲器空間,同時也不需用戶去操作堆棧指針;但此時也帶來1個不可回避的弱點,即不具備像其他單片機指令中的壓棧(PUSH)和出棧(POP)指令那樣,實現中斷現場的保護會麻煩一些,并且占用的處理時間也相應多一點。

        2 中斷的現場保護

        中斷現場的保護是中斷技術中一個很重要的環節。在進入中斷服務程序期間,只有返回地址,即程序計數器PC的值被自動壓入堆棧。若需要保留其他寄存器的內容,就得由程序員另想辦法。由于PIC單片機的指令中沒有像其他單片機那樣的PUSH(入棧)和POP(出棧)之類的指令,所以要用1段用戶程序來實現類似的功能。因為是用1段程序來實現現場保護,而程序的執行有可能會影響到W寄存器和STATUS寄存器,所以,首先應該把這2個寄存器保護起來,然后再去保存其他用戶認為有必要保護的寄存器。并且在PIC單片機中,中斷現場數據不是保留到芯片的堆棧存儲區中,而是保留在用戶自己選擇的一些文件寄存器(即RAM數據存儲器單元)中,當然一般應該選擇通用寄存器來保護現場。下面給出的是1段原廠家最新提供的實現保護中斷現場的范例程序片段。
          ;將W、STATUS和PCLATH寄存器的內容保存到臨時備份寄存器中
          [1]MOVWFW_TEMP   ;復制W到它的臨時備份寄存器W_TEMP中
          [2]SWAPFSTATUS,W ;將STATUS寄存器高低半字節交換后放入W
          [3]CLRFSTATUS ;不管當前處在哪個體,都設置體0作當前體
          [4]MOVWFSTATUS_TEMP ;保存STATUS到體0上的臨時寄存器STATUS_TEMP
          [5]MOVF PCLATH, W ;把寄存器PCLATH內容復制到W中
          [6]MOVWFPCLATH_TEMP ;經W將PCLATH內容轉到臨時寄存器PCLATH_TEMP
          [7]CLRFPCLATH ;不管當前處在哪頁,都把PCLATH設置成指向頁0 (中斷服務程序的核心部分)
          [8]MOVFPCLATH_TEMP, W ;經過W轉移
          [9]MOVWFPCLATH ;恢復PCLATH內容
          [10]SWAPFSTATUS_TEMP,W ;將STATUS_TEMP寄存器高低半字節交換后放入W
          [11]MOVWFSTATUS ;把W內容移動到STATUS寄存器,(同時也把當前體恢復到原先的體上)
          [12]SWAPFW_TEMP,F ;將W_TEMP內容高低半字節交換后放回
          [13]SWAPFW_TEMP,W ;再次將W_TEMP內容高低半字節交換后放入W

        這段程序適用于PIC16CXX系列中各款型號的單片機。在這段例程之前,假設預先對于待保留的各個寄存器都分別定義了相應的臨時備份寄存器。用后綴 “_TEMP”表示臨時備份寄存器,例如“W”的臨時備份寄存器記為“W_TEMP”。對于這些臨時備份寄存器究竟需要定義多少個,定義在通用寄存器區域中的哪個位置,都是值得考究的。并且單片機的型號不同,其內部的通用寄存器區域的分布也不同,因此這就使得臨時備份寄存器定義的數量和位置也不能相同。

        例如,對于PIC16F873/874來說,要求寄存器W_TEMP必須在文件寄存器(即RAM數據存儲器)的體0和體1上各定義1 個,并且這2個W_TEMP寄存器單元必須具有相同的體內地址碼(比如,在體0上把W_TEMP定義在20H單元,則在體1上就把另一個W_TEMP定義在A0H單元);而其他寄存器的臨時備份寄存器(如STATUS_TEMP和PCLATH_TEMP)都僅僅需要在體0上定義1個即可。

        又例如,對于子系列中的其他5款型號來說,情況有所不同。其文件寄存器各個體的頂端部分有16個地址空間,都會尋址到相同的16個物理單元上。這16個單元不需要體選尋址,或者說,尋址這16個單元與體選碼無關,即與當前所處的體無關。因此,將各個臨時備份寄存器都安排在這個位置(W_TEMP也只需要定義1個即可)最為合適。這樣做可以使得現場保護和現場恢復變得非常容易。中斷是一種隨機發生的事件。進入中斷服務程序后,第1個要保存的應該是工作寄存器W。原因是PIC單片機沒有在“不同寄存器”之間進行直接傳遞的指令,這樣的功能得用W作中轉(需要2條指令)才能實現,所以應該先把W寄存器騰空(對應程序中第1條指令)。急于騰空W寄存器,又不能破壞當前狀態寄存器 STATUS中的體選碼,還不能影響當前狀態寄存器STATUS內的標志位,可又無法確定主程序所處的RAM數據存儲器當前體是哪一個,就只好在主程序所有可能選擇到的每一個RAM數據存儲器體上的相同位置,都定義1個W_TEMP臨時備份寄存器。

        一旦把工作寄存器W騰空后,緊接著就應將狀態寄存器STATUS的內容轉移到W中。完成這一操作的指令也不能影響到STATUS寄存器內部原有的標志位,原因是STATUS寄存器的內容在此之前還沒有安全地保護起來。經過仔細分析得知,PIC16系列單片機的指令系統中有3條“MOV”傳送指令。但是,只有1條“MOVF f,W”是以RAM單元為源寄存器,以W為目標寄存器的;而這條指令的操作過程又偏偏會影響“Z”標志位。因此,該指令就不能使用了,只好用1條既有高、低半字節交換功能又有傳遞功能的“SWAPFSTATUS,W”來勉強頂替(對應程序中第2條指令)。不過在此只利用它的傳遞功能,其交換功能帶來的多余操作還得記下來,等到工作完成之后還得把它倒換回來。

        STATUS寄存器的內容已經保存到W中時,就可以大膽地將其清0了,以便把定義著 STATUS_TEMP和PCLATH_TEMP的體0設置為當前體(對應程序中第3條指令)。經過以上幾步特別需要謹慎的操作過后,就可以輕而易舉地將寄存器STATUS和PCLATH的內容保存到各自的臨時備份寄存器中了(對應程序中第4~6條指令)。



        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 昌黎县| 仙桃市| 安溪县| 华坪县| 建始县| 绍兴县| 双流县| 黑龙江省| 昌都县| 兴安盟| 武冈市| 特克斯县| 阜宁县| 隆安县| 武陟县| 义乌市| 泰来县| 秀山| 榆社县| 南开区| 阿克| 怀集县| 福鼎市| 汉沽区| 西充县| 上栗县| 留坝县| 崇义县| 临夏县| 鄄城县| 长阳| 道孚县| 图片| 桐城市| 玉林市| 永平县| 收藏| 库伦旗| 诸暨市| 屏南县| 沭阳县|