Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 图:从ISR返回时禁用中断_Assembly_Microcontroller_Interrupt_Pic - Fatal编程技术网

Assembly 图:从ISR返回时禁用中断

Assembly 图:从ISR返回时禁用中断,assembly,microcontroller,interrupt,pic,Assembly,Microcontroller,Interrupt,Pic,我正在为PIC16F628A编写一些汇编代码,发现以下问题: 调用ISR例程时,GIE(全局中断启用位)自动清除。然后,当ISR例程返回时,该位将再次自动设置 我希望中断在ISR例程返回时被永久禁用,我不希望GIE被重置,但不管发生什么,它都会被重置 下面是一些示例代码: LIST p=16F628A #INCLUDE <P16F628A.INC> __CONFIG _LP_OSC & _WDT_OFF & _PWRTE_OFF &

我正在为PIC16F628A编写一些汇编代码,发现以下问题:

调用ISR例程时,GIE(全局中断启用位)自动清除。然后,当ISR例程返回时,该位将再次自动设置

我希望中断在ISR例程返回时被永久禁用,我不希望GIE被重置,但不管发生什么,它都会被重置

下面是一些示例代码:

LIST        p=16F628A
#INCLUDE    <P16F628A.INC> 

__CONFIG    _LP_OSC & _WDT_OFF & _PWRTE_OFF & _BODEN_OFF & _INTRC_OSC_NOCLKOUT & _MCLRE_OFF


CONTROL     EQU 0X20    ; A general purpose register used to control a loop
CAN_GO_ON   EQU 0       ; A flag bit at register CONTROL

ORG 00
    goto start

ORG 04
    goto isr

ORG 10

start
    bsf     STATUS, RP0     ; Selects bank 1
    movlw   0xFF            ; Set all PORTB pins as input
    movwf   TRISB       
    bcf     STATUS,RP0      ; Selects bank 0
    movlw   0x08            ; Enables only PORTB<4:7> change interrupts
    movwf   INTCON          ; GIE is cleared for now.

; ... later in the code ...


wait_for_interrupt_to_happen
    bsf     INTCON, GIE         ; Enable interrupts. INTCON now reads 0x88
someloop                        ; This loop will go on and on until and interrupt occurs
    nop                         ; and the ISR set the flag CAN_GO_ON
    btfsc   CONTROL, CAN_GO_ON
    goto    resume_program      ; The isr returned, GIE is set. I don't want another interrupt to
                                ; happen now. But if PORTB<4:7> changes now, isr will be called
                                ; again before I have the chance to clear GIE and disable interrupts. :(
    goto    someloop


resume_program
    bcf     INTCON, GIE         ; I don't want more interrrupts to happen, so I clear GIE.
                                ; INTCON now reads 0x08
    ; ...
    ; ...
    ; ... 


isr
    nop                         ; An interrupt has ocurred. GIE is automatically disabled here.
                                ; INTCON reads 0x09
    bsf     CONTROL, CAN_GO_ON  ; flag CAN_GO_ON is set so the program can break from the loop
                                ; and resume execution
    bcf     INTCON, RBIF        ; clear the PORTB change interrupt flag. INTCON now reads 0x08
    retfie                      ; after retfie, GIE is automatically reset, and INTCON will read 0x88


end
列表p=16F628A
#包括
__配置低压OSC和WDT关闭和PWRTE关闭和BODEN关闭和INTRC OSC关闭和MCLRE关闭
控制方程0X20;用于控制环路的通用寄存器
你能上EQU 0吗;寄存器控制中的标志位
组织00
开始
组织04
转到isr
组织10
开始
bsf状态,RP0;选择银行1
movlw-0xFF;将所有端口B引脚设置为输入
movwf-TRISB
bcf状态,RP0;选择银行0
movlw 0x08;仅启用PORTB更改中断
movwf INTCON;GIE现在可以离开了。
; ... 在代码的后面。。。
等待中断发生
bsf国际会议,GIE;启用中断。INTCON现在读取0x88
someloop;该循环将持续不断,直到中断发生
否;ISR设置了可以继续的标志
btfsc控制,可以继续吗
后进先出计划;isr返回,GIE已设置。我不想再被打断了
; 现在就发生吧。但如果PORTB现在更改,将调用isr
; 再次在我有机会清除GIE和禁用中断之前:(
转到某个环路
恢复计划
bcf INTCON,GIE;我不希望发生更多的中断,所以我清除GIE。
;INTCON现在读取0x08
; ...
; ...
; ... 
isr
没有;发生中断。GIE在此自动禁用。
;INTCON读取0x09
bsf控制,CAN_GO_ON;设置CAN_GO_ON标志,以便程序可以从循环中断
;并恢复执行
bcf INTCON,RBIF;清除端口B更改中断标志。INTCON现在读取0x08
retfie;retfie后,GIE自动重置,INTCON将读取0x88
结束
在中断未再次启用的情况下,如何禁用来自ISR的中断


提前感谢您的帮助。

看起来您可以替换为,除了将GIE设置为1之外,执行相同的工作。

看起来您可以替换为,除了将GIE设置为1之外,执行相同的工作。

问题已解决

解决方案就是使用
return
而不是
retfie

retfie
将从中断服务例程返回并重新启用中断。
return
将从例程返回并保持一切不变

isr
    nop
    bsf    CONTROL, CAN_GO_ON
    bcf    INTCON, RBIF
    return
问题解决了

解决方案就是使用
return
而不是
retfie

retfie
将从中断服务例程返回并重新启用中断。
return
将从例程返回并保持一切不变

isr
    nop
    bsf    CONTROL, CAN_GO_ON
    bcf    INTCON, RBIF
    return

收到了,非常感谢!收到了,非常感谢!