刚开始学习PIC微控制器。出于某种原因,PORTB
仍为0x00
,并且永远不会发生中断。
;*** COUNTER WITH INTERRUPT ***
;***** PIC16FA4_A *************
ORG 0H
STATUS EQU 03H
PORTA EQU 05H
PORTB EQU 06H
TRISA EQU 85H
TRISB EQU 86H
INTCON EQU 0BH
COUNT EQU 0CH
COUNT1 EQU 08H
COUNT2 EQU 09H
GOTO MAIN
;** INTERRUP ROUTINE **
ORG 04H
INCF COUNT,1
CLRF PORTB ; CLEAR RBO
MOVLW 0AH
SUBWF COUNT
BTFSS STATUS,0 ;TEST FOR CARRY FLAG
GOTO GO_ON
GOTO CLEAR
GO_ON
BCF INTCON,1
RETFIE
CLEAR
CLRF COUNT
BCF INTCON,1
RETFIE
;** END OF INERRUPT ROUTINE **
MAIN
BSF INTCON,7; GLOBAL INTERRUPT ENABLE
BSF INTCON,4; RB0 INTERRUPT ENABLE
BCF INTCON,1; CLEAR INTERRUPT FLAG JUST IN CASE IT IS ON
BSF STATUS,5
MOVLW 00H ;ALL RA PINS AS OUTPUT PINS
MOVWF TRISA
MOVLW 01H ;RB0 PIN AS INPUT PIN
MOVWF TRISB
BCF STATUS,5
LOOP
MOVFW COUNT
MOVWF PORTA ;PUT COUNT IN PORTA
CALL DELAY ;DELAY
MOVLW 01H
MOVWF PORTB ;SET RB0
;EXPECT PROGRAM CONTROL TO GO TO 04H (ORG) BUT IT DOESN'T
;ALSO, USING THE WATCH OPTION IN DEBUGGER, PORTB STAYS 0H
;CAN ANYONE HELP?
GOTO LOOP
DELAY
LOOP1
DECFSZ COUNT1,1
GOTO LOOP1
LOOP2
DECFSZ COUNT2
GOTO LOOP2
RETURN
END
答案 0 :(得分:0)
似乎您想以编程方式触发引脚RB0/INT
上的外部中断。为此,您需要将RB0
引脚设置为输出。
如果查看PIC16F84A datasheet第17页的图4-4,您可以看到引脚RB3:RB0
的方框图。 RB0/INT
信号通过施密特触发缓冲器直接连接到硬件引脚。这意味着该引脚上的任何信号都将驱动中断。
当您将TRISB0
位设置为1
时,3态缓冲器输出将处于高阻态,这意味着唯一可以驱动RB0/INT
信号的是外部连接到引脚的电信号。
如果只将TRISB0
位设置为0
,则写入RB0
的逻辑电平应该能够触发中断。
答案 1 :(得分:0)
您需要通过电路中的下拉电阻将RB0/INT
引脚连接到地,否则释放按钮时引脚电压不确定。你应该这样做:
RBO/INT --- Button --- VDD
|
Resistor (e.g. 10k)
|
GND
通过这个电路,你有:
RB0 = 1
RB0 = 0
或者,您可以像这样连接按钮:
RBO/INT --- Button --- GND
要使用上述电路,您需要通过清除PORTB
寄存器中的RBPU
位来使能OPTION
内部上拉电阻。这些类似于芯片内部将引脚连接到VDD的内部电阻,但默认情况下它们被禁用。启用它们后,电路基本上与此类似:
VDD
|
Resistor
|
RBO/INT --- Button --- GND
您也可以在电路中添加电阻,而不是使用内部电阻。请记住,对于最后两个电路,极性将反转,即:
RB0 = 0
RB0 = 1
答案 2 :(得分:0)
我没有仔细阅读所有答案,但看来顾问忘记了一件简单的事情: -在MPLAB IDE中,应该通过刺激(Debugger / Stimulus;考虑到Debbuger / Select Tool应该在此之前选择Debbuger / Select Tool,例如MPLAB SIM)在程序本身之外进行输入变化的模拟。
关于按钮,当且仅当内部上拉电路处于接合状态时,按钮才能完全如电子图所示(仅在PORTB上可用,并且通过将选项寄存器中的第7位设置(在存储区1中)完成)
可能不一定总是需要保存最小的上下文(W和STATUS寄存器的值),有时不应该这样做-例如如果中断服务程序的任务是将W重置为0,则应针对每种情况进行仔细研究。