PIC16F84_A中断无效

时间:2016-02-05 16:08:20

标签: 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
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

电路:
enter image description here

3 个答案:

答案 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,则应针对每种情况进行仔细研究。