Assembly PIC16F877A-使用按钮中断

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

任务如下: 您将使用“外部中断”引脚(引脚名称为“INT”)生成中断。该引脚与PICDEM 2 Plus eval板上的开关“S3”相连。按下此开关将产生中断。   我们将把这个管脚配置为输入,启用外部中断,启用全局中断,并跟踪我们用一个名为“Push_Count”的寄存器生成这个中断的次数

这是我的密码:

; 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)。但更重要的是:当您在调试模式下中断(通过单击“调试主项目”运行)时,如果变量在范围内,文件寄存器窗口将显示当前寄存器值。