Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly PIC16F84\u中断不工作_Assembly_Microcontroller_Pic - Fatal编程技术网

Assembly PIC16F84\u中断不工作

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

刚开始学习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
电路:

您似乎希望通过编程方式在引脚
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
      配置为输入。