2017-05-23 26 views
1

私はINT1割り込みを使用して矩形パルスを生成しようとしています。 timer0割り込みを使用してパルス長を設定しています。私はこのプログラムでソフトウェアのポーリング方法 を使用しています。 PB1を押すと、PORTDに矩形のパルスが生成されます。 しかし、私がPB1を押すと、INT1IF割り込みフラグは決して設定されません。pic 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サブルーチンの途中で実行されます)。それはあなたが望む何かをする可能性は低いです...

少なくとも、個々の割り込みフラグが条件が発生したときに設定されるためには、実際に割り込みを有効にする必要はありません。 (これはすべてのMCUに当てはまるわけではないことに注意してください)。ただし、タイトループで割り込みフラグをポーリングするだけなので、入力ピンを直接ポーリングする方が簡単です。割り込みフラグを使用する必要がある唯一の理由は、入力パルスが非常に短く(クロック速度に応じてサブマイクロ秒になる可能性がある)、ポーリングループがそれを見逃す可能性がある場合です。 "press"という言葉を数回使用します。この入力が実際に押しボタンの場合、パルスが短すぎて割り込みなしで捕捉する可能性はありません。私はあなたのコードを見

他の二つの潜在的な問題:あなたはADCONxレジスタを設定していない

  • ので、アナログ入力機能を持つすべてのIOピンは、デフォルトでは、アナログモードになります。これは少なくともRA5に影響します。

  • DAC_Aでは、1つのPORTxレジスタに対して連続したビット操作を行っていますが、いくつかの問題があります(詳細については、「PIC RMWの問題」を参照してください)。 LATxレジスタを使用して出力ビットを設定してください。

+0

はい私はそれを理解しています。良い提案。ありがとうございました –

関連する問題