这段代码有什么问题? 0004 处的中断永远不会执行! MPLAB X IDE 模拟器 我尝试更改 T1CON 的所有位,但没有结果
; TODO INSERT CONFIG CODE HERE USING CONFIG BITS GENERATOR
#include "p12f675.inc"
; CONFIG
; __config 0x31F1
__CONFIG _FOSC_XT & _WDTE_OFF & _PWRTE_OFF & _MCLRE_ON & _BOREN_ON & _CP_OFF & _CPD_OFF
D1 equ h'20' ;delay variabile
D2 equ h'21'
D3 equ h'22'
RES_VECT CODE 0x0000 ; processor reset vector
GOTO START ; go to beginning of program
INT_VECT CODE 0x0004
; TODO ADD INTERRUPTS HERE IF USED
;vine de 10 ori/sec
;contor 10 ori:
movlw d'61' ; ar fi (256-61)*256= cca 50 ms > apoi prescaler 2 => 100 ms
movwf TMR1L ;numara 61...255
clrf TMR1H ;numara 0...255
bcf PIR1,0 ;clear timer1 interupt flag/ ca sa porneasca
nop
retfie
MAIN_PROG CODE ; let linker place main program
START
; init timer interupt:
bsf STATUS, RP0 ;banc 1
bsf PIE1,0 ;enable timer 1 interupt
bcf STATUS, RP0 ; banc 0
movlw d'61' ; ar fi (256-61)*256= cca 50 ms > apoi prescaler 2 => 100 ms
movwf TMR1L ;numara 61...255
clrf TMR1H ;numara 0...255
movlw b'00010101' ;prescaler 2, timer1 enabled
movwf T1CON
movlw b'10000000' ;enable timer-overflow interrupt. trebe?!
movwf INTCON
bcf PIR1,0 ;clear timer1 interupt flag/ ca sa porneasca
loop
movlw d'10'
movwf D1
GOTO loop ; loop forever
END
我已经搜索了 ASM 示例。我希望找到一些,但我没有。
似乎中断没有执行,因为全局中断启用 (GIE) 位未在 INTCON 寄存器中设置。一般而言,GIE 位对于启用中断是必需的。您应该按如下方式修改 INTCON 寄存器:
movlw b'10010000' ;enable timer-overflow interrupt and global interrupt enable
movwf INTCON
这应该使 0x0004 处的中断能够正常执行。此外,请确保您的 CONFIG 位针对您的振荡器配置进行了正确设置,因为这也可能会影响您的程序的行为。
您可以参考PIC12F675数据表了解更多关于寄存器和配置设置的信息。
@WeatherVane 已经提到了您的代码中缺少的内容。我想解释一下为什么...
这是一张图片,显示了PIC12F675所有中断的内部电路。
现在,如果您对数字电子学有一点了解,请观察Timer 1 中断是如何连接到 CPU 中断的。特别要注意 AND 门,因为它们就像打开/关闭开关一样,可以连接/启用或断开/禁用一个电路与另一个电路。更不用说所有这些路径都以这样的方式组织,以便我们可以通过设置或清除相应位来在软件中控制它们。
话虽如此,现在让我们关注逻辑电路中 Timer 1 的激活路径。该路径由 3 个主要逻辑块组成,每个逻辑块都必须启用才能将中断信号传输到 CPU:
TMR1IF
和TMR1IE
。 TMR1IF
由内部电路在发生溢出时设置,因此您只能将其清除。 TMR1IE
完全由软件控制,因此我们设置/启用 TMR1IE
位作为第一步。**PEIE**
,我们可以完全控制它.所以我们也需要设置/启用它,以便让中断信号通过它到达全局中断控制AND门输入。GIE
,我们必须在最后一步设置/启用它。你有,我们已经完成了Timer 1中断信号通路,这样每次发生溢出时它都会中断CPU。继续并按照上面给定的步骤操作,您的 Timer 1 中断功能。