;*****************************************************
; 機体発見器         << PIC12F675 >>
;
; Version 1.20
; 2007/04/29 Nakasige-Tosikazu
;******************************************************
;======================================================
;発振器を４MHz
;- input -
#DEFINE     P_IN        GPIO,3      ;GP3     = 入力信号
                                    ;GP0/1/2 = MBT-05ブザー出力
                                    ;GP4/5   = MBT-05ブザーﾏｲﾅｽ側
;                       
    LIST        P=PIC12F675
    INCLUDE     "P12F675.INC"

CB = _CPD_OFF               ;データEEPROMもプログラム・メモリも
CB &= _CP_OFF               ;コード・プロテクトしない
CB &= _BODEN_OFF            ;ブラウンアウト・リセットを使わない
CB &= _MCLRE_OFF            ;MCLRリセットを使わない
CB &= _PWRTE_ON             ;パワーアップ・タイマを使う
CB &= _WDT_ON               ;ウォッチドッグ・タイマを使う
CB &= _INTRC_OSC_NOCLKOUT   ;内部発振器を使う

    __CONFIG CB

    __IDLOCS H'0120'        ;バージョン1.20
;
;----------------------
; Data Define
;----------------------
    CBLOCK  H'20'           ;H20から汎用レジスタに割付
        C_TIM1              ;遅延タイマカウンタ
        C_TIM2              ;遅延タイマカウンタ
        C_IN                ;入力信号用カウンタ
        C_LP                ;入力信号用カウンタ
        C_NON1              ;入力信号なし用カウンタ
        C_NON2              ;入力信号なし用カウンタ
    ENDC                    ;割付終了
;======================================================
;  Start program
;======================================================
;START
        ORG     H'0'        ;0番地スタート
        CALL    H'3FF'      ;内部発振器をキャリブレーションする
        BSF     STATUS,RP0
        MOVWF   OSCCAL      ;キャリブレーションデータを書く
        BCF     STATUS,RP0
        GOTO    MAIN
;======================================================
;  SubRoutines
;======================================================
;----------------------
;100us Timer Subroutine
;----------------------
TIM99
        MOVLW   D'24'       ;24回
        MOVWF   C_TIM1      ;ここまでで２サイクル
TIM99LP
        NOP
        DECFSZ  C_TIM1,F    ;このループは4サイクル
        GOTO    TIM99LP     ;2+4*24-1=97
        RETLW   0           ;97+2=99*1usec=99usec
;----------------------
;100ms Timer Subroutine
;----------------------
TIME100ms
        MOVLW   D'148'      ;
        MOVWF   C_TIM1      ;
        MOVLW   D'100'      ;
        MOVWF   C_TIM2      ;ここまで4サイクル
TIMELP100ms
        NOP                 ;
        DECFSZ  C_TIM1,F    ;
        GOTO    TIMELP100ms ;4X148X 1= 592
        MOVLW   D'250'      ;4X250X99=99000
        MOVWF   C_TIM1      ;
        DECFSZ  C_TIM2,F    ;
        GOTO    TIMELP100ms ;4X100=400
        NOP                 ;4+592+400+99000+3=99,999
        RETLW   0           ;100,000usec
;
;----------------------
;OSO Beep    Subroutine
;----------------------
        ;===== ブザーをOSO鳴らす =====
BEEPloop
        CALL    beepL       ;長音
        CALL    beepL       ;長音
        CALL    beepL       ;長音
        CALL    TIME100ms   ;100ms
        CALL    TIME100ms   ;100ms
        CALL    beepS       ;短音
        CALL    beepS       ;短音
        CALL    beepS       ;短音
        CALL    TIME100ms   ;100ms
        CALL    TIME100ms   ;100ms
        CALL    beepL       ;長音
        CALL    beepL       ;長音
        CALL    beepL       ;長音
        CALL    TIME100ms   ;100ms
        CALL    TIME100ms   ;100ms
        RETLW   0           ;
BEEPloopEND
;----------------------
beepL
        ;===== 長音 =====
        CLRWDT
        MOVLW   B'00000111' ;GP0/1/2
        MOVWF   GPIO        ;レジスタを１にする
        CALL    TIME100ms   ;100ms
        CALL    TIME100ms   ;100ms
        CALL    TIME100ms   ;100ms
        MOVLW   B'00000000' ;GP0/1/2
        MOVWF   GPIO        ;レジスタを０にする
        CALL    TIME100ms   ;100ms
        RETLW   0           ;
;----------------------
beepS
        ;===== 短音 =====
        CLRWDT
        MOVLW   B'00000111' ;GP0/1/2
        MOVWF   GPIO        ;レジスタを１にする
        CALL    TIME100ms   ;100ms
        MOVLW   B'00000000' ;GP0/1/2
        MOVWF   GPIO        ;レジスタを０にする
        CALL    TIME100ms   ;100ms
        RETLW   0           ;
;----------------------
;
;----------------------
;NOpulse     Subroutine
;----------------------
NOpulse
        ;----- 信号なしの場合はブザーを鳴らす 約0.8秒-----
        MOVLW   D'100'      ;100をWORKへ代入
        MOVWF   C_NON2      ;入力信号なし用カウンタ
NOp010
        CLRWDT
        MOVLW   D'80'       ;80をWORKへ代入
        MOVWF   C_NON1      ;入力信号なし用カウンタ
NOp030
        ;----- 入力信号をチェックする -----
        BTFSS   P_IN        ;入力信号がＨだったらスキップ 
        GOTO    NOp100      ;入力信号がＬなのでリターン
NOp040
        CALL    TIM99       ;100usタイマー
        DECFSZ  C_NON1,F    ;C_NON1から－１
        GOTO    NOp030      ;入力信号再チェック
NOp050
        DECFSZ  C_NON2,F    ;C_NON2から－１
        GOTO    NOp010      ;入力信号再チェック
NOp060
        ;-----  ブザーを鳴らす -----
        CALL    BEEPloop    ;ブザーを鳴らす
NOp100
        RETLW   0           ;サブルーチンの終了リターン
;
;======================================================
;  Main Routine
;======================================================
MAIN
;----------------------
; Initialize Routine
;----------------------
INIT
        ; ----- 初期設定 -----
        BSF     STATUS,RP0  ;STATUSレジスタのRP0ビットを１に
                            ;してBank1(Page1)に切替える     【BSF】 ｆ レジスタの指定ビットを１にする
        MOVLW   B'11111110' ;弱プルアップなし
        MOVWF   OPTION_REG  ;WDTのTimeOutは18ms*64=1.152秒
        MOVLW   B'00001000' ;GP3入力 GP0/1/2/4/5出力
        MOVWF   TRISIO      ;入力出力モードを設
        MOVLW   B'00110000' ;GP0/1/2/3ピンをアナログ入力モード解除
        MOVWF   ANSEL       ;A/D変換クロックはFrc(内部RC発振)
        BCF     STATUS,RP0  ;Bank0(Page0)に戻る             【BCF】 ｆ レジスタの指定ビットを０にする 
        MOVLW   B'00000111' ;GP2:0 をデジタルI/Oに設定
        MOVWF   CMCON       ;CMCON = CM0/CM1/CM2 ON (COMPARATOR OFF)
;
        ; ----- 初期クリア -----
        CLRF    GPIO        ;各ピンを0クリア
        CLRF    C_TIM1      ;遅延タイマカウンタ
        CLRF    C_TIM2      ;遅延タイマカウンタ
        CLRF    C_IN        ;入力信号用カウンタ
        MOVLW   D'5'        ;5をWORKへ代入
        MOVWF   C_LP        ;入力信号用カウンタ
        CLRF    C_NON1      ;入力信号なし用カウンタ
        CLRF    C_NON2      ;入力信号なし用カウンタ
;
;----------------------
; Procedure Routine
;----------------------
PROC
        CLRWDT
P100
        ;----- 入力信号判断 -----
        CALL    NOpulse     ;信号なしチェックへ
        BTFSC   P_IN        ;入力信号がＬかどうか       【BTFSC】０だったらスキップ 
        GOTO    P100        ;入力信号がＬになれば下の処理へ
P110
        BTFSS   P_IN        ;入力信号がＨかどうか       【BTFSS】１だったらスキップ 
        GOTO    P110        ;入力信号がＨになれば下の処理へ
P120
        BTFSC   P_IN        ;入力信号がＬかどうか       【BTFSC】０だったらスキップ 
        GOTO    P120        ;入力信号がＬになれば下の処理へ
        CLRF    C_IN        ;入力信号用カウンタ 初期クリア
P130
        ;-----  信号の幅を計測 -----
        CLRWDT
        INCF    C_IN,F      ;入力信号用カウンタに＋１
        CALL    TIM99       ;100usタイマー
        BTFSS   P_IN        ;入力信号がＨかどうか       【BTFSS】１だったらスキップ 
        GOTO    P130        ;入力信号がＨになれば下の処理へ
P140
        ;-----  信号の幅を判断 -----
        MOVLW   D'15'       ;15をWORKへ代入(1500usよりの大小比較)
        SUBWF   C_IN,W      ;C_IN - 15 = W
        BTFSS   STATUS,C    ;計算結果がO以上ならば、(C=1)スキップへ
        GOTO    P200        ;1500us以下 クリアして最初から
P150
        ;-----  入力信号用カウンタ ５回で鳴す -----
        DECFSZ  C_LP,F      ;C_LPから－１
        GOTO    PROC
P160
        ;-----  ブザーを鳴らす -----
        CALL    BEEPloop    ;ブザーを鳴す
P200
        ;-----  入力信号用カウンタクリア -----
        MOVLW   D'5'        ;5をWORKへ代入
        MOVWF   C_LP        ;入力信号用カウンタ
P300
        ;-----  最初に戻る -----
        GOTO    PROC
;----------------------
;----------------------
        END

