INT1 인터럽트를 사용하여 직사각형 펄스를 생성하려고합니다. 펄스 길이를 설정하기 위해 timer0 인터럽트를 사용하고 있습니다. 이 프로그램에서 소프트웨어 폴링 방법 을 사용하고 있습니다. PB1을 누르면 PORTD에서 직사각형 펄스가 생성됩니다. 하지만 문제는 PB1을 누르면 INT1IF 인터럽트 플래그가 설정되지 않는다는 것입니다.그림 18F452 외부 인터럽트가 작동하지 않습니다.
여기 내 코드
#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
감사합니다. 좋은 대답. –