■PIC16F84とMPLABを使って割り込みを試してみる
@RB0/INT割り込み
ARB4〜RB7割り込み
Bタイマー割り込み
により個別の処理が出来るような雛形を作成してみました
▼プログラム
;---------------------------------------------------------------
LIST P=16F84
#include <p16F84.inc>
__CONFIG _CP_OFF & _HS_OSC & _PWRTE_ON & _WDT_OFF
;---------------------------------------------------------------
;アドレスに名前を付ける
;---------------------------------------------------------------
;割り込み時にレジスタを退避させるメモリ
w_temp equ 0x0C
status_temp equ 0x0D
pos1 equ 0x0E
pos2 equ 0x0F
;ウェイト用メモリ
wait_val1 equ 0x10
wait_val2 equ 0x11
;PIC16F84では0x0Cから0x4Fまでが使用可能
;***************************************************************
;リセットベクタ
;***************************************************************
org 0
goto start
;***************************************************************
;割り込みベクタ
;***************************************************************
;割り込みの設定
; INTCONレジスタ
; 0bit RBIF RB4〜RB7の状態変化割込みフラグ
; 1bit INTF RB0/INTの割込みフラグ
; 2bit T0IF TMR0タイマ割込みフラグ
; 3bit RBIE RB4〜RB7の割込み許可ビット
; 4bit INTE RB0/INTの割込み許可ビット
; 5bit T0IE TMR0タイマの割込み許可ビット
; 6bit EEIE データEEPROM書き込み完了割込み許可
; 7bit GIE 全体割込み許可ビット
;***************************************************************
org 4
;レジスタの退避
movwf w_temp
movf STATUS,w
clrf STATUS
movwf status_temp
;各割り込みに対して適切なアドレスにジャンプさせる
btfsc INTCON,RBIF
goto int0
btfsc INTCON,INTF
goto int1
btfsc INTCON,T0IF
goto int2
intret
bcf INTCON,RBIF ;RB4~RB7割り込みフラグリセット
bcf INTCON,INTF ;RB0/INT割り込みフラグリセット
bcf INTCON,T0IF ;タイマー割り込みフラグリセット
;レジスタの復帰
clrf STATUS
movf status_temp,w
movwf STATUS
swapf w_temp,f
swapf w_temp,w
retfie ;割り込みから復帰
;---------------------------------------------------------------
;RB4〜RB7割り込みにより実行
;---------------------------------------------------------------
int0 ;RB4~RB7割り込み
;割り込み時の処理をここに記述
goto intret
;---------------------------------------------------------------
;RB0/INT割り込みにより実行
;---------------------------------------------------------------
int1 ;RB0/INT割り込み
;割り込み時の処理をここに記述
goto intret
;---------------------------------------------------------------
;タイマー割り込みにより実行
;---------------------------------------------------------------
int2 ;タイマー割り込み
;タイマーにはクロックが1/4周期で供給されるため、
;10MHzクロックでは 1/2500000secとなる
;1/19200 sec(52 usec)毎にタイマー割り込みを入れるために
;減算タイマー値に256-130=0x7Eを設定
;しかし、割り込みから、ここまでに0x0Eほどかかるため加算する
movlw 0x7E+0x0E ;タイマー値リセット
movwf TMR0
;割り込み時の処理をここに記述
goto intret ;ジャンプ
;***************************************************************
;スタート
;***************************************************************
start
;---------------------------------------------------------------
;ポートの設定
;---------------------------------------------------------------
clrf PORTA
clrf PORTB
bsf STATUS,5 ;ページを1に切り替え
movlw b'00000000
movwf TRISA ;portAをbit 00000000 を入力に設定
movlw b'00010001
movwf TRISB ;portBを11101110 を出力に設定
bcf STATUS,5 ;ページを0に切り替え
;---------------------------------------------------------------
;***************************************************************
;割り込みの設定
; INTCONレジスタ
; 0bit RBIF RB4〜RB7の状態変化割込みフラグ
; 1bit INTF RB0/INTの割込みフラグ
; 2bit T0IF TMR0タイマ割込みフラグ
; 3bit RBIE RB4〜RB7の割込み許可ビット
; 4bit INTE RB0/INTの割込み許可ビット
; 5bit T0IE TMR0タイマの割込み許可ビット
; 6bit EEIE データEEPROM書き込み完了割込み許可
; 7bit GIE 全体割込み許可ビット
;***************************************************************
clrf INTCON
;---------------------------------------------------------------
;RB0/INT割り込みの設定
;---------------------------------------------------------------
bsf STATUS,5 ;ページを1に切り替え
bcf OPTION_REG,6 ;RB0のエッジ設定は立ち上がり
bcf STATUS,5 ;ページを0に切り替え
bsf INTCON,INTE ;RB0/INT割り込み発生許可
;---------------------------------------------------------------
;RB4〜RB7割り込みの設定
;---------------------------------------------------------------
; bsf INTCON,RBIE ;RB4〜RB7割り込み
;---------------------------------------------------------------
;タイマー割り込みの設定
;---------------------------------------------------------------
movlw 0x00 ;タイマー値リセット
movwf TMR0
bsf STATUS,5 ;ページを1に切り替え
bsf OPTION_REG,0 ;PS0 プリスケーラの設定
bsf OPTION_REG,1 ;PS1
bsf OPTION_REG,2 ;PS2
bsf OPTION_REG,3 ;PSA プリスケーラをTMRで使用する場合は0,WDTで使用する場合は1
bcf OPTION_REG,5 ;T0CS タイマ0の入力先 1でRA4ピン入力,0でクロック1/4入力
bcf STATUS,5 ;ページを0に切り替え
; bsf INTCON,T0IE ;タイマ割り込み発生許可
;---------------------------------------------------------------
;割り込みの開始
;---------------------------------------------------------------
; bsf INTCON,GIE ;割り込み許可
;***************************************************************
;メイン
;***************************************************************
init
main
MOVLW b'00000000
MOVWF PORTA ;WレジスタからFレジスタに代入
; CLRWDT ;ウォッチドックタイマとプリスケーラをクリア
bcf INTCON,GIE ;割り込み発生停止
SLEEP ;INT端子(ポートB)に信号が来るまでPICマイコンがここで停止します
NOP
bsf INTCON,GIE ;割り込み発生許可
goto main
;---------------------------------------------------------------
;ウエイト
;---------------------------------------------------------------
wait_loop
; MOVLW 0x00
MOVWF wait_val1
wait_loop1
MOVLW 0x1F
MOVWF wait_val2
wait_loop2 NOP
decfsz wait_val2,F
goto wait_loop2
decfsz wait_val1,F
goto wait_loop1
return
END
▲トップページ
>
マイコンなど