;************************************************** ;*** ハザード点灯  '00.9.6 *** ;************************************************** include f:\PICPROG\MPASM\p12c509.inc ;----- FUSES -------------------; ; Internal RC(4MHz) ; ; Reset Enabled ; ; WDT Enabled ; ; ;----- RAM ---------------------; wait equ 07 ;遅延用RAM1 kaisuu equ 08 ;ロック動作回数 loop_h equ 09 ;loop用RAM loop_l equ 0a ;max 16bit kakutei equ 0b ;動作確定用 ; ;----- I/O ---------------------; lock equ 00 ;ロック信号入力(ウェイクアップ)) un_lock equ 01 ;アンロック信号(ウェイクアップ) spare_1 equ 02 ;空きピン(入力) _mclr equ 03 ;リセット入力 acc equ 04 ;アクセサリー信号入力 haz equ 05 ;リレー出力 ; ;************************************************************************ ;******************************** ; 初期設定 * ;******************************** ; movlw b'01001111' ;変化によるウエークアップ(0,1,3) option ;WDT 1:128 ; movlw b'00011111' ;1=in 0=out tris gpio ; clrf gpio ;出力クリア ; btfsc gpio,acc ;accをチェック sleep ;Hならsleep ; ;************************************************************************* ; ロック信号確認 in_sig clrf gpio ;出力クリア ; btfsc gpio,lock ; goto a_lock ;ロック信号あればjp ; btfsc gpio,un_lock ; goto a_un_l ;アンロック信号あればjp ; sleep ;信号なければsleep ;*************************************************** a_lock ; movlw h'01' ;タイムオーバー500mSをセット movwf loop_h ; movlw h'f4' ; movwf loop_l ; ; a_l0 movlw d'50' ;信号確定用に50mSをセット movwf kakutei ; ; call t_over ;タイムオーバー確認 ; a_l1 call wait_1m ;1mSec Wait btfss gpio,lock ; goto a_l0 ;ロック信号Lならjp ;-------------------------------; decfsz kakutei,f ;ロック信号Hなら-1 goto a_l1 ;再確認へ戻る ;-------------------------------; bsf gpio,haz ; ; movlw h'07' ;1900mS movwf loop_h ; movlw h'6c' ; movwf loop_l ; ; a_l2 btfsc gpio,un_lock ; goto in_sig ; ; call wait_1m ; call t_over ; goto a_l2 ; ; ;*************************************************** a_un_l ; movlw h'01' ;500mS movwf loop_h ; movlw h'f4' ; movwf loop_l ; ; a_un0 movlw d'50' ; movwf kakutei ; ; call t_over ; ; a_un1 call wait_1m ; btfss gpio,un_lock ; goto a_un0 ; ;-------------------------------; decfsz kakutei,f ; goto a_un1 ; ;-------------------------------; bsf gpio,haz ; ; movlw h'01' ;500mS movwf loop_h ; movlw h'f4' ; movwf loop_l ; ; a_un2 btfsc gpio,lock ; goto in_sig ; ; call wait_1m ; call t_over ;sleepで終了 goto a_un2 ; ; ;************************************************************************* ;**************************************************************** ;[タイムオーバーチェック] ; * t_over ; * clrwdt ;WDTクリア * movf loop_l,w ;loop_lがゼロかチェック * btfsc status,z ; * decf loop_h,f ;loop_lがゼロならloop_hを-1 * decf loop_l,f ;loop_lを-1 * ; * movf loop_l,w ; * iorwf loop_h,w ;loop_hとloop_lをor * btfss status,z ;タイムオーバーかチェック * return ;違えば戻る * ; * ;----タイムオーバー処理---------; * clrf gpio ;リレーをOFF * sleep ;スリープ * ;**************************************************************** ;******************************************************** ;[遅延ルーチン 約1mSec] ; * wait_1m ; * movlw d'249' ; 1 * movwf wait ; 1 * nop ; 1 * ; * wa1 nop ; 1*249 * decfsz wait,f ; 1*(249-1)+2 * goto wa1 ; 2*(249-1) * ; * return ; 2 * ;******************************************************** end