目次>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
; =========================== ここまで ===============================