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