PIC16F877A - 使用按钮中断

时间:2015-01-28 05:50:41

标签: assembly interrupt pic

这是任务: 您将使用“外部中断”引脚(引脚名称为“INT”)来产生中断。该引脚连接到PICDEM 2 Plus评估板上的开关“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

我的问题是,每次我按下PICDEM 2上的S3开关时,中断都不起作用,PUSH_COUNT寄存器的值不会增加/计数。我的代码有问题吗?我只是PIC的新手。感谢

2 个答案:

答案 0 :(得分:0)

我对PIC不熟悉,我不知道交换机是如何连接的,但是: 检查上拉配置是否与开关连接匹配(如果开关位于引脚和VCC之间,则不上拉)。检查边沿配置(OPTION寄存器)并在首次启用中断之前检查是否清除了INTF。

另外,请注意开关是否没有去抖动滤波器。在线路状态稳定之前,单独的开关可以产生长串脉冲。最多100毫秒。这可能会使中断内部的循环成为问题。 不知道你的时钟频率,我不知道循环需要多长时间。看起来你正在循环65536次。

答案 1 :(得分:0)

乍一看,你的代码看起来还不错(免责声明;我从未使用过这个特定的照片而且我通常用C代码编写)。

这可能只是一个刷新问题,因为微芯片工具(例如PicKit,ICD,...)没有获得实时内存信息,它们在代码执行暂停时加载pic的内存。您的帖子没有提及任何可以排除此问题的内容。要查看变量的更改,您必须偶尔暂停执行,以便IDE有机会重新加载PIC的内存并刷新值。