2017-05-23 16 views
1

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 

답변

1

는 인터럽트 서비스 루틴을 사용하지 않는 경우, 전역 인터럽트를 해제 할 수 있습니다. 주변 장치 인터럽트가 설정되면 비트가 설정되어야합니다. 그런데 다시 폴링을하는 경우 인터럽트를 사용하는 이유는 무엇입니까? 입력 핀을 폴링하면됩니다.

+0

감사합니다. 좋은 대답. –

0

실제로 INT1 인터럽트가 활성화되어 있지만 인터럽트 처리기가 없습니다. 인터럽트가 발생하면 인터럽트 핸들러가 있어야하는 주소로 실행이 이동합니다 (DAC_A 서브 루틴의 중간에 있음). 그건 당신이 원하는 아무 것도 할 가능성이 없습니다 ...

최소한 PIC에서, 실제로 인터럽트가 활성화 될 때마다 인터럽트 플래그가 설정 될 필요가 없습니다. (모든 MCU에 해당되는 것은 아닙니다.)

단호한 루프에서 인터럽트 플래그를 폴링하기 때문에 입력 핀을 직접 폴링하는 것이 더 간단합니다. . 인터럽트 플래그를 사용해야하는 유일한 이유는 입력 펄스가 너무 짧아서 (클럭 속도에 따라 서브 마이크로 초가 될 수 있음) 폴링 루프에서 빠져있을 수 있기 때문입니다. "press"라는 단어를 몇 번 사용합니다.이 입력이 실제로 푸시 버튼 인 경우 펄스가 너무 짧아서 인터럽트없이 catch 할 가능성이 없습니다. 난 당신의 코드를 참조

다른 두 가지 잠재적 인 문제 : 당신은 ADCONx 레지스터를 설정하지 않을

  • , 그래서 아날로그 입력 기능이있는 모든 IO 핀은 기본적으로 아날로그 모드가됩니다. 이것은 적어도 RA5에 영향을줍니다.

  • DAC_A에서는 하나의 PORTx 레지스터에 대해 연속적인 비트 연산을 수행하고 있는데, 몇 가지 문제가 있습니다 (자세한 내용은 "PIC RMW 문제"참조). 출력 비트 설정 대신 LATx 레지스터를 사용하십시오.

+0

네, 이해합니다. 좋은 제안. 고맙습니다 –