;******************************** ; Normal Control ; PIC12F635 ; 2019/2/12 ;******************************** #include P12F635.INC ; IC12F635用のヘッダファイルの読み込み ; コンフィグレジスタの設定 ; __CONFIG & _WDT_OFF & _MCLRE_OFF & _BOD_ON & _OSC_INTOSCIO ; Configuration Bit 欄にて設定のこと。 org 0 ; ファイルレジスタの割り当て CT_DELAY3MS equ 0x40 CT_DELAY600MS equ 0x41 ; 初期設定の始まり bcf STATUS, RP0 ; バンク0 clrf GPIO ; GPIO の出力が0になるよう設定 movlw 0x7 ; W ← 7 movwf CMCON0 ; CMCON0 ← W = 7 : コンパレータをオフ bsf STATUS, RP0 ; バンク1 movlw B'101000' ; W ← '101000' movwf TRISIO ; TRISIO ← W : GPIO を出力に設定 bcf STATUS, RP0 ; バンク0 bcf GPIO,0 ;信号赤を消灯 bcf GPIO,1 ;信号橙を消灯 bsf GPIO,2 ;信号緑を点灯 ; プログラムの主要部分 LOOP bcf GPIO,0 ;信号赤を消灯 bcf GPIO,1 ;信号橙を消灯 bsf GPIO,2 ;信号緑を点灯 bcf GPIO,4 ;リレーをOFFして通電する btfsc GPIO,3 ;S2をチェック goto STAGE4 btfss GPIO,5 ;S1をチェック、ONを待つ goto $-3 call delay3ms btfss GPIO,5 ;S1をチェック、ONを待つ goto $-6 STAGE2 call delay600ms ;列車が来た、時間待ち bcf GPIO,2 ;信号緑を消す bcf GPIO,1 ;信号橙を消灯 bsf GPIO,0 ;信号赤を点灯 btfsc GPIO,5 ;S!をチェック、OFFを待つ goto $-1 call delay3ms btfsc GPIO,5 ;S!をチェック、OFFを待つ goto $-4 call delay600ms ;列車が通過した、時間待ち STAGE3 ;チェックポイント通過 btfsc GPIO,5 ;S1をチェック、後続の列車は来ていないか? goto STAGE6 ;列車を停止させる btfss GPIO,3 ;S2をチェック、前方のチェックポイントに来たか? goto STAGE3 ;来るまで待て STAGE4 ;前方のチェックポイントに来た bcf GPIO,0 ;赤を消灯 bcf GPIO,2 ;緑を消灯 bsf GPIO,1 ;橙を点灯 STAGE5 btfsc GPIO,5 ;S1をチェック、後続の列車は来ていないか? goto STAGE7 ;列車を停止させる call delay3ms btfsc GPIO,3 ;S2をチェック、前方のチェックポイントを通過したか? goto STAGE5 ;通り過ぎるまで待て call delay600ms goto LOOP ;先頭に戻る STAGE6 bsf GPIO,4 ;リレーをONさせて通電を切り列車を止める btfss GPIO,3 ;S2をチェック、前方のチェックポイントに来たか? goto $-1 call delay3ms btfss GPIO,3 ;S2をチェック、前方のチェックポイントに来たか? goto $-4 bcf GPIO,0 ;赤を消灯 bcf GPIO,2 ;緑を消灯 bsf GPIO,1 ;橙を点灯 STAGE8 btfsc GPIO,3 ;S2をチェック、前方のチェックポイントを通過したか? goto $-1 call delay3ms btfsc GPIO,3 ;S2をチェック、前方のチェックポイントを通過したか? goto $-4 bcf GPIO,0 ;信号赤を消灯 bcf GPIO,1 ;信号橙を消灯 bsf GPIO,2 ;信号緑を点灯 bcf GPIO,4 ;リレーをOFFして通電し、列車を発車させる goto STAGE2 ;列車は次の区間を走行中 STAGE7 bsf GPIO,4 ;リレーをONさせて通電を切り列車を止める goto STAGE8 ;列車停止中 ; delay10us サブルーチン delay10us goto $+1 goto $+1 goto $+1 goto $+1 goto $+1 goto $+1 goto $+1 goto $+1 return ; delay3ms サブルーチン delay3ms movlw D'250' movwf CT_DELAY3MS delay3msL call delay10us decfsz CT_DELAY3MS, f goto delay3msL goto $+1 goto $+1 goto $+1 goto $+1 goto $+1 goto $+1 goto $+1 goto $+1 return ; delay600ms サブルーチン delay600ms movlw D'200' movwf CT_DELAY600MS delay600msL call delay3ms decfsz CT_DELAY600MS, f goto delay600msL return ; プログラムの主要な部分の終わり end ; プログラム終了