;*****************************************************
; 機体発見器 MBT-05        << PIC12C509A >>
;
; Version 1.00
; 2004/07/17 Nakasige-Tosikazu
;******************************************************
;======================================================
;発振器を４MHz
;- input -
#DEFINE     P_IN        GPIO,3      ;GP3     = 入力信号
                                    ;GP0/1/2 = ブザー出力
                                    ;GP4/5   = ブザーﾏｲﾅｽ側
;                       
    LIST        P=PIC12C509A
    INCLUDE    "P12C509A.INC"
;
    __CONFIG   _WDT_ON & _MCLRE_OFF & _IntRC_OSC
;
;----------------------
; Data Define
;----------------------
    CBLOCK  H'0C'           ;H0Cから汎用レジスタに割付
        C_TIM1              ;遅延タイマカウンタ
        C_TIM2              ;遅延タイマカウンタ
        C_IN                ;入力信号用カウンタ
        C_NON1              ;入力信号なし用カウンタ
        C_NON2              ;入力信号なし用カウンタ
    ENDC                    ;割付終了
;======================================================
;  Start program
;======================================================
;START
        ORG     H'00'       ;0番地スタート
        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
        CALL    TIME100ms   ;100ms
        CALL    TIME100ms   ;100ms
        RETLW   0           ;
;----------------------
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
        ; ----- 初期設定 -----
        BCF     STATUS,PA0  ;Program Page = 0
        MOVLW   B'11011110' ;弱プルアップなし
        OPTION              ;WDTのTimeOutは18ms*64=1.152秒
        MOVLW   B'00001000' ;GP3入力 GP0/1/2/4/5出力
        TRIS    GPIO        ;入力出力モードを設定
;
        ; ----- 初期クリア -----
        CLRF    GPIO        ;各ピンを0クリア
        CLRF    C_TIM1      ;遅延タイマカウンタ
        CLRF    C_TIM2      ;遅延タイマカウンタ
        CLRF    C_IN        ;入力信号用カウンタ
        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
        ;-----  ブザーを鳴らす -----
        CALL    BEEPloop    ;ブザーを鳴す
P200
        GOTO    PROC
;----------------------
P999
;----------------------
        END

