PIC12F675 定时器 1 中断

问题描述 投票:0回答:2

这段代码有什么问题? 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 示例。我希望找到一些,但我没有。

assembly interrupt pic mplab
2个回答
0
投票

似乎中断没有执行,因为全局中断启用 (GIE) 位未在 INTCON 寄存器中设置。一般而言,GIE 位对于启用中断是必需的。您应该按如下方式修改 INTCON 寄存器:

movlw b'10010000' ;enable timer-overflow interrupt and global interrupt enable
movwf INTCON

这应该使 0x0004 处的中断能够正常执行。此外,请确保您的 CONFIG 位针对您的振荡器配置进行了正确设置,因为这也可能会影响您的程序的行为。

您可以参考PIC12F675数据表了解更多关于寄存器和配置设置的信息。


0
投票

@WeatherVane 已经提到了您的代码中缺少的内容。我想解释一下为什么...
这是一张图片,显示了PIC12F675所有中断的内部电路。 现在,如果您对数字电子学有一点了解,请观察Timer 1 中断是如何连接到 CPU 中断的。特别要注意 AND 门,因为它们就像打开/关闭开关一样,可以连接/启用或断开/禁用一个电路与另一个电路。更不用说所有这些路径都以这样的方式组织,以便我们可以通过设置或清除相应位来在软件中控制它们。
话虽如此,现在让我们关注逻辑电路中 Timer 1 的激活路径。该路径由 3 个主要逻辑块组成,每个逻辑块都必须启用才能将中断信号传输到 CPU:

  • 控制Timer 1中断的第一个AND门是一个有2个输入的
    TMR1IF
    TMR1IE
    TMR1IF
    由内部电路在发生溢出时设置,因此您只能将其清除。
    TMR1IE
    完全由软件控制,因此我们设置/启用
    TMR1IE
    位作为第一步。
  • 控制整个外围中断电路的下一个AND门是一个具有来自外围中断的输入,我们无法控制它,另一个输入称为
    **PEIE**
    ,我们可以完全控制它.所以我们也需要设置/启用它,以便让中断信号通过它到达全局中断控制AND门输入。
  • 下一站,如您所料,是全局中断控制 AND 门,它有 2 个输入。一个来自整个中断控制逻辑,而另一个是
    GIE
    ,我们必须在最后一步设置/启用它。

你有,我们已经完成了Timer 1中断信号通路,这样每次发生溢出时它都会中断CPU。继续并按照上面给定的步骤操作,您的 Timer 1 中断功能。

© www.soinside.com 2019 - 2024. All rights reserved.