我试图使用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
答案 0 :(得分:1)
如果不使用中断服务程序,则可以关闭全局中断。当外设中断置位时,这些位应该置1。但话又说回来,如果你还是轮询,为什么要使用一个中断,只需轮询输入引脚。
答案 1 :(得分:0)
您实际上已启用INT1中断 - 但没有中断处理程序。当中断发生时,执行将跳转到中断处理程序应该在的地址(在DAC_A子程序的中间);那不太可能做你想做的事......
至少在PIC上,不需要实际启用中断,以便在条件发生时设置各个中断标志。 (请注意,并非所有MCU都适用。)
但是由于你只是在紧密循环中轮询中断标志,所以可能没有理由这样做 - 直接轮询输入引脚更简单。您需要使用中断标志的唯一原因是输入脉冲如此短(可能是亚微秒,取决于时钟速度),轮询循环可能会错过它。您使用“按下”一词几次,如果此输入实际上是一个按钮,则脉冲不可能在没有中断的情况下太短而无法捕获。
我在您的代码中看到的另外两个潜在问题:
您没有设置ADCONx寄存器,因此每个具有模拟输入功能的IO引脚默认都处于模拟模式。这至少会对RA5产生影响。
在DAC_A中,您在单个PORTx寄存器上进行连续的位操作,这有一些问题(详情请查看“PIC RMW问题”)。使用LATx寄存器代替设置输出位。