■PIC16C71と秋月ライタ付属のPA.EXEを使って割り込みとA/D変換を試してみる
@RB0/INT割り込み
ARB4〜RB7割り込み
Bタイマー割り込み
により個別の処理が出来るような雛形を作成してそこにA/D変換を追加してみました
@ポートAをアナログ入力に設定
clr ra
mov !ra,#0FFh ;portAを入力に設定
bsf status,5 ;ページを1に切り替え
clrf adcon1 ;AN0からAN3をアナログ入力に設定
bcf status,5 ;ページを0に切り替え
Amainループ内でAN0をA/D変換して、その値をポートBに出力
;AN0の値をA/D変換してポートBに出力
movlw 0C1h ;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 ;サンプリング時間待つ
bsf adcon0,2 ;goフラグを立てる
adloop
btfsc adcon0,2 ;goフラグが落ちると変換完了
goto adloop
mov portb,adres ;変換後の値をポートBに出力
▲以上でA/D変換の値がポートBに出力されました
▼プログラム
include 16c71x.h
.16c71 ; PIC16C71に設定
.osc hs
.pwrt on
.wdt off
.protect off
;---------------------------------------------------------------
;アドレスに名前を付ける
;---------------------------------------------------------------
;割り込み時にレジスタを退避させる変数
w_temp equ 0ch
status_temp equ 0dh
wait_val1 equ 0eh
wait_val2 equ 0fh
;***************************************************************
;リセットベクタ
;***************************************************************
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,w
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 ;タイマー割り込み
;割り込み時の処理をここに書く
; mov tmr0,#0h ;タイマー値リセット
bcf intcon,2 ;タイマー割り込みフラグリセット
goto intret
;***************************************************************
;スタート
;***************************************************************
start
;---------------------------------------------------------------
;ポートの設定
;---------------------------------------------------------------
clr ra
clr rb
mov !ra,#0FFh ;portAを入力に設定
mov !rb,#0h ;portBを出力に設定
mov rb,#0h ;portBに出力
bsf status,5 ;ページを1に切り替え
clrf adcon1 ;AN0からAN3をアナログ入力に設定
bcf status,5 ;ページを0に切り替え
;---------------------------------------------------------------
;RB0/INT割り込みの設定
;---------------------------------------------------------------
bsf status,5 ;ページを1に切り替え
bcf option,6 ;RB0のエッジ設定は立ち上がり
bcf status,5 ;ページを0に切り替え
; bsf intcon,4 ;RB0/INT割り込み発生許可
;---------------------------------------------------------------
;RB4〜RB7割り込みの設定
;---------------------------------------------------------------
; bsf intcon,3 ;RB4〜RB7割り込み発生許可
;---------------------------------------------------------------
;タイマー割り込みの設定
;---------------------------------------------------------------
;mov tmr0,#0h ;タイマー値リセット
bsf status,5 ;ページを1に切り替え
bsf option,0 ;PS0 プリスケーラの設定
bsf option,1 ;PS1
bsf option,2 ;PS2
bcf option,3 ;PSA
bcf option,5 ;T0CS タイマ0の入力先 0でクロック4/1
bcf status,5 ;ページを0に切り替え
; bsf intcon,5 ;タイマ割り込み発生許可
;---------------------------------------------------------------
;割り込みの開始
;---------------------------------------------------------------
; bsf intcon,7 ;割り込み許可
;***************************************************************
;メイン
;***************************************************************
main
;AN0の値をA/D変換してポートBに出力
movlw 0C1h ;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
mov portb,adres ;変換後の値をポートBに出力
goto main
;---------------------------------------------------------------
;ウエイト
;---------------------------------------------------------------
wait_loop
wait_loop2
decfsz wait_val2
goto wait_loop2
decfsz wait_val1
goto wait_loop
return
▲トップページ
>
マイコンなど