Assembly PIC16F877A-使用按钮中断
任务如下: 您将使用“外部中断”引脚(引脚名称为“INT”)生成中断。该引脚与PICDEM 2 Plus eval板上的开关“S3”相连。按下此开关将产生中断。 我们将把这个管脚配置为输入,启用外部中断,启用全局中断,并跟踪我们用一个名为“Push_Count”的寄存器生成这个中断的次数 这是我的密码:Assembly PIC16F877A-使用按钮中断,assembly,interrupt,pic,Assembly,Interrupt,Pic,任务如下: 您将使用“外部中断”引脚(引脚名称为“INT”)生成中断。该引脚与PICDEM 2 Plus eval板上的开关“S3”相连。按下此开关将产生中断。 我们将把这个管脚配置为输入,启用外部中断,启用全局中断,并跟踪我们用一个名为“Push_Count”的寄存器生成这个中断的次数 这是我的密码: ; PIC16F877A Configuration Bit Settings ; ASM source line config statements #include <p16F
; PIC16F877A Configuration Bit Settings
; ASM source line config statements
#include <p16F877A.inc>
; CONFIG
; __config 0xFF7B
__CONFIG _FOSC_EXTRC & _WDTE_OFF & _PWRTE_OFF & _BOREN_ON & _LVP_OFF & _CPD_OFF & _WRT_OFF & _CP_OFF
cblock 0x020
COUNTERL
COUNTERH
PUSH_COUNT
endc
org 0x0000 ;put next line of code at address 0x0000
RESET_V goto START ;reset vector
START org 0x040
clrf PUSH_COUNT ;reset counter to 0
clrf INTCON ;clear INTCON register
bsf INTCON,INTE ;enable external int on INT pin
bsf INTCON,GIE ;enable global int
bsf STATUS,RP0 ;switch to bank 1
movlw b'00000001' ;set RB0 as input
movwf TRISB ;move value to TRISB
bcf STATUS,RP0 ;switch to bank
clrf PORTB ;clear PORTB output vector
bsf PORTB,0 ;turn on LED on RB0
goto $ ;loop here forever
INT_SERVICE org 0x004
call DELAY
incf PUSH_COUNT,f ;increment PUSH_COUNT
bcf INTCON,INTF ;clear int flag
retfie
DELAY decfsz COUNTERL ;decrement COUNTERL
goto DELAY ;if not zero, keep decrementing COUNTERL
decfsz COUNTERH ;decrement COUNTERH
goto DELAY ;if not zero, keep decrementing COUNTERH
return
END
;PIC16F877A配置位设置
; ASM源代码行配置语句
#包括
; 配置
; __配置0xFF7B
__配置(FOSC)和(WDTE)关闭和(PWRTE)关闭和(BOREN)打开和(LVP)关闭和(CPD)关闭和(WRT)关闭和(CP)关闭
cblock 0x020
反击
柜台
推送计数
endc
组织0x0000;将下一行代码放在地址0x0000处
重新启动;重置向量
启动组织0x040
clrf推送计数;将计数器重置为0
clrf INTCON;清除INTCON寄存器
bsf INTCON,INTE;在int引脚上启用外部int
bsf国际会议,GIE;启用全局整型
bsf状态,RP0;切换到气缸组1
movlw b'00000001';将RB0设置为输入
movwf-TRISB;将值移动到TRISB
bcf状态,RP0;转行
clrf端口B;清除端口B输出向量
bsf端口B,0;打开RB0上的LED
转到美元;永远在这里循环
内部服务组织0x004
呼叫延迟
增量推送计数,f;递增推送计数
bcf INTCON,INTF;清除整型标志
从中断返回
延迟decfsz计数器;减量计数器
转到延迟;如果不是零,则继续递减计数器L
decfsz计数器;减量计数器
转到延迟;如果不是零,则继续递减计数器H
返回
结束
我的问题是,每当我按下PICDEM 2上的S3开关时,中断不工作,PUSH_计数寄存器的值不增加/计数。我的代码有问题吗?我刚接触过这张照片。谢谢我对图片不熟悉,也不知道交换机是如何连接的,但是: 检查上拉配置是否与开关连接匹配(如果开关位于引脚和VCC之间,则无上拉)。检查边缘配置(选项寄存器),并在首次启用中断之前检查是否清除INTF 此外,注意开关是否没有去抖动过滤器。在线路状态稳定之前,开关本身可能会产生长系列的脉冲。高达100毫秒。这可能使中断内的循环成为问题。
不知道你的时钟频率,我不知道循环需要多长时间。看起来您正在循环65536次。乍一看,您的代码看起来还行(免责声明;我从未使用过这个特定的pic,我通常使用C编写代码)
这可能只是一个刷新问题,因为微芯片工具(例如PicKit、ICD等)没有获得实时内存信息,它们在代码执行暂停时加载pic的内存。你的帖子没有提到任何可以排除这个问题的东西。要查看变量的变化,您必须偶尔暂停执行,以便IDE有机会重新加载PIC的内存并刷新值。您的时钟频率是多少?
延迟时间可能太长。如何检查“推送计数”的内容?你在调试模式下运行吗?我的振荡器设置为EXT,我没有设置任何时钟频率。我正在检查板上MPLAB XF的“文件寄存器”窗口中的PUSH_计数的内容,用于外部时钟频率检查Y2(或Y1)。但更重要的是:当您在调试模式下中断(通过单击“调试主项目”运行)时,如果变量在范围内,文件寄存器窗口将显示当前寄存器值。