標題: 外部中斷0和中斷1交替設置優(yōu)先級時候出現(xiàn)問題? [打印本頁]

作者: mosybn    時間: 2013-8-29 16:21
標題: 外部中斷0和中斷1交替設置優(yōu)先級時候出現(xiàn)問題?
如下程序,在實驗板上調(diào)試的時候出現(xiàn)這種情況:
當按下k3時候,外部中斷0觸發(fā),燈向右移動,接著按下k4,外部中斷1觸發(fā)(設置了中斷0低優(yōu)先級,中斷1高優(yōu)先級),燈向左移動,
接著再按k3按鍵,就不再實現(xiàn)中斷0觸發(fā)了。仍然在執(zhí)行k4程序。這是為什么呢?
我在k3,K4程序內(nèi)交替設置了中斷0和中斷1優(yōu)先級別,這樣執(zhí)行循環(huán)是否有問題?
在keil里面仿真的時候如圖



;==============================================================
;實驗名稱:中斷實驗程序
;實驗功能:利用外部中斷p3.2,p3.3,按下k3時候,燈右移動,按下k4時候燈左移動,數(shù)碼管利用p2
;
;==============================================================



                  ORG 000H
                  AJMP MAIN
                  ORG 0003H                  ;中斷0入口地址
                  AJMP K3              ;右移程序
                  ORG 0013H                  ;中斷1入口地址
                  AJMP K4                  ;左移程度

                  GPIO_LED EQU P2
                  ORG 0030H                  ;主函數(shù)
                  MAIN:

                  SETB EA                  ;開總中斷
                  CLR IT0                  ;設置外部中斷觸發(fā)方式為低電平觸發(fā)
                  SETB EX0                  ;外部中斷允許

                  CLR IT1
                  SETB EX1
                  MOV A,#11111110B             ;給累加器一個初始值,第一個燈亮

     HERE:SJMP HERE

              ORG 0060H
         K3:
                   SETB PX1
                  CLR PX0
                  MOV GPIO_LED,A
                  ACALL DELAY                                             
                  RR A                                                  ;累加器所有數(shù)字左移一位
                  MOV GPIO_LED,A                          ;將累加器值送到p2
                  AJMP K3
                  RETI

                   ORG 0090H
         K4:
              SETB PX0
                  CLR PX1
                  MOV GPIO_LED,A
                  ACALL DELAY                             
                  RL A                                                  ;累加器所有數(shù)字左移一位
                  MOV GPIO_LED,A                          ;將累加器值送到p2
                  AJMP K4
                  RETI

        DELAY:                                  ;延時程序
                MOV R1,#255
        D1:
                MOV R2,#255
                DJNZ R2,$
                DJNZ R1,D1
                RET
                END

111.jpg (2.85 MB, 下載次數(shù): 134)

111.jpg

作者: mosybn    時間: 2013-8-29 16:42
終于找出原因來了,是delay那里出了問題,將ret改成reti就可以。
我想應該是中斷程序中的子程序也需要加入reti,一旦發(fā)現(xiàn)中斷就可以跳出,然后再跳到中斷程序,最后再跳到優(yōu)先級別高的中斷程序。
    否則就不會跳出子程序,一直在做延時后,跳回原程序。
作者: ahshmj    時間: 2013-8-30 08:24
你這樣改了以后是不是手一放開按鍵就停止了?
作者: ahshmj    時間: 2013-8-30 08:31
你應該在中斷程序里面僅僅做標記,退出中斷后,根據(jù)標記來執(zhí)行動作。
K3:
        SETB    F0
        RETI
K4:
        CLR     F0
       RETI

HERE:                                      ;你原來的標號   
         JB    F0,  XXXX
        ......
       SJMP HERE     
作者: mosybn    時間: 2013-8-30 15:58
ahshmj 發(fā)表于 2013-8-30 08:24
你這樣改了以后是不是手一放開按鍵就停止了?

不會,因為程序一直都在做跳轉(zhuǎn)循環(huán),沒有按下比它更高級別的優(yōu)先時候,程序一直都在做循環(huán),松手也一直在run

作者: mosybn    時間: 2013-8-30 16:01
ahshmj 發(fā)表于 2013-8-30 08:31
你應該在中斷程序里面僅僅做標記,退出中斷后,根據(jù)標記來執(zhí)行動作。
K3:
        SETB    F0

謝謝提示,我試試行不行,這是我移植c程序里面的內(nèi)容再寫的,F(xiàn)在學著發(fā)現(xiàn)手頭能參考的只有c程序了。所以現(xiàn)在慢慢轉(zhuǎn)去用c寫。




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1