■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






▲トップページ > マイコンなど