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中已存在)。
模拟器验证步骤
- 在MPLAB X模拟器中给
INT_VECT段的第一条指令设置断点 - 运行程序,观察是否触发断点
- 可通过寄存器窗口实时查看
PIR1寄存器的TMR1IF位,确认计数溢出时该位是否置1,以及中断是否被响应
内容的提问来源于stack exchange,提问作者gikam
相关产品推荐
相关产品推荐

