这是任务: 您将使用“外部中断”引脚(引脚名称为“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的新手。感谢
答案 0 :(得分:0)
我对PIC不熟悉,我不知道交换机是如何连接的,但是: 检查上拉配置是否与开关连接匹配(如果开关位于引脚和VCC之间,则不上拉)。检查边沿配置(OPTION寄存器)并在首次启用中断之前检查是否清除了INTF。
另外,请注意开关是否没有去抖动滤波器。在线路状态稳定之前,单独的开关可以产生长串脉冲。最多100毫秒。这可能会使中断内部的循环成为问题。 不知道你的时钟频率,我不知道循环需要多长时间。看起来你正在循环65536次。
答案 1 :(得分:0)
乍一看,你的代码看起来还不错(免责声明;我从未使用过这个特定的照片而且我通常用C代码编写)。
这可能只是一个刷新问题,因为微芯片工具(例如PicKit,ICD,...)没有获得实时内存信息,它们在代码执行暂停时加载pic的内存。您的帖子没有提及任何可以排除此问题的内容。要查看变量的更改,您必须偶尔暂停执行,以便IDE有机会重新加载PIC的内存并刷新值。