Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.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 pic 18F452外部中断不工作。_Assembly_Microcontroller_Pic_Mplab - Fatal编程技术网

Assembly pic 18F452外部中断不工作。

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

我正在尝试使用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'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寄存器设置输出位


感谢您的回复。回答得好。