这段代码有什么问题?0004
上的中断永远不会执行!我尝试更改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
2条答案
按热度按时间m0rkklqb1#
简短地说:要启用定时器1中断,必须设置以下位:
PIE1
<0>)PEIE
位(INTCON
<6>)GIE
位(INTCON
<7>)。k2arahey2#
这是因为你的代码少了一个小步骤。让我来解释一下正确设置定时器1中断所需的步骤。
这里是一个图片,显示了内部电路的所有中断 * PIC 12 F675 。x1c 0d1x现在,如果你有一点数字电子学知识,看看 Timer 1 中断是如何通过CPU中断连接的。特别要注意 AND 门,因为它们的作用就像打开/关闭开关,可以连接/启用或断开/禁用一个电路。更不用说,所有这些路径都是以这样的方式组织的,以便我们可以通过设置或清除相应的位在软件中控制它们。
话虽如此,现在让我们关注逻辑电路中 * 定时器1 的激活路径。此路径由3个主要逻辑块组成,每个逻辑块必须启用,以便将中断信号传输到CPU:
TMR1IF
和TMR1IE
。TMR1IF
在发生溢出时由内部电路设置,因此您只能清除它。TMR1IE
完全由软件控制,因此我们首先设置/启用TMR1IE
位。PEIE
,我们可以完全控制它。因此,我们还需要设置/使能它,以便允许中断信号通过它并到达全局中断控制 AND 门输入。GIE
,我们必须在最后一步设置/启用它。在这里,我们完成了 Timer 1 中断信号通路,这样每当出现溢出时它就会中断CPU。继续并按照上面给出的步骤操作,您将使 * 定时器1* 中断正常工作。