#include P12F683.INC ; PIC12F683用のヘッダファイルの読み込み ;;;;; コンフィグレジスタの設定 __config _BOD_ON & _WDT_OFF & _MCLRE_OFF & _INTOSCIO ;;;;; ファイルレジスタの割り当て CT_DELAY3MS equ 0x20 CT_DELAY600MS equ 0x21 CT_DELAY3S equ 0x22 ;;;;; 初期設定の始まり bcf STATUS, RP0 ; バンク0 clrf GPIO ; GPIO の出力が0になるよう設定 movlw 0x7 ; W ← 7 movwf CMCON0 ; CMCON0 ← W = 7 : コンパレータをオフ bsf STATUS, RP0 ; バンク1 clrf ANSEL ; ANSEL ← 0 : A/Dコンバータをオフ 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 ;通電をチェック goto STAGE3 ;通電がストップされている call delay3ms ;通電されている btfss GPIO,5 ;S!をチェック、ONを待つ goto $-4 ;信号変化待ち call delay600ms ;列車が来た、時間待ち bcf GPIO,2 ;信号緑を消す bsf GPIO,0 ;信号赤を点灯 btfsc GPIO,5 ;S!をチェック、OFFを待つ goto $-1 call delay3ms btfsc GPIO,5 ;S!をチェック、OFFを待つ goto $-4 bcf GPIO,0 ;赤を消灯 bcf GPIO,2 ;緑を消灯 bsf GPIO,1 ;橙を点灯 STAGE1 ;カウンタをセット movlw D'50' movwf CT_DELAY3S STAGE2 call delay60ms btfsc GPIO,5 ;S1をチェック、後続の列車は来ていないか? bsf GPIO,4 ;リレーをONさせて通電を切り列車を止める decfsz CT_DELAY3S, f goto STAGE2 ;ゼロになるまで待て goto LOOP ;先頭に戻る STAGE3 ;通電がストップされている call delay3ms bcf GPIO,0 ;赤を消灯 bcf GPIO,2 ;緑を消灯 bsf GPIO,1 ;橙を点灯 STAGE4 ;先方の通電開始を待つ btfss GPIO,3 ;S2をチェック goto LOOP ;通電された call delay3ms btfss GPIO,5 ;S1をチェック、後続の列車は来ていないか? goto STAGE4 ;信号変化待ち call delay3ms btfss GPIO,5 ;S1をチェック、後続の列車は来ていないか? goto STAGE4 ;信号変化待ち bsf GPIO,4 ;リレーをONさせて通電を切り列車を止める bcf GPIO,2 ;信号緑を消す bcf GPIO,1 ;信号橙を消す bsf GPIO,0 ;信号赤を点灯 goto STAGE4 ;先方の通電開始を待つ ;;;;; 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 ;;;;; delay60ms サブルーチン delay60ms movlw D'20' movwf CT_DELAY600MS delay60msL call delay3ms decfsz CT_DELAY600MS, f goto delay60msL return ;;;;; プログラムの主要な部分の終わり end ; プログラム終了