;***************************************************** ; 2009年02月20日更新 ; 使用device:PIC16F630 レゾネータ:4MHz(1サイクル1.0μs) ;***************************************************** LIST P=PIC16F630 INCLUDE "P16F630.INC" __CONFIG _INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_ON & _MCLRE_ON & _BODEN_OFF COUNT0 EQU 021H COUNT1 EQU 022H COUNT2 EQU 023H COUNT3 EQU 024H COUNT4 EQU 025H COUNT5 EQU 026H COUNT6 EQU 027H DISCNUM0 EQU 031H PECNUM EQU 032H MCODE EQU 033H NUM EQU 034H DISCNUM1 EQU 035H DISCNUM2 EQU 036H DISCNUM EQU 037H TCOUNT1 EQU 038H TCOUNT2 EQU 039H ;***************************************************** ; 初期設定 ; 入力:(TRISA) ; PORTA,1(反射波検出部) ; PORTA,3(コンパレータ入力) ; PORTA,5(シリアル通信受信部) ; 出力:(TRISA) ; PORTA,0(超音波発生部) ; PORTA,2(超音波発生部) ; PORTA,4(シリアル通信送信部) ; 内蔵オシレータの誤差修正(OSCCAL) ; PORTA,3以外のPORTAをプルアップ(WPUA,OPTION_REG) ; コンパレータの比較電圧を約0.2[V]に設定(VRCON) ;***************************************************** INIT BSF STATUS,RP0 CALL 3FFH MOVWF OSCCAL MOVLW 02AH MOVWF TRISA MOVLW 037H MOVWF WPUA CLRF TRISC MOVLW 0A1H MOVWF VRCON BCF STATUS,RP0 MOVLW 014H MOVWF CMCON CLRF PORTA ;***************************************************** ; 変数の初期化 ; PECNUM:超音波センサボードの固有識別番号 ; MCODE:超音波センサボードのマスターコード ;***************************************************** MAIN BSF PORTA,4 CLRF PORTC CLRF COUNT0 CLRF COUNT1 CLRF COUNT2 CLRF COUNT3 CLRF COUNT4 CLRF COUNT5 CLRF COUNT6 CLRF TCOUNT1 CLRF TCOUNT2 CLRF DISCNUM0 CLRF DISCNUM1 CLRF DISCNUM2 CLRF DISCNUM MOVLW 01H MOVWF PECNUM MOVLW 0F0H MOVWF MCODE ;***************************************************** ; 識別番号受信部 ;***************************************************** LOOP BTFSC PORTA,5 GOTO LOOP MOVLW 08H MOVWF COUNT4 GOTO $+1 NOP DISC0 CALL DUMMYBIT BTFSC PORTA,5 BSF STATUS,C BTFSS PORTA,5 BCF STATUS,C RRF DISCNUM DECFSZ COUNT4,F GOTO DISC0 ;***************************************************** ; 識別番号判定部 ;***************************************************** DISC1 MOVF PECNUM,W MOVWF NUM MOVF DISCNUM,W XORWF NUM,F INCF NUM,F DECFSZ NUM,F GOTO MASTER ;***************************************************** ; 送信パルス発生部 ;***************************************************** IPULSE BSF PORTC,1 MOVLW 08H MOVWF COUNT4 PULSE CALL F40K DECFSZ COUNT4,F GOTO PULSE ;***************************************************** ; 回り込み回避 ;***************************************************** MOVLW 015H MOVWF COUNT4 WAIT15 CALL WAIT58 DECFSZ COUNT4,F GOTO WAIT15 ;***************************************************** ; 距離計測部 ; 1mの距離を往復するのにかかる時間(音波)=5.82[msec] ; 1cmの距離を往復するのにかかる時間(音波)=58.2[μsec] ;***************************************************** MOVLW 02H MOVWF COUNT5 DIS MOVLW 0FFH MOVWF COUNT4 DISTANCE BTFSC CMCON,COUT GOTO ANALYZE CALL WAIT58 INCFSZ TCOUNT1,F GOTO DISTANCEL INCF TCOUNT2 DISTANCEL DECFSZ COUNT4,F GOTO DISTANCE DECFSZ COUNT5,F GOTO DIS MOVLW 0FBH MOVWF TCOUNT1 MOVLW 026H MOVWF TCOUNT2 ANALYZE ;***************************************************** ; 距離送信部(シリアル通信) ;***************************************************** MOVLW 08H MOVWF COUNT4 MOVWF COUNT5 MOVWF COUNT6 MOVLW 00H CALL DATABIT NOP GOTO $+1 CATCH1 RRF TCOUNT1 BTFSS STATUS,C MOVLW 01H BTFSC STATUS,C MOVLW 011H CALL DATABIT DECFSZ COUNT5,F GOTO CATCH1 NOP BSF PORTA,4 CALL DUMMYBIT CALL DUMMYBIT CALL DUMMYBIT MOVLW 00H CALL DATABIT NOP GOTO $+1 CATCH2 RRF TCOUNT2 BTFSS STATUS,C MOVLW 01H BTFSC STATUS,C MOVLW 011H CALL DATABIT DECFSZ COUNT6,F GOTO CATCH2 NOP BSF PORTA,4 GOTO MAIN ;***************************************************** ; 40KHz生成部 ; 使用ポート:PORTA,2 ;***************************************************** F40K MOVLW 011H MOVWF PORTA MOVLW 03H MOVWF COUNT0 LOOP1 DECFSZ COUNT0,F GOTO LOOP1 NOP MOVLW 014H MOVWF PORTA GOTO $+1 NOP RETURN ;***************************************************** ; 58.0μsec WAIT ;***************************************************** WAIT58 MOVLW 0FH MOVWF COUNT2 DUMMY58 DECFSZ COUNT2,F GOTO DUMMY58 RETURN ;***************************************************** ; 38msec WAIT ;***************************************************** WAIT38 BSF STATUS,RP0 BSF TRISA,4 BCF STATUS,RP0 MOVLW 064H MOVWF COUNT2 WAIT38L2 MOVLW 07DH MOVWF COUNT1 WAIT38L1 DECFSZ COUNT1,F GOTO WAIT38L1 DECFSZ COUNT2,F GOTO WAIT38L2 MOVLW 01FH MOVWF COUNT3 WAIT38L3 DECFSZ COUNT3,F GOTO WAIT38L3 NOP BSF STATUS,RP0 BCF TRISA,4 BCF STATUS,RP0 GOTO MAIN ;***************************************************** ; DATA_BIT ;***************************************************** DATABIT MOVWF PORTA MOVLW 01EH MOVWF COUNT1 DATABITL DECFSZ COUNT1,F GOTO DATABITL RETURN ;***************************************************** ; DUMMY_BIT ;***************************************************** DUMMYBIT NOP MOVLW 01EH MOVWF COUNT1 DUMMYBITL DECFSZ COUNT1,F GOTO DUMMYBITL RETURN ;***************************************************** ; マスターコード識別部 ;***************************************************** MASTER MOVF MCODE,W MOVWF NUM MOVF DISCNUM,W XORWF NUM,F INCF NUM DECFSZ NUM,F GOTO WAIT38 GOTO IPULSE FINISH END