目次8章.機能が豊富なPICを使う(PIC16F88)(3)A/D変換を使う>ソース

A/D変換を使う(ソース)

更新日2008.2.16

以下のソースを取り込んで、アセンブル→PIC書き込み→実行して下さい。

; ========================== ここから ==============================
;	PIC16F88
;	clock:20MHz
;
;	AN3でA/D変換し、PORTBの7セグメントLEDに結果を16進で表示する
;
;	PORTB	:7セグメントLED(A〜G,DP)
;	RA0	:2SC1815(7セグ#1の選択)
;	RA1	:2SC1815(7セグ#2の選択)
;	RA2	:2SC1815(7セグ#3の選択)
;	RA3(AN3):VR
;
;	7セグの配置 888
;	7セグの番号 321	右から順番


	LIST      P=16F88
	#INCLUDE  P16F88.INC

	__CONFIG  _CONFIG1, _CP_OFF & _WDT_OFF & _BODEN_ON & _PWRTE_ON & _HS_OSC & _LVP_OFF & _CPD_OFF & _DEBUG_OFF


	CBLOCK	020h
	save_st		;STATUSのセーブ
	save_w		;W-regのセーブ
	timer		;1:996mS
	CNT5mS		;5mSカウンタ=98(51.2uS×98=5.02mS)
	ADsaveH		;ADRESH保存
	ADsaveL		;ADRESL保存
	sel7seg		;7セグメントLED選択
	ENDC

f_t50u	EQU	0	;timer bit0:51.2μSフラグ
f_t5mS	EQU	1	;timer bit1:5mSフラグ

	ORG	0		;リセットの入口
	GOTO	init
; -----------------------------------------------------
; TMR0割り込み処理
;	clock 20MHz
;	TMR0	フリーラン
;	プリスケーラ	なし	
;	割込み周期	51.2uS

	ORG	4		;割込みの入口
intr
	BCF	INTCON,TMR0IF	;割込みフラグクリア
	MOVWF	save_w		;W-regセーブ
	SWAPF	STATUS,W
	MOVWF	save_st		;STATUSセーブ

	BSF	timer,f_t50u	;51.2μS割込みフラグセット

	DECFSZ	CNT5mS,F	;5mS経過?
	GOTO	intr9		; No
	MOVLW	d'98'
	MOVWF	CNT5mS
	BSF	timer,f_t5mS	;5mS経過フラグセット

intr9
	SWAPF	save_st,W
	MOVWF	STATUS		;STATUSロード
	SWAPF	save_w,F
	SWAPF	save_w,W	;W-regロード
	RETFIE			;割込み許可リターン

; -----------------------------------------------------
; 初期処理

init
	CLRF	timer
	MOVLW	d'98'
	MOVWF	CNT5mS
	MOVLW	04h
	MOVWF	sel7seg

	BSF	STATUS,RP0	;■バンク1に切替え
	MOVLW	0F8h
	MOVWF	TRISA		;RA0-2は出力
	CLRF	TRISB		;RB0-7は出力
	MOVLW	88h		;TMR0プリスケーラ未使用
	MOVWF	OPTION_REG	;プリセットカウンタへ出力
	BCF	STATUS,RP0	;■バンク0に切替え
	MOVLW	01h
	MOVWF	PORTB
	CLRF	TMR0		;TMR0セット(0.2μS*1*256=51.2μS)
	BSF	INTCON,TMR0IE	;タイマ割込み許可
	BSF	INTCON,GIE	;全体割込み許可


	; <A/D設定>
	MOVLW	099h
	MOVWF	ADCON0		;32Tosc,CH3,ADON
	BSF	STATUS,RP0	;■バンク1に切替え
	MOVLW	80h
	MOVWF	ADCON1		;右詰め,Vref=Vdd
	MOVLW	08h
	MOVWF	ANSEL		;AN3使用
	BCF	STATUS,RP0	;■バンク0に切替え


; -----------------------------------------------------
; メイン処理

main
	MOVLW	d'0'		;カウント値ロード
	MOVWF	TMR0		;TMR0へ出力(0.2μS*1*256=51.2μS)
	BCF	timer,f_t50u	;51.2μS割込みフラグOFF
main1
	BTFSS	timer,f_t50u	;51.2μS経過?(アクイジション経過?)
	GOTO	main5		; NO
	BCF	timer,f_t50u	;51.2μS経過フラグクリア
	BSF	ADCON0,GO	;AD変換開始
main2
	BTFSC	ADCON0,GO	;AD変換完了?
	GOTO	main2		; NO

	MOVF	ADRESH,W	;AD変換結果の退避
	MOVWF	ADsaveH
	BSF	STATUS,RP0	;■バンク1に切替え
	MOVF	ADRESL,W
	BCF	STATUS,RP0	;■バンク0に切替え
	MOVWF	ADsaveL

main5
	BTFSC	timer,f_t5mS	;5mS経過?(7セグ切り替え)
	CALL	chg7seg		; Yes
	GOTO	main1		; No

; -----------------------------------------------------
; 7セグメントLED表示切り替え
chg7seg
	CLRF	PORTA		;全7セグ消灯

	BCF	STATUS,C
	RRF	sel7seg,F	;次の7セグへ

	BTFSC	sel7seg,0	;7セグ#1?
	GOTO	chg7seg1	; Yes
	BTFSC	sel7seg,1	;7セグ#2?
	GOTO	chg7seg2	; Yes

	MOVLW	04h
	MOVWF	sel7seg
	GOTO	chg7seg3	;7セグ#3

chg7seg1
	MOVF	ADsaveL,W
	ANDLW	0Fh		;ADRESLの下位4ビットの取り出し
	CALL	bin2hex		;7セグ表示用16進数に変換
	MOVWF	PORTB
	GOTO	chg7seg9
chg7seg2
	SWAPF	ADsaveL,W
	ANDLW	0Fh		;ADRESLの上位4ビットの取り出し
	CALL	bin2hex		;7セグ表示用16進数に変換
	MOVWF	PORTB
	GOTO	chg7seg9
chg7seg3
	MOVF	ADsaveH,W	;ADRESHを
	CALL	bin2hex		;7セグ表示用16進数に変換
	MOVWF	PORTB
	GOTO	chg7seg9

chg7seg9
	MOVF	sel7seg,W
	MOVWF	PORTA		;7セグ表示
	RETURN

; -----------------------------------------------------
; バイナリ4ビットを7セグメントLED表示用16進数に変換
bin2hex
	ADDWF	PCL,f

	RETLW	03Fh	;0
	RETLW	006h	;1
	RETLW	05Bh	;2
	RETLW	04Fh	;3
	RETLW	066h	;4
	RETLW	06Dh	;5
	RETLW	07Dh	;6
	RETLW	007h	;7
	RETLW	07Fh	;8
	RETLW	06Fh	;9
	RETLW	077h	;A
	RETLW	07Ch	;b
	RETLW	039h	;C
	RETLW	05Eh	;d
	RETLW	079h	;E
	RETLW	071h	;F

	END
; =========================== ここまで ===============================