pic 18F452外部中断不起作用。

时间:2017-05-23 13:52:07

标签: assembly microcontroller pic mplab

我试图使用INT1中断生成矩形脉冲。我正在使用timer0中断来设置脉冲长度。我正在使用软件轮询方法 在这个计划中。当我按下PB1时,它应该在PORTD产生一个矩形脉冲。 但问题是,当我按下PB1时,INT1IF中断标志永远不会设置。

这是我的代码

#include <p18f452.inc>


config OSC = HS
config BOR = OFF, WDT = OFF, LVP = OFF


org 0x0000
  goto start


#define count d'1234'


DAC_A:
movwf PORTD ;send WREG value in PORTD
bcf PORTA,5 ; clear RA5 for DAC output
bcf PORTA,4 ; make a low puls at DAC WR pin
bsf PORTA,4 ; set back to high
return


init:
;------------------
;I/O config
;------------------
movlw b'11001111' 
movwf TRISA     ;4 and 5 bit of PORTA as output
movlw b'00000000'
movwf TRISD     ;all the bits of PORTD as output
;------------------
;TMR0 config
;------------------
clrf  T0CON
bsf   T0CON,1   ;TMR0, pre-scaler 8
bsf   T0CON,7   ;TMR0, start 
;------------------
;INT0 interrupt config
;------------------
bsf   INTCON3,3 ;INT1, Enable
bcf   RCON,7    ;Interrupt priority disable
bsf   INTCON,7  ;global enterrupt enable
bsf   INTCON,6  ;peripheral enterrupt enable
;------------------
;other config
;------------------

return


;------------------------------------------------------------  

start:     
call init        ; initialisation code 
again:

bcf     INTCON3,0   ;clear INT1IF
poll_PB1:     
btfss   INTCON3,0   ;check INT1IF, if set skip
bra poll_PB1        
bcf     INTCON3,0   ;clear INT1IF

movlw   h'FF'
call    DAC_A

movlw   high(-count)         
movwf   TMR0H       ;load TMR0H
movlw   low(-count)     
movwf   TMR0L           ;load TMR0L
bcf     INTCON,2        ;clear TMR0IF
poll_TMR0:     
btfss   INTCON,2        ;check timeout
bra poll_TMR0     


movlw   h'00'
call    DAC_A


movlw   high(-count)         
movwf   TMR0H       ;load TMR0H
movlw   low(-count)     
movwf   TMR0L           ;load TMR0L
bcf     INTCON,2        ;clear TMR0IF
poll_TMR00:     
btfss   INTCON,2        ;check timeout
bra poll_TMR00

bra again       ;loop again

END

2 个答案:

答案 0 :(得分:1)

如果不使用中断服务程序,则可以关闭全局中断。当外设中断置位时,这些位应该置1。但话又说回来,如果你还是轮询,为什么要使用一个中断,只需轮询输入引脚。

答案 1 :(得分:0)

您实际上已启用INT1中断 - 但没有中断处理程序。当中断发生时,执行将跳转到中断处理程序应该在的地址(在DAC_A子程序的中间);那不太可能做你想做的事......

至少在PIC上,不需要实际启用中断,以便在条件发生时设置各个中断标志。 (请注意,并非所有MCU都适用。)

但是由于你只是在紧密循环中轮询中断标志,所以可能没有理由这样做 - 直接轮询输入引脚更简单。您需要使用中断标志的唯一原因是输入脉冲如此短(可能是亚微秒,取决于时钟速度),轮询循环可能会错过它。您使用“按下”一词几次,如果此输入实际上是一个按钮,则脉冲不可能在没有中断的情况下太短而无法捕获。

我在您的代码中看到的另外两个潜在问题:

  • 您没有设置ADCONx寄存器,因此每个具有模拟输入功能的IO引脚默认都处于模拟模式。这至少会对RA5产生影响。

  • 在DAC_A中,您在单个PORTx寄存器上进行连续的位操作,这有一些问题(详情请查看“PIC RMW问题”)。使用LATx寄存器代替设置输出位。