You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PIC12F675 Timer1中断使用方法及代码执行异常排查求助

PIC12F675 Timer1中断无法触发的问题排查与修复

你的代码里Timer1中断无法触发的核心原因是未使能外设中断允许位(PEIE),同时还有细节可以优化,以下是具体修复方案:

问题分析

PIC12F675的外设中断(包括Timer1溢出中断)需要满足三个条件才能触发:

  • 全局中断允许位(GIE,INTCON<7>)置1
  • 外设中断允许位(PEIE,INTCON<6>)置1
  • 对应外设的中断允许位(这里是TMR1IE,PIE1<0>)置1

你的代码中只设置了GIE=1,PEIE保持默认的0,导致所有外设中断都被屏蔽,这就是0x0004中断服务程序(ISR)无法执行的根本原因。

修复后的代码

; 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'  ;延时变量
D2 equ h'21' 
D3 equ h'22' 
 
RES_VECT  CODE    0x0000            ; 处理器复位向量
    GOTO    START                   ; 跳转到程序开始处

INT_VECT  CODE    0x0004    
 ; Timer1溢出中断服务程序
  ; 每次中断间隔约100ms(10次/秒)
  movlw d'61' ; (256-61)*256 = 约50ms,预分频器2后为100ms
  movwf TMR1L  ; 重置TMR1L初始值
  clrf TMR1H   ; 重置TMR1H初始值
  bcf PIR1,TMR1IF  ; 清除Timer1中断标志(必须手动清除)
  retfie

MAIN_PROG CODE                      ; 让链接器分配主程序地址
START
  ; 初始化Timer1中断相关寄存器
  bsf STATUS, RP0  ; 切换到寄存器银行1
  bsf PIE1,TMR1IE  ; 使能Timer1溢出中断
  bcf STATUS, RP0   ; 切换回寄存器银行0

  ; 初始化Timer1计数寄存器
  movlw d'61' 
  movwf TMR1L  
  clrf TMR1H   

  ; 配置Timer1控制寄存器:预分频器2,Timer1使能
  movlw b'00010101' 
  movwf T1CON

  ; 使能全局中断和外设中断
  movlw b'11000000' ; GIE=1(全局中断),PEIE=1(外设中断)
  movwf INTCON  

  bcf PIR1,TMR1IF  ; 初始化时清除Timer1中断标志,避免误触发
  
loop  
    movlw d'10'
    movwf D1
    GOTO loop                          ; 无限循环

    END

关键修改点说明

  • INTCON寄存器配置:将movlw b'10000000'改为movlw b'11000000',同时置位GIE和PEIE,允许外设中断触发。
  • 寄存器位可读性优化:用TMR1IF替代直接写0,用TMR1IE替代直接写0,提升代码可读性(这些宏定义在p12f675.inc中已存在)。

模拟器验证步骤

  1. 在MPLAB X模拟器中给INT_VECT段的第一条指令设置断点
  2. 运行程序,观察是否触发断点
  3. 可通过寄存器窗口实时查看PIR1寄存器的TMR1IF位,确认计数溢出时该位是否置1,以及中断是否被响应

内容的提问来源于stack exchange,提问作者gikam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 21:37:36