Assembly pic 18F452外部中断不工作。
我正在尝试使用INT1中断生成一个矩形脉冲。我正在使用定时器0中断来设置脉冲长度。我正在使用软件轮询方法 在这个节目里。当我按下PB1时,它会在端口D产生一个矩形脉冲。 但问题是,当我按下PB1时,INT1IF中断标志从未设置 这是我的密码Assembly pic 18F452外部中断不工作。,assembly,microcontroller,pic,mplab,Assembly,Microcontroller,Pic,Mplab,我正在尝试使用INT1中断生成一个矩形脉冲。我正在使用定时器0中断来设置脉冲长度。我正在使用软件轮询方法 在这个节目里。当我按下PB1时,它会在端口D产生一个矩形脉冲。 但问题是,当我按下PB1时,INT1IF中断标志从未设置 这是我的密码 #include <p18f452.inc> config OSC = HS config BOR = OFF, WDT = OFF, LVP = OFF org 0x0000 goto start #define count d
#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
#包括
配置OSC=HS
配置BOR=OFF,WDT=OFF,LVP=OFF
组织0x0000
开始
#定义计数d'1234'
发援会:
movwf-PORTD;在PORTD中发送WREG值
bcf-PORTA,5例;清除DAC输出的RA5
bcf-PORTA,4例;在DAC WR引脚处产生低脉冲
bsf PORTA,4;回到高位
返回
初始化:
;------------------
;I/O配置
;------------------
movlw b'11001111'
movwf-TRISA;端口的4位和5位作为输出
movlw b'00000000'
movwf-TRISD;端口D的所有位作为输出
;------------------
;TMR0配置
;------------------
clrf T0CON
bsf T0CON,1;TMR0,预定标器8
bsf T0CON,7;TMR0,开始
;------------------
;INT0中断配置
;------------------
bsf INTCON3,3;INT1,启用
bcf-RCON,7例;中断优先级禁用
bsf国际会议,7;全局中断启用
bsf INTCON,6;外围中断启用
;------------------
;其他配置
;------------------
返回
;------------------------------------------------------------
开始:
调用init;初始化代码
再一次:
bcf INTCON3,0;清除INT1IF
民意测验PB1:
btfss INTCON3,0;如果设置为“跳过”,请选中INT1IF
bra poll_PB1
bcf INTCON3,0;清除INT1IF
movlw h'FF'
叫达卡
movlw高(-count)
movwf-TMR0H;加载TMR0H
movlw低(-count)
movwf-TMR0L;装载TMR0L
bcf INTCON,2;清除TMR0IF
民意测验(TMR0):
btfss-INTCON,2;检查超时
bra poll_TMR0
movlw h'00'
叫达卡
movlw高(-count)
movwf-TMR0H;加载TMR0H
movlw低(-count)
movwf-TMR0L;装载TMR0L
bcf INTCON,2;清除TMR0IF
投票站(TMR00):
btfss-INTCON,2;检查超时
bra poll_TMR00
胸罩;再次循环
结束
如果不使用中断服务例程,可以关闭全局中断。当设置外围中断时,应设置位。但是,再说一次,如果你正在轮询,为什么要使用中断呢?只要轮询输入引脚就行了 实际上启用了INT1中断,但没有中断处理程序。当中断发生时,执行将跳转到中断处理程序应该位于的地址(在DAC_A子例程的中间);那不太可能做任何你想做的事
至少在PIC上,不需要实际启用中断,以便在条件发生时设置各个中断标志。(请注意,并非所有MCU都是如此。)
但是,由于您只是在一个紧循环中轮询中断标志,因此可能没有理由这样做-直接轮询输入引脚更简单。您需要使用中断标志的唯一原因是,如果输入脉冲太短(可能是亚微秒,取决于时钟速度),轮询循环可能会错过它。您多次使用“按下”一词,如果此输入实际上是一个按钮,则脉冲不可能太短而不中断
我发现您的代码还有两个潜在问题:
- 您没有设置ADCONx寄存器,因此默认情况下,具有模拟输入功能的每个IO引脚都将处于模拟模式。这至少会影响RA5
- 在DAC_A中,您在单个PORTx寄存器上执行连续的位操作,这有一些问题(有关详细信息,请查阅“PIC RMW问题”)。使用LATx寄存器设置输出位