目次>5章 第2ステップ(色々な実験)>(24)超音波を扱う(送受信の動作確認)>ソース

超音波を扱う(送受信の動作確認)

更新日2008.6.7

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

; ========================== ここから ==============================
;	clock:20MHz
;
;	超音波送信テスト
;
;	RA0,1 : 超音波送信器(TMR0割込み毎にON/OFFする)
;
;	TMR0割込み
;	プリスケーラ	なし
;	TMR0		256-63(12.6uS : 40KHzの波長の半分)
;
;
       LIST    P=PIC16F84A
       INCLUDE P16F84A.INC
       __CONFIG _HS_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF

	CBLOCK	0Ch
	save_st		;STATUSのセーブ
	save_w		;W-regのセーブ
	flag		;状態
			; bit0 : 1 wav ON
			; bit1 : 1 TMR0割込み256回(3.2256mS)
	wav_cnt		;1回当たりの超音波サイクル数
	CNT3mS		;TMR0割込み256回カウンタ
	CNT50mS		;50mSカウンタ(TMR0割込み256回を16回)
	ENDC

T0cnt	EQU	d'256' - d'63' + d'10'	;10はオーバヘッド
wav_val	EQU	d'40'	;超音波パルス数(20)×2
wav_ON	EQU	0	;超音波送信中フラグ(flag[0])
T3mFlag	EQU	1	;TMR0割込み256回(3.2256mS)フラグ(flag[1])
CNT50_i	EQU	d'16'

	ORG	0
	GOTO	init

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

	MOVLW	T0cnt
	MOVWF	TMR0		;TMR0初期化

	BTFSS	flag,wav_ON	;超音波送信中?
	GOTO	intr10		; No
	MOVLW	03h
	XORWF	PORTA,F		;超音波送信

	DECFSZ	wav_cnt,F	;超音波送信1回分終了?
	GOTO	intr90		; No
	BCF	flag,wav_ON	;超音波送信中フラグOFF
	MOVLW	wav_val
	MOVWF	wav_cnt		;1回当たりの超音波サイクル数
intr10
	DECFSZ	CNT3mS,F
	GOTO	intr11
	BSF	flag,T3mFlag	;TMR0割込み256回(3.2256mS)フラグセット
intr11

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

; ===================== 初期化ルーチン =====================
init
	BSF	STATUS,RP0	;■バンク1に切替え
	MOVLW	0FCh		;
	MOVWF	TRISA		;RA0,1は出力
	MOVLW	88h		;TMR0プリスケーラ未使用,PORTBプルアップなし
	MOVWF	OPTION_REG	;
	BCF	STATUS,RP0	;■バンク0に切替え
	MOVLW	01h
	MOVWF	PORTA		;RA0のみON
	MOVLW	T0cnt
	MOVWF	TMR0		;TMR0初期化
	BSF	INTCON,T0IE	;タイマ割込み許可
	BSF	INTCON,GIE	;全体割込み許可

	MOVLW	wav_val
	MOVWF	wav_cnt		;1回当たりの超音波サイクル数
	MOVLW	CNT50_i
	MOVWF	CNT50mS		;50mSカウンタ初期化

; ===================== メインルーチン =====================
main
	BTFSC	flag,wav_ON	;超音波送信中?
	GOTO	main		; Yes

	BTFSS	flag,T3mFlag	;TMR0割込み256回(3.2256mS)?
	GOTO	main10		; No

	BCF	flag,T3mFlag	;TMR0割込み256回(3.2256mS)フラグクリア
	DECFSZ	CNT50mS,F	;50mS経過?
	GOTO	main10		; No
	MOVLW	CNT50_i
	MOVWF	CNT50mS		;50mSカウンタ初期化
	BSF	flag,wav_ON	;超音波送信中フラグセット	

main10
	GOTO	main

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