Assembly PIC16F84\u中断不工作
刚开始学习PIC微控制器。由于某种原因,Assembly PIC16F84\u中断不工作,assembly,microcontroller,pic,Assembly,Microcontroller,Pic,刚开始学习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 COU
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
电路:您似乎希望通过编程方式在引脚
RB0/INT
上触发外部中断。为此,您需要将RB0
引脚设置为输出
如果您查看的第17页中的图4-4,您可以看到引脚的框图RB3:RB0
。RB0/INT
信号通过施密特触发器缓冲器直接连接到硬件引脚。这意味着该引脚上存在的任何信号都将驱动中断
当您将TRISB0
位设置为1
时,三态缓冲器输出将处于高阻抗,这意味着唯一可以驱动RB0/INT
信号的是连接到引脚的外部电信号
如果您只是将
TRISB0
位设置为0
,写入RB0
的逻辑电平应该能够触发中断。您需要通过电路中的下拉电阻器将RB0/INT
引脚接地,否则松开按钮时引脚电压未定义。您应该这样做:
RBO/INT --- Button --- VDD
|
Resistor (e.g. 10k)
|
GND
通过此电路,您可以:
- 按下按钮:
RB0=1
- 按钮释放:
RB0=0
RBO/INT --- Button --- GND
要使用上述电路,您需要通过清除选项
寄存器中的RBPU
位来启用PORTB
内部上拉电阻器。这些类似于芯片内部将引脚连接到VDD的内部电阻器,但它们在默认情况下是禁用的。启用它们后,您的电路基本上与此类似:
VDD
|
Resistor
|
RBO/INT --- Button --- GND
您也可以将电阻器添加到电路中,而不是使用内部电阻器。请记住,对于最后两个电路,极性将颠倒,即:
- 按下按钮:
RB0=0
- 按钮释放:
RB0=1
- 我没有仔细阅读所有答案,但顾问们似乎忘记了一件简单的事情:
--在MPLAB IDE中,输入变化的模拟应在程序本身之外通过刺激(调试器/刺激;考虑到应先选择Debbuger/Select工具,例如到MPLAB SIM)完成
关于按钮,只有当且仅当内部上拉接通时(仅在端口B上可用,并通过设置选项寄存器(气缸组1)中的位7来完成),按钮才能完全如电子图所示
保存最小上下文(W和状态寄存器的值)可能并不总是需要,有时也不应该这样做——例如,在中断服务例程的任务是将W重置为0的情况下。但应仔细研究每种情况。在将RB0配置为输入后,您希望写入端口寄存器会产生什么影响?您在管脚上应用的实际信号是什么?@doynax我想将一个
按钮
或开关
连接到RB0,当开关或按钮为1时,我预期会触发中断。我这样做是出于调试目的而编程的。@doynax,我已经编辑了question@jafar,请在有关设置的问题中添加更多详细信息,如“我正在MPLAB IDE中生成.HEX,将其加载到Proteus中,运行模拟,在那里按下按钮,但什么都没有发生"。否则,试图回答的人可能会以循环运行结束。为了以编程方式触发外部中断,我将TrisB
配置为输出。但当我将portB
设置为01H
时,即使RB0
为1,程序执行也不会转到04H
。您是否在模拟机上运行此功能r或在实际硬件上?模拟器的开发可能没有考虑到这种详细程度。我注意到的另一件事是,您没有在中断例程中保存/恢复上下文。如果执行被中断,例如,在BSF状态,5
指令之后,您将启动ISR访问库1您至少应在ISR开始时保存状态
寄存器(例如,将其移动到W
寄存器),并在RETFIE
之前将其恢复。我看不出有任何理由保存状态
。我知道当中断启动且程序流移动到04h
时,在中断例程之后,PC
保持点指向中断前要执行的下一条指令。我正在使用模拟器(MPLAB)要进行编码和调试,请使用PROTEUS 8.1进行模拟。是否有中断不工作的明确原因?另一方面,中断例程中的CLRF端口b
无效,因为RB0
配置为输入。