■PIC16C71とMPLABを使って割り込みとA/D変換を試してみる
@RB0/INT割り込み
ARB4〜RB7割り込み
Bタイマー割り込み
により個別の処理が出来るような雛形を作成してそこにA/D変換を追加してみました
@ポートAをアナログ入力に設定
bsf STATUS,5 ;ページを1に切り替え
movlw 0xFF
movwf TRISA ;portAを入力に設定
movlw 0x00
movwf TRISB ;portBを出力に設定
clrf ADCON1 ;AN0からAN3をアナログ入力に設定
bcf STATUS,5 ;ページを0に切り替え
Amainループ内でAN0をA/D変換して、その値をポートBに出力
;AN0の値をA/D変換してポートBに出力
movlw B'11000001'
;adcon0レジスタ
;bit 7-6 A/D変換クロック選択ビット 11=RC発振
;bit 4-3 チャンネル選択 00=AN0 01=AN1 10=AN2 11=AN3
;bit 2 GO
;bit 0 A/Dオンビット
movwf ADCON0
call wait_loop ;サンプリング時間待つ
bsf ADCON0,2 ;goフラグを立てる
adloop
btfsc ADCON0,2 ;goフラグが落ちると変換完了
goto adloop
movfw ADRES ;変換後の値をポートBに出力
movwf PORTB
▲以上でA/D変換の値がポートBに出力されました
▼プログラム
;---------------------------------------------------------------
LIST P=16C71
#include <p16C71.inc>
__CONFIG _CP_OFF & _HS_OSC & _PWRTE_ON & _WDT_OFF
;---------------------------------------------------------------
;アドレスに名前を付ける
;---------------------------------------------------------------
;割り込み時にレジスタを退避させる変数
w_temp equ 0x0C
status_temp equ 0x0D
wait_val1 equ 0x0E
wait_val2 equ 0x0F
;***************************************************************
;リセットベクタ
;***************************************************************
org 0
goto start
;***************************************************************
;割り込みベクタ
;***************************************************************
org 4
;レジスタの退避
movwf w_temp
movf STATUS,w
clrf STATUS
movwf status_temp
;各割り込みに対して適切なアドレスにジャンプさせる
btfsc INTCON,0
goto int0
btfsc INTCON,1
goto int1
btfsc INTCON,2
goto int2
intret
;レジスタの復帰
clrf STATUS
movf status_temp,w
movwf STATUS
swapf w_temp,f
swapf w_temp,w
retfie ;割り込みから復帰
;---------------------------------------------------------------
;RB0/INT割り込みにより実行
;---------------------------------------------------------------
int0 ;RB4~RB7割り込み
;割り込み時の処理をここに記述
bcf INTCON,0 ;RB4~RB7割り込みフラグリセット
goto intret
;---------------------------------------------------------------
;RB4〜RB7割り込みにより実行
;---------------------------------------------------------------
int1 ;RB0/INT割り込み
;割り込み時の処理をここに記述
bcf INTCON,1 ;RB0/INT割り込みフラグリセット
goto intret
;---------------------------------------------------------------
;タイマー割り込みにより実行
;---------------------------------------------------------------
int2 ;タイマー割り込み
;割り込み時の処理をここに記述
movlw 0x00 ;タイマー値リセット
movwf TMR0
bcf INTCON,2 ;タイマー割り込みフラグリセット
goto intret
;***************************************************************
;スタート
;***************************************************************
start
;---------------------------------------------------------------
;ポートの設定
;---------------------------------------------------------------
clrf PORTA
clrf PORTB
bsf STATUS,5 ;ページを1に切り替え
movlw 0xFF
movwf TRISA ;portAを入力に設定
movlw 0x00
movwf TRISB ;portBを出力に設定
clrf ADCON1 ;AN0からAN3をアナログ入力に設定
bcf STATUS,5 ;ページを0に切り替え
;---------------------------------------------------------------
;RB0/INT割り込みの設定
;---------------------------------------------------------------
bsf STATUS,5 ;ページを1に切り替え
bcf OPTION_REG,6 ;RB0のエッジ設定は立ち上がり
bcf STATUS,5 ;ページを0に切り替え
; bsf INTCON,4 ;RB0/INT割り込み発生許可
;---------------------------------------------------------------
;RB4〜RB7割り込みの設定
;---------------------------------------------------------------
; bsf INTCON,3 ;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
bcf 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,5 ;タイマ割り込み発生許可
;---------------------------------------------------------------
;割り込みの開始
;---------------------------------------------------------------
; bsf INTCON,7 ;割り込み許可
;***************************************************************
;メイン
;***************************************************************
main
;AN0の値をA/D変換してポートBに出力
movlw B'11000001'
;adcon0レジスタ
;bit 7-6 A/D変換クロック選択ビット 11=RC発振
;bit 4-3 チャンネル選択 00=AN0 01=AN1 10=AN2 11=AN3
;bit 2 GO
;bit 0 A/Dオンビット
movwf ADCON0
call wait_loop ;サンプリング時間待つ
bsf ADCON0,2 ;goフラグを立てる
adloop
btfsc ADCON0,2 ;goフラグが落ちると変換完了
goto adloop
movfw ADRES ;変換後の値をポートBに出力
movwf PORTB
goto main
;---------------------------------------------------------------
;ウエイト
;---------------------------------------------------------------
wait_loop
MOVLW 0x00
MOVWF wait_val1
wait_loop1
MOVLW 0x00
MOVWF wait_val2
wait_loop2 NOP
decfsz wait_val2,F
goto wait_loop2
decfsz wait_val1,F
goto wait_loop1
return
END
▲トップページ
>
マイコンなど